Information | |
---|---|
Document Owner | Maxime CARON |
Creation Date | 2024/05/17 |
Last Update Date | 2024/06/06 |
Document Name | Technical Specifications - Adopte un Candidat [Team 3] |
Version n° | Author | Date | Description of edits |
---|---|---|---|
0.01 | Maxime CARON | 2024/05/15 | Initial Version with plan and basics |
0.02 | Maxime CARON | 2024/05/21 | Added the first part of the document |
0.10 | Maxime CARON | 2024/05/29 | Added the last part of the document, missing spellcheck |
1.0 | Maxime CARON | 2024/06/03 | First finished version |
1.01 | Maxime CARON | 2024/06/04 | Corrected version |
1.02 | Maxime CARON | 2024/06/06 | Rework of the data privacy part |
Click to expand
- Technical Specifications - Adopte un Candidat [Team 3]
- Document Control
- Table of Contents
- I. Introduction
- II. Technology Presentation
- III. Technical Specification
Term | Definition | Source |
---|---|---|
Android | The operating system developed by Google for mobile devices such as smartphones and tablets. | Android |
API | Application Programming Interface - a set of rules and protocols for building and interacting with software applications. | TechTerms |
Dart | The programming language used for building applications in the Flutter framework. | Dart |
Database | A structured collection of data stored electronically in a computer system. | Techopedia |
Drop-down Menu | A graphical control element, typically a list of items that appear below a selected item when activated, allowing the user to choose from among predefined options. | TechTerms |
Firebase | A mobile and web application development platform developed by Firebase, Inc. It provides a variety of services such as real-time database, authentication, hosting, etc. | Firebase |
Flutter | A UI toolkit developed by Google for building natively compiled applications for mobile, web, and desktop from a single codebase. | Flutter |
Framework | A software framework providing a foundation on which software developers can build and deploy applications. | Techopedia |
GDPR | General Data Protection Regulation - a regulation in EU law on data protection and privacy in the European Union and the European Economic Area. | Wikipedia |
Integration Testing | Testing conducted to evaluate the integration or interaction between different components or systems of an application. | Techopedia |
iOS | The operating system developed by Apple Inc. for its mobile devices like iPhone and iPad. | Apple |
Main Skills | Core skills or competencies essential for a particular job or role. | Personal knowledge |
Matching | The process of pairing or connecting two entities based on predefined criteria. | Personal knowledge |
Mock Library | A library or tool used in software development to create mock objects or simulate behaviors for testing purposes. | Flutter |
Navbar | A navigation bar, typically found at the top of a website or application interface, providing links to different sections or pages. | Techopedia |
Page | A screen or view in a mobile or web application where content is displayed. | Personal knowledge |
Packages | Collections of code and resources in Dart programming language, used to implement specific functionality in Flutter applications. | Dart Packages |
Side Skills | Additional or supplementary skills that complement main skills. | Personal knowledge |
Snake Case | A naming convention in which words are written together and separated by underscores, often used in variable and function names. | Wikipedia |
Tinder | A popular dating application known for its swiping-based user interface to match with other users. | Tinder |
We Are Evolution | A company that helps recruiters and jobseekers meet. | Personal knowledge |
Widget | A basic building block of Flutter UI, representing a visual component such as a button, text input, etc. | Flutter Widgets |
The purpose of this document is to expand upon the functional specifications by defining the features, scope, and objectives of the project. It provides detailed explanations of how each feature works and serves as a comprehensive guide for the development team and other team members who need an in-depth understanding of the application.
It is highly recommended to read the Functional Specifications before proceeding with this document.
This document serves as a reference for the development team to understand the technical requirements of the project, ensuring that the project is developed in alignment with the specified guidelines.
Additionally, it provides resources on coding conventions, database structure, graphic standards, and other aspects crucial to the maintainability and scalability of the application.
The ultimate goal is to provide We Are Evolution, the client of the project, with a clear understanding of how the application functions and how it can be further developed and maintained.
The project is a mobile and web application that aims to connect job seekers with companies. The application is designed to be similar to "Tinder," where job seekers and companies can swipe on each other to match. The application will also include a chat feature to allow matched users to communicate.
This application will be developed for We Are Evolution, with the primary requirement being to use Flutter and create a "Tinder"-like application.
As the client has given us considerable freedom in the application design and features, we decided to create an application that is innovative and engaging. Most job-seeking applications are boring, have a cold design, and are not user-friendly. We aim to create a fun and easy-to-use application that will make the job-seeking process more enjoyable.
Our main goal is to create a Flutter application that allows job seekers and companies to match with each other. The usage of Flutter allows us to export the project as a web application after the mobile application is done.
The application will have two distinct sides:
- The company side, where companies can create a profile, set their preferences, add job offers, and swipe on job seekers.
- The job seeker side, where job seekers can create a profile, set their preferences, and swipe on companies.
- Account settings: Job seekers and companies can change their account settings.
- Algorithm: The application must include a matching algorithm to match job seekers and companies.
The company side will have the following features:
- Profile: Companies can create a profile with the ability to manage various job offers they have.
- Swipe Area: Companies can swipe on job seekers.
- Chat: Companies can chat with job seekers they are matched with and differentiate them through the job offers they have matched with.
The job seeker side will have the following features:
- Profile: Job seekers can create a profile with various fields to personalize their profile.
- Swipe Area: Job seekers can swipe on companies.
- Chat: Job seekers can chat with companies they are matched with.
The first version of the application will not contain all the features we would like to implement. Here are some of the features we would like to add in the future:
- An API to allow the application to interact with a database.
- Email verification to ensure that every user is a real person.
- Tests to ensure that every information given by the user is correct like testing if the company is real or if the job seeker is a real person.
- Testing job seekers' skills to ensure that they are qualified for the job they are applying for.
We are assuming that the application will be used by real companies and adult job seekers. We are also assuming that the application will be used professionally and that the users will not use the chat feature to send inappropriate messages.
For this project, it's mandatory to use Flutter. Flutter is an open-source UI software development kit created by Google. It is used to develop applications for Android, iOS, Linux, Mac, Windows, Google Fuchsia, and the web from a single codebase.
We will use Flutter to create the mobile application for We Are Evolution. Flutter is a great tool for creating mobile applications as it allows the creation of a single codebase for both Android and iOS applications. It also allows the creation of beautiful and responsive applications.
To create the application, we will need to use some packages.
flutter/material.dart
: The Flutter material package provides a set of widgets that implement the Material Design guidelines. These widgets are used to create the user interface of the application.firebase_core/firebase_core.dart
: The Firebase Core package provides the core functionality of Firebase services. It is used to initialize Firebase in the application.firebase_database/firebase_database.dart
: The Firebase Database package provides access to the Firebase Realtime Database. It is used to interact with the database in the application.firebase_auth/firebase_auth.dart
: The Firebase Auth package provides access to Firebase Authentication. It is used to authenticate users in the application.go_router/go_router.dart
: The Go Router package provides a declarative router for Flutter applications. It is used to manage the navigation in the application.google_fonts/google_fonts.dart
: The Google Fonts package provides access to Google Fonts. It is used to load custom fonts in the application.package:geolocator/geolocator.dart
: The Geolocator package provides access to the device's location. It is used to get the user's location in the application.
flutter_observatory
: A package that provides a testing framework for Flutter applications.mockito
: A package that provides a mock library for Dart.flutter_test
: A package that provides unit testing for Flutter applications.flutter_driver
: A package that provides integration testing for Flutter applications.widget_tester
: A package that provides widget testing for Flutter applications.
To work on the project, we will need to have a suitable working environment. Here is the working environment we will use:
- Flutter SDK: The Flutter SDK is the software development kit that allows us to create Flutter applications. We will use the latest version of the Flutter SDK which is currently 3.22.1 (the version may change during the development process to ensure compatibility with the latest features and updates).
- Visual Studio Code: Visual Studio Code is the integrated development environment that allows us to create Flutter applications (current version 1.89.1). We will use Visual Studio Code to write the code for the application and to run the application on various devices
- Android Studio: Android Studio is the integrated development environment that allows us to create Android applications (current version Jellyfish 2023.3.1). We will use Android Studio to create various virtual devices to test the application.
For a complete installation guide, please refer to the Flutter documentation. Or follow the following video tutorials:
Firebase is a comprehensive app development platform by Google that provides a variety of tools and services to help developers build high-quality applications quickly. It offers backend services such as real-time databases, authentication, crash reporting, analytics, cloud storage, and hosting, among others.
- Real-time Database: Firebase Realtime Database stores and syncs data in real-time across all clients. This is particularly useful for applications that require frequent updates, such as chat apps or collaborative tools.
- Authentication: Firebase Authentication provides easy-to-use SDKs and backend services to authenticate users with passwords, phone numbers, and popular federated identity providers like Google, Facebook, and Twitter.
Firebase integrates seamlessly with your existing working environment, whether you are developing for mobile (iOS, Android) or web applications. Here’s a brief overview of setting up and working with Firebase:
- Project Setup:
- Sign into Firebase using a Google account.
- Notice: that you need to accept the Firebase terms and conditions before proceeding (here).
- Install Firebase CLI to manage your Firebase projects from the command line (more details here).
- Notice: that it is easier for later use to install it with npm:
npm install -g firebase-tools
.
- Notice: that it is easier for later use to install it with npm:
- Login to Firebase CLI using
firebase login
.- Notice: that you don't need to do it if you haven’t already during the installation process.
- Install FlutterFire CLI by running
flutter pub global activate flutterfire_cli
in your terminal.- More details here.
- Configure your app to use Firebase by running
flutterfire configure
in a terminal in your project directory.- Notice: that you may need to restart your computer before running this to ensure that your PATH variables are up-to-date.
- From your Flutter project directory, install the core plugin by running
flutter pub add firebase_core
. - From your Flutter project directory, ensure that your Flutter app's Firebase configuration is up-to-date by running
flutterfire configure
. - In your lib/main.dart file, import the Firebase core plugin and the configuration file you generated earlier:
import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart';
- Also in your lib/main.dart file, initialize Firebase using the DefaultFirebaseOptions object exported by the configuration file:
await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, );
- Run your app to ensure that Firebase is correctly initialized.
Complete installation and setup instructions can be found in the Firebase documentation.
The minimum required version for Android is 10.0 (API level 29) or higher. This requirement ensures compatibility with the majority of modern Android devices, providing better performance, security features, and access to the latest APIs. Android 10.0 introduced several important features, including:
- Privacy Enhancements: Improved privacy controls, such as restricting access to location data when apps are running in the background.
- Gesture Navigation: A new gesture-based navigation system for a more intuitive user experience.
- Dark Theme: System-wide dark theme support to reduce eye strain and save battery life.
- Smart Replies and Actions: Enhanced machine learning for predictive responses and suggested actions.
The minimum required version for iOS is 11.0 or higher. This requirement ensures that users benefit from enhanced functionality, security updates, and performance improvements. iOS 11 introduced several key features, including:
- ARKit: Augmented Reality (AR) capabilities for creating immersive app experiences.
- Core ML: A machine learning framework for integrating intelligent features into apps.
- Files App: A new file management system for better organization and access to documents.
- Drag and Drop: Enhanced multitasking with drag-and-drop functionality across apps.
- Updated Control Center: A customizable control center for quicker access to frequently used settings.
The project's folder structure provides a foundational framework for organizing code files. While it may evolve, the initial structure serves as a solid starting point:
lib/
├── main.dart
├── firestore/
│ ├── firebase_options.dart
├── models/
│ ├── users.dart
│ ├── matches.dart
│ ├── messages.dart
├── services/
│ ├── authentication/
│ │ ├── exceptions/
│ │ │ ├── signup _email_password_failure.dart
│ │ ├── signup/
│ │ │ ├── signup_controller.dart
│ │ ├── user_Services.dart
├── widgets/
│ ├── buttons/
│ │ ├── text_button.dart
│ │ ├── icon_button.dart
│ ├── fields/
│ │ ├── text_field.dart
│ │ ├── localization_field.dart
│ │ ├── tag_field.dart
│ ├── cards/
│ │ ├── swipe_card.dart
│ │ ├── chat_card.dart
│ ├── lists/
│ │ ├── clickable_list.dart
| ├── navbar/
│ │ ├── navbar.dart
| ├── logo/
│ │ ├── logo.dart
├── pages/
│ ├── log_in.dart
│ ├── sign_up.dart
│ ├── company/
│ │ ├── profile.dart
│ │ ├── settings.dart
│ │ ├── swap_area.dart
│ │ ├── chat.dart
│ ├── job_seeker/
│ │ ├── profile.dart
│ │ ├── settings.dart
│ │ ├── swap_area.dart
│ │ ├── chat.dart
├── main.dart
├── routes.dart
This structured layout facilitates code organization and enhances project maintainability.
To maintain consistency and make it easier to navigate through the code, we will use the same naming conventions as those used by default in Flutter. We will use snake_case for files and folder names. This will make it easier to read and understand the code.
models/
: This folder will contain all the models used in the application. Each model will be in a separate file.services/
: This folder will contain all the services used in the application. Each service will be in a separate file.widgets/
: This folder will contain all the widgets used in the application. Each widget will be in a separate file.pages/
: This folder will contain all the pages used in the application. Each page will be in a separate file.
Effective comments provide insights into the purpose and functionality of code segments. We adhere to clear commenting conventions to aid understanding and collaboration:
At the beginning of each file, a concise comment provides an overview of its contents and purpose:
Example:
// User model: Contains user-related data and functionality.
Throughout the codebase, comments elucidate logic, function purpose, parameters, and return values, fostering comprehension and ease of maintenance:
Example:
Before a function:
// Adds two numbers and returns the result.
// Parameters:
// - num1: The first number.
// - num2: The second number.
// Returns: The sum of num1 and num2.
int add(int num1, int num2) {
return num1 + num2;
}
Inside a function:
// Check if the user is authenticated.
if (isAuthenticated) {
// If the user is authenticated, show the home page.
showHomePage();
} else {
// If the user is not authenticated, show the login page.
showLoginPage();
}
Structured code enhances readability and maintainability. We employ consistent indentation, spacing, and naming conventions:
We use 2-space indentation to ensure clear code hierarchy and readability:
Example:
void main() {
print('Hello, World!');
}
Consistent spacing around commas and operators aids code legibility:
Example:
int add(int num1, int num2) {
return num1 + num2;
}
We adopt camelCase for variable and function names, promoting clarity and consistency:
Example:
int calculateTotalPrice(int unitPrice, int quantity) {
return unitPrice * quantity;
}
The application will use Firebase Realtime Database to store and sync data in real-time across all clients. The data model will consist of the following tables:
(See a larger version here)
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the user. |
name | String (255 characters) | Name of the user. |
String (255 characters) | Email of the user. | |
password | String (255 characters) | Password of the user. |
isCompany | Boolean | Determines if the user is a company or a job seeker. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the seeker profile. |
userId | String (255 characters) | Unique identifier of the user. |
localization | String (255 characters) | Localization of the job seeker. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the offer profile. |
userId | String (255 characters) | Unique identifier of the user. |
title | String (255 characters) | Title of the job offer. |
description | text (65,535 characters) | Description of the job offer. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the match proposal. |
seekerId | long | Unique identifier of the job seeker. |
offerId | long | Unique identifier of the job offer. |
isSeekerAccepted | Boolean | Determines if the job seeker has accepted the match. |
isCompanyAccepted | Boolean | Determines if the company has accepted the match. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the skill. |
profileId | long | Unique identifier of the job seeker profile. |
skillId | long | Unique identifier of the skill. |
isOfferSkill | Boolean | Determines if the skill is for a job offer or a job seeker. |
isMainSkill | Boolean | Determines if the skill is a main skill or a side skill. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the skill. |
name | String (255 characters) | Name of the skill. |
description | text (65,535 characters) | Description of the skill. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the conversation. |
seekerId | long | Unique identifier of the job seeker. |
offerId | long | Unique identifier of the job offer. |
Field | Type | Description |
---|---|---|
id | long | Unique identifier of the message. |
conversationId | long | Unique identifier of the conversation. |
senderId | long | Unique identifier of the user who sent the message. |
content | text (65,535 characters) | Content of the message. |
The application will interact with the database at the following moments:
- Authentication: The application will use Firebase Authentication to:
- Sign in users.
- Sign out users.
- Create new user accounts.
- App Launch: Once the user is authenticated, the application will use the database to:
- Retrieve user profiles.
- Retrieve seeker profiles.
- Retrieve offer profiles.
- Profile Update: The application will use the database to:
- Update user profiles.
- Update seeker profiles.
- Update offer profiles.
- Swipe Proposals: The matching algorithm will use the database to:
- Propose job offers to job seekers.
- Propose job seekers to companies.
- Chat: The application will use the database to:
- Create conversations.
- Send messages.
- Retrieve messages.
The application will communicate with the database using the Firebase Realtime Database API. The API will be used to:
- Read data from the database.
- Write data to the database.
- Update data in the database.
- Delete data from the database.
- Listen for changes in the database.
Reading example:
// Read data from the database.
final database = FirebaseDatabase.instance;
final reference = database.reference();
reference.once().then((DataSnapshot snapshot) {
print('Data: ${snapshot.value}');
});
Writing example:
// Write data to the database.
final database = FirebaseDatabase.instance;
final reference = database.reference();
reference.set({
'name': 'Alice',
'age': 30,
});
Updating example:
// Update data in the database.
final database = FirebaseDatabase.instance;
final reference = database.reference();
reference.update({
'name': 'Alice',
'age': 31,
});
Deleting example:
// Delete data from the database.
final database = FirebaseDatabase.instance;
final reference = database.reference();
reference.remove();
Listening example:
// Listen for changes in the database.
final database = FirebaseDatabase.instance;
final reference = database.reference();
reference.onValue.listen((event) {
print('Data: ${event.snapshot.value}');
});
The project is currently a proof of concept for a company, which is why we are using Firebase as a prototype database. In the future, the company will be free to use any other database with any other API to meet the evolving requirements of the application.
Some data will be stored locally to improve the user experience and reduce the number of requests to the database. The data that will be stored locally is the user's data, the user's profile, the user's localization, the user's skills, the user's matches, and the user's conversations.
The data will be stored locally using the shared_preferences package. The shared_preferences package provides a persistent store for simple data. Data is persisted to disk automatically and asynchronously.
The data will be stored locally when the user logs in and will be updated when the user's data is updated in the database. The data will be used to display the user's profile, the user's localization, the user's skills, the user's matches, and the user's conversations in the application.
The data will be stored locally in the following the same structure as in the database.
To use the shared_preferences package, you need to install it in your Flutter project with the following command:
flutter pub add shared_preferences
After adding the package, you need to import it in your Dart file:
import 'package:shared_preferences/shared_preferences.dart';
To store data locally, you can use the following code:
// Store data locally.
final preferences = await SharedPreferences.getInstance();
preferences.setString('name', 'Alice');
preferences.setInt('age', 30);
For the various elements of the application, the chosen typographies are the following:
Font name | Name | Weight | Size | Google font link |
---|---|---|---|---|
Josefin sans | JS-R-20 | Regular | 20 | Josefin Sans |
Josefin sans | JS-R-16 | Regular | 16 | Josefin Sans |
Josefin sans | JS-SB-16 | Semi Bold | 16 | Josefin Sans |
Josefin sans | JS-I-16 | Italic | 16 | Josefin Sans |
Josefin sans | JS-R-12 | Regular | 12 | Josefin Sans |
To use the Google font package, you can run the following command in your terminal:
flutter pub add google_fonts
After adding the package, each time you need to specify the font import it in your Dart file:
import 'package:google_fonts/google_fonts.dart';
Text(
'Hello, World!',
style: GoogleFonts.josefinSans(
fontSize: 20,
fontWeight: FontWeight.normal,
),
)
Description:
A text field is a field where the user enters text. It is used to collect or show information.
Example of Visual Representation:
Editable Properties:
Property | Description | Required |
---|---|---|
Required/Optional | The text field is set as mandatory for the user to fill out or optional. | Yes |
Read-only/Editable | The text field is read-only or editable. | Yes |
Maximum Length | The text field restricts the number of characters entered to a maximum limit. | Yes |
Label | The text field is accompanied by a label that describes its purpose. | No |
Helper Text | The text field includes helper text that provides additional guidance to the user. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Is Email | The text field is used to collect an email address, it will show an error if the email is not valid. | No |
Is Oobscure | The text field is used to collect a password, it will hide the password and require a minimum length(8 characters). | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the field. | 300px |
Minimum Height | The minimum height of the field. | 50px |
Border Radius | The border radius of the field. | 10px |
Minimum Length | The minimum number of characters that can be entered in the field. | 0 |
Description:
A localization field is a field where the user enters a localization. It also contains a button to automatically set the localization. It is used to collect or show localizations.
Example of Visual Representation:
Properties:
Property | Description | Required |
---|---|---|
Required/Optional | The localization field is set as mandatory for the user to fill out or optional. | Yes |
Read-Only/Editable | The localization field is read-only (not editable) or editable. | Yes |
Button | The localization field contains a button to automatically set the localization. | No |
Label | The localization field is accompanied by a label that describes its purpose. | No |
Helper Text | The localization field includes helper text that provides additional guidance to the user. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the field. | 300px |
Minimum Height | The minimum height of the field. | 50px |
Border Radius | The border radius of the field. | 10px |
Minimum Length | The minimum number of characters that can be entered in the field. | 0 |
Description:
A tag field is a field where the user selects tags. It is used to collect or show tags.
Example of Visual Representation:
Read-only Tag Field:
Tag _Field when the user wants to add a new tag:
Properties:
Property | Description | Required |
---|---|---|
Required/Optional | The tag field is set as mandatory for the user to fill out or optional. | Yes |
Read-Only/Editable | The tag field is read-only (not editable) or editable. | Yes |
Maximum Number | The tag field restricts the number of tags that can be selected to a maximum limit. | Yes |
Minimum Number | The tag field enforces a minimum number of tags that must be selected. | No |
Add Button | The tag field contains an "Add" button to add new tags. | No |
Remove Button | The tag field contains a "Remove" button to remove tags. | No |
Label | The tag field is accompanied by a label that describes its purpose. | No |
Helper Text | The tag field includes helper text that provides additional guidance to the user. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the field. | 300px |
Minimum Height | The minimum height of the field. | 100px |
Border Radius | The border radius of the field. | 10px |
Description:
A select field is a field where the user selects an option from a list of options. It is used to collect or show a single option.
Example of Visual Representation:
Select Field:
Select Field with selection dropdown:
Properties:
Property | Description | Required |
---|---|---|
Options | The list of options the user can select from. | Yes |
Selected | The option selected by default. | Yes |
On Change | The action triggered when the selected option changes. | No |
Disabled | Disables the select field to prevent user interaction. | No |
Can Search | The select field allows the user to search for options. | No |
Can Add | The select field allows the user to add new options. | No |
Label | The select field is accompanied by a label that describes its purpose. | No |
Helper Text | The select field includes helper text that provides additional guidance to the user. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the field. | 300px |
Minimum Weight | The minimum height of the field. | 50px |
Border Radius | The border radius of the field. | 10px |
Description:
A text button is a button that contains text. It is used to trigger an action when clicked.
Example of Visual Representation:
Properties:
Property | Description | Required |
---|---|---|
Text | The text displayed on the button. | Yes |
Color | The color of the button. | Yes |
Size | The size of the button. | Yes |
On Click | The action is triggered when the button is clicked. | Yes |
Disabled | Disables the button to prevent user interaction. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the button. | 50px |
Minimum Height | The minimum height of the button. | 50px |
Border Radius | The border radius of the button. | 10px |
Minimum Length | The minimum number of characters that can be entered in the button. | 0 |
Description:
An icon button is a button that contains an icon. It is used to trigger an action when clicked.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
Icon | The icon displayed on the button. | Yes |
Color | The color of the button. | Yes |
Size | The size of the button. | Yes |
On Click | The action is triggered when the button is clicked. | Yes |
Disabled | Disables the button to prevent user interaction. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the button. | 50px |
Minimum Height | The minimum height of the button. | 50px |
Border Radius | The border radius of the button. | 10px |
Description:
A radio button is a button that allows the user to select one option from a list of options. It is used to select a single option from a list of options.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
Options | The list of options the user can select from. | Yes |
Selected | The option selected by default. | Yes |
On Change | The action is triggered when the selected option changes. | Yes |
Disabled | Disables the radio button to prevent user interaction. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum width | The minimum width of the button. | 30px |
Minimum height | The minimum height of the button. | 30px |
Description:
A big button is sized as a text field or bigger, containing text and/or an icon. It is used to trigger an action when clicked.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
Text | The text displayed on the button. | Yes |
Icon | The icon is displayed on the button. | No |
Text Color | The color of the text in the button. | Yes |
Color | The color of the button. | Yes |
Size | The size of the button. | Yes |
On Click | The action is triggered when the button is clicked. | Yes |
Disabled | Disables the button to prevent user interaction. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the button. | 300px |
Minimum Height | The minimum height of the button. | 50px |
Border Radius | The border radius of the button. | 10px |
Minimum Length | The minimum number of characters that can be entered in the button. | 0 |
Text Size | The size of the text in the button. | 20px |
Description:
A navbar is a bar that contains icon buttons. It is used to navigate between pages. The selected page is highlighted by a halo effect.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
Pages | The list of pages the user can select from. | Yes |
Selected | The page which is selected by default. | Yes |
On Change | The action is triggered when the selected page changes. | Yes |
Disabled | Disables the navbar to prevent user interaction. | No |
Read-only Properties:
None
Description:
A clickable list is a list where each item can be clicked. It is used to display a list of items that can be selected. The list widget also allows the user to remove items and must be scrollable to show all the items in a short space.
Example Visual of Representation:
Clickable List:
Properties:
Property | Description | Required |
---|---|---|
Items | The list of items the user can select from. | Yes |
Selected | The item selected by default. | Yes |
On Click | The action is triggered when an item is clicked. | Yes |
On Remove | The action is triggered when an item is removed. | Yes |
Editable | The list is in editing mode. | No |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the list. | 300px |
Minimum Height | The minimum height of the list. | 50px |
Border Radius | The border radius of the list. | 10px |
Description:
A swipe card is a card that contains information and can be swiped left or right. It is used to display information that can be accepted or rejected.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
Title | The title displayed on the card. | Yes |
Description | The description displayed on the card. | Yes |
Main Skills | The main skills displayed on the card. | Yes |
Side Skills | The side skills displayed on the card. | Yes |
Localization | The localization displayed on the card. | Yes |
On Accept | The action is triggered when the card is accepted. | Yes |
On Reject | The action is triggered when the card is rejected. | Yes |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the card. | 300px |
Minimum Height | The minimum height of the card. | 500px |
Border Radius | The border radius of the card. | 10px |
Description:
A chat card is a card that contains a conversation. It is used to display a conversation between two users.
Example Visual of Representation:
Properties:
Property | Description | Required |
---|---|---|
User | The user displayed on the card. | Yes |
Messages | The messages displayed on the card. | Yes |
On Click | The action is triggered when the card is clicked. | Yes |
Hover Effect | Provides a hover effect for visual feedback. | No |
Read-only Properties:
Property | Description | Default value |
---|---|---|
Minimum Width | The minimum width of the card. | 50px |
Minimum Height | The minimum height of the card. | 30px |
Border Radius | The border radius of the card. | 10px |
Description:
The login page allows users to sign in, be redirected to the subscription page if they don't have an account, and declare a forgotten password.
Capabilities:
The login page allows users to:
- Sign in.
- Be redirected to the subscription page if they don't have an account.
- Declare a forgotten password.
Fields and Elements:
The login page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
The user's email. | Text field | Editable | ||
Password | The user's password. | Text field | Editable | |
Sign in | Button to sign in. | Button | Clickable | Validate email and password, redirect user to their profile. |
Forgotten password | Button to reset password. | Button | Clickable | Send password reset email to user. |
Subscription | Button to go to subscription. | Button | Clickable | Redirect user to subscription page. |
Description:
The subscription page allows users to create an account, be redirected to the login page if they already have an account, and declare a forgotten password.
Consider that terms and conditions are not displayed on the subscription page for now because it's the role of the company to define and provide them, in conclusion for the moment the page and the system of validation are not yet implemented.
Capabilities:
The subscription page allows users to:
- Create an account.
- Be redirected to the login page if they already have an account.
Fields and Elements:
The subscription page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Name | The user's name. | Text field | Editable | |
The user's email. | Text field | Editable | ||
Password | The user's password. | Text field | Editable | |
Confirm password | Confirmation of user's password. | Text field | Editable | |
Job seeker/company | Button to choose user type. | Radio button | Clickable | Switch between job seeker and company user types. |
Subscription | Button to create account. | Button | Clickable | Validate email and password, redirect user to their profile. |
Login | Button to go to login page. | Button | Clickable | Redirect user to login page. |
Description:
The settings page allows users to change their account settings.
Capabilities:
The settings page allows users to:
- View their name and email.
- Change their password.
- Change their localization.
- Change the language of the application.
- View the terms and conditions of the application.
- Delete their account.
- Log out.
Fields and Elements:
The settings page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Name | User's name. | Text field | Read-only | |
User's email. | Text field | Read-only | ||
Change Password | Button to change password. | Button | Clickable | Send password reset email to user. |
Localization | Field to change user's localization. | Text field | Editable | |
Language | Field to change application language. | Select field | Clickable | Change application language. |
Terms and Conditions | Button to view application terms and conditions. | Button | Clickable | Show application terms and conditions. |
Delete Account | Button to delete user's account. | Button | Clickable | Delete user's account. |
Log Out | Button to log out. | Button | Clickable | Log out user. |
Back | Button to go back to profile page. | Button | Clickable | Go back to profile page. |
Description:
The job seeker profile page allows job seekers to create or edit their profiles with various fields to personalize them.
Capabilities:
The job seeker profile page allows users to:
- Create or edit their description.
- Select their main skills.
- Select their side skills.
- Access the app settings.
- Access the swipe area.
- Access the chat.
Fields and Elements:
The job seeker profile page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Description | Description of the job seeker. | Text field | Editable | |
Main skills | Main skills of the job seeker. | Tag field | Editable | |
Side skills | Side skills of the job seeker. | Tag field | Editable | |
Settings | Button to access app settings. | Button | Clickable | Redirects user to the settings page. |
Swipe area | Button to access the swipe area. | Navbar button | Clickable | Redirects user to the swipe area. |
Chat | Button to access the chat. | Navbar button | Clickable | Redirects user to the chat. |
Description:
The company profile page allows companies to create or view their offers profile with various fields to personalize it.
Capabilities:
The company profile page allows users to:
- View their offers.
- Create offers.
- Edit offers.
- Delete offers.
- Access the app settings.
- Access the swipe area.
- Access the chat.
Fields and Elements:
The company profile page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Offers | Offers of the company. | List | Clickable | Redirects user to the offer profile page. |
Create offer | Button to create an offer. | Button | Clickable | Redirects user to the offer creation page. |
Edit offer | Button to edit an offer. | Button | Clickable | Allows user to edit offers. |
Delete offer | Button to delete an offer. | Button | Clickable | Removes the offer from the list. |
Settings | Button to access app settings. | Button | Clickable | Redirects user to the settings page. |
Swipe area | Button to access the swipe area. | Navbar button | Clickable | Redirects user to the swipe area. |
Chat | Button to access the chat. | Navbar button | Clickable | Redirects user to the chat. |
Description:
The company offer edition page allows companies to create or edit their offers with various fields to personalize them.
Capabilities:
The company offer edition page allows the company to:
- Create or change the title of the offer.
- Create or change the description of the offer.
- Create or change the localization of the offer.
- Add or change the main skills of the offer.
- Add or change the side skills of the offer.
- Save the offer.
- Return to the company profile page.
Fields and Elements:
The company offers edition page containing the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Title | Title of the offer. | Text field | Editable | |
Description | Description of the offer. | Text field | Editable | |
Localization | Localization of the offer. | Text field | Editable | |
Main skills | Main skills of the offer. | Tag field | Editable | |
Side skills | Side skills of the offer. | Tag field | Editable | |
Save | Button to save the offer. | Button | Clickable | Save the offer and redirect the user to the company profile page. |
Back | Button to go back to the company profile page. | Button | Clickable | Return to the company profile page. |
Description:
The swipe area page allows users to swipe on companies or job seekers.
Capabilities:
The swipe area page allows users to:
- Swipe on companies or job seekers.
- View more information about the company or job seeker.
- Access the chat.
- Access the profile.
Fields and Elements:
The swipe area page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Swipe card | Display job offer or job seeker information. | Card | Swipable | Validate a job offer or job seeker if swiped right or reject a job offer or job seeker if swiped left. |
More information | Button to see more information about the job offer or job seeker. | Button | Clickable | Redirect the user to the job offer or job seeker profile page. |
Validate | Button to validate the job offer or job seeker. | Button | Clickable | Validate the job offer or job seeker. |
Reject | Button to reject the job offer or job seeker. | Button | Clickable | Reject the job offer or job seeker. |
Chat | Button to access the chat. | Navbar button | Clickable | Redirect the user to the chat. |
Profile | Button to access the profile. | Navbar button | Clickable | Redirect the user to the profile. |
Description:
The chat list page allows users to see all the conversations they have.
Capabilities:
The chat list page allows users to:
- View all the conversations they have.
- Access a conversation.
- Delete a conversation.
- Access the profile.
- Access the swipe area.
Fields and Elements:
The chat list page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Conversations | Conversations of the user. | List | Clickable | Redirect the user to the chat page. |
Delete conversation | Button to delete a conversation. | Button | Clickable | Delete the conversation. |
Profile | Button to access the profile. | Navbar button | Clickable | Redirect the user to the profile. |
Swipe area | Button to access the swipe area. | Navbar button | Clickable | Redirect the user to the swipe area. |
Description:
The conversation page allows users to chat with other users.
Capabilities:
The conversation page allows users to:
- Send messages.
- Receive messages.
- See previous messages.
- Access the chat list.
Fields and Elements:
The conversation page contains the following elements:
Field/Element | Description | Type | Rights | Behavior |
---|---|---|---|---|
Messages | Messages of the conversation. | List | Read-only | |
Send message | Field to send a message. | Text field | Editable | |
Send | Button to send the message. | Button | Clickable | Send the message. |
Back | Button to go back to the chat list page. | Button | Clickable | Return to the chat list page. |
To navigate between pages, the application uses a navigation package named go_router
. This package allows the application to navigate between pages with a simple and efficient API.
To install the go_router
package, the application must:
- Add the
go_router
package to thepubspec.yaml
file by running the following command:
flutter pub add go_router
- Import the package in the
router.dart
file by adding the following line:
import 'package:go_router/go_router.dart';
To set up the navigation, the application must:
- Create a
router.dart
file to define the routes of the application (refer to the folder structure for more information). - Define the routes of the application in the
router.dart
file.
Example:
import 'package:project-name/settings.dart';
import 'package:project-name/main.dart';
import 'package:go_router/go_router.dart';
final GoRouter router = GoRouter(
routes: <RouteBase>[
GoRoute(
path: '/',
name: 'home',
builder: (BuildContext context, GoRouterState state) {
return const RootPage();
},
),
GoRoute(
path: '/settings',
name: 'settings',
builder: (BuildContext context, GoRouterState state) {
return const SettingPage();
},
),
],
);
- Use the
GoRouter
widget in themain.dart
file to navigate between pages. Example:
// Short example of how to use the GoRouter widget in icon button
IconButton(
color: Colors.white,
icon: const Icon(Icons.settings, size: 40),
onPressed: () {
context.pushNamed('settings');
},
),
Read go_router documentation for more information.
The application uses Firebase Authentication to authenticate users. Firebase Authentication provides backend services, easy-to-use SDKs, and ready-made UI libraries to authenticate users to the application.
To install the Firebase Authentication package, the application must:
- Add the Firebase Authentication package to the
pubspec.yaml
file by running the following command:
flutter pub add firebase_auth
- Import the package in the
main.dart
file by adding the following line:
import 'package:firebase_auth/firebase_auth.dart';
- Initialize Firebase in your main.dart file.
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
- Example of Sign Up with email and password:
Example:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class SignUpPage extends StatefulWidget {
@override
_SignUpPageState createState() => _SignUpPageState();
}
class _SignUpPageState extends State<SignUpPage> {
final FirebaseAuth _auth = FirebaseAuth.instance;
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
Future<void> _signUp() async {
try {
await _auth.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
);
// Sign up successful
} catch (e) {
// Handle error
print(e.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Sign Up')),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _emailController,
decoration: InputDecoration(labelText: 'Email'),
),
TextField(
controller: _passwordController,
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
),
ElevatedButton(
onPressed: _signUp,
child: Text('Sign Up'),
),
],
),
),
);
}
}
- Example of Sign In with email and password:
Example:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class SignInPage extends StatefulWidget {
@override
_SignInPageState createState() => _SignInPageState();
}
class _SignInPageState extends State<SignInPage> {
final FirebaseAuth _auth = FirebaseAuth.instance;
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
Future<void> _signIn() async {
try {
await _auth.signInWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
);
// Sign in successful
} catch (e) {
// Handle error
print(e.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Sign In')),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _emailController,
decoration: InputDecoration(labelText: 'Email'),
),
TextField(
controller: _passwordController,
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
),
ElevatedButton(
onPressed: _signIn,
child: Text('Sign In'),
),
],
),
),
);
}
}
- To enable authentication providers in Firebase: go to the Firebase Console, navigate to "Authentication" and enable the desired sign-in methods (e.g., Email/Password).
- Ensure your Firestore database rules allow authenticated users to read and write data.
Update your Firestore rules as needed:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
Read Firebase Authentication documentation for more information.
The application uses the flutter_localizations
package to provide internationalization and localization support. This package provides a set of classes that define localized messages and a mechanism to retrieve them.
To install the flutter_localizations
package, the application must:
- Add the
flutter_localizations
package to thepubspec.yaml
file by running the following command:
flutter pub add flutter_localizations
flutter pub add intl:any
- Import the package in the
main.dart
file by adding the following line:
import 'package:flutter_localizations/flutter_localizations.dart';
The flutter_localizations
package provides a set of classes that define localized messages and a mechanism to retrieve them. The application can use these classes to display messages in different languages based on the user's locale.
Example:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'),
const Locale('fr', 'FR'),
],
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Localization Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
Intl.message('Hello World', name: 'helloWorld'),
),
],
),
),
);
}
}
The application uses the geolocator
package to get the user's location. This package provides a set of classes and methods to retrieve the user's location.
To install the geolocator
package, the application must:
- Add the
geolocator
package to thepubspec.yaml
file by running the following command:
flutter pub add geolocator
- Import the package in the file where the location is needed by adding the following line:
import 'package:geolocator/geolocator.dart';
The geolocator
package provides a set of classes and methods to retrieve the user's location. The application can use these classes and methods to get the user's location and display it in the application.
Example:
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePage extends State<MyHomePage> {
String _location = '';
Future<void> _getLocation() async {
Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
setState(() {
_location = 'Latitude: ${position.latitude}, Longitude: ${position.longitude}';
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Location Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_location),
ElevatedButton(
onPressed: _getLocation,
child: Text('Get Location'),
),
],
),
),
);
}
}
The matching algorithm is a core feature of the application that enables users to find the most suitable job offers or job seekers based on their skills and preferences. The algorithm utilizes a scoring system to match users with the most relevant opportunities or candidates.
The algorithm considers both primary and secondary skills possessed by companies and job seekers to calculate a matching score. The score is determined by the number of overlapping skills between the user and the job offer or job seeker.
The scoring mechanism is as follows:
- For each matching main skill, the score is increased by 1.
- For each matching side skill, the score is increased by 0.2.
- The total score is the sum of the main and side skills scores.
Once the initial score is calculated, the matching algorithm takes into account the user's location and the job offer or job seeker's location. It then adjusts the score based on the proximity between the two locations
The location-based score adjustments are:
- If the locations are in the same city, the score is increased by 1 point.
- If the locations are within the same region, the score is increased by 0.5 points.
The algorithm then matches the user with the job offer or job seeker based on the final calculated score. The results are sorted in descending order, displaying the best matches at the top. If both job offers and job seekers are matched, the application allows them to connect and communicate.
The matching algorithm also enables users to re-match with job offers or job seekers based on updated preferences. Users can adjust their criteria, and the algorithm will generate new matches accordingly.
The chat system is a key feature of the application that allows after matching, job seekers and companies to communicate and discuss potential opportunities. The chat system provides a real-time messaging experience with features such as sending messages, receiving messages, and viewing previous conversations.
The chat system uses a real-time messaging service to enable instant communication between users. The system ensures that messages are delivered and received in real-time, providing a seamless chat experience.
The chat system maintains a history of messages exchanged between users. Users can view previous conversations, scroll through messages, and refer back to important information shared during the chat.
Users can send messages to each other by typing in the chat input field and pressing the send button. The messages are displayed in real-time, allowing users to see when a message has been sent and received. The chat system also provides notifications for new messages.
This UML sequence diagram illustrates the process of sending and receiving messages in the chat system:
(See a larger version here)
User data privacy and security are paramount in the application. The system ensures that user data is protected and handled in compliance with data protection regulations. The application follows best practices to safeguard user information and maintain data privacy.
The application collects user data to match job seekers with companies and vice versa. The data collected includes user profiles, skills, preferences, and location information. The application uses this data to generate matches and facilitate communication between users.
No sensitive data, such as financial information or personal identification numbers, is stored in the application. The system only collects data necessary for matching and communication purposes.
The application collects the following data:
- User profiles: Name, email, description, skills, and preferences.
- Location information: User's location and job offer or job seeker's location.
- Chat history: Messages exchanged between users.
- Matching scores: Scores that are calculated based on skills and location.
User data is stored securely in a cloud-based database. The application uses Firebase Firestore to store user profiles, chat history, and matching scores. Firebase Firestore provides a secure and scalable solution for storing and retrieving data.
The data stored in Firebase Firestore is encrypted and protected using industry-standard security measures. Access to the database is restricted to authorized users, and data is transmitted securely over HTTPS.
User data is persisted in the database to ensure that matches and chat history are retained between sessions. The application stores user profiles, chat history, and matching scores in the database to provide a seamless user experience.
The data persistence mechanism ensures that users can access their profiles, chat with matched users, and view previous conversations even after logging out and logging back in.
Users have the right to ask to know what data is stored about them and to request the deletion of their data. The application provides users with the ability to retrieve their data and delete their accounts.
Users can access their data through the settings page, where they can view their profiles, chat history, and matching scores. Users can also delete their accounts, which will remove all data associated with their profiles from the database.
Note that according to the GDPR regulations, after a delete request, we will keep user data for a limited period of 5 years and then delete all data related to the user definitively.
User data is not shared with third parties without user consent. The application does not sell or share user data with external entities for marketing or advertising purposes. User data is used solely for matching and communication within the application.