Compare commits

..

No commits in common. 'main' and 'fatima' have entirely different histories.
main ... fatima

@ -1,93 +1,16 @@
# car_customer_app
A new Flutter project.
## Getting Started
## Getting started
This project is a starting point for a Flutter application.
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
A few resources to get you started if this is your first Flutter project:
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://gitlab.com/mirza.shafique/car_customer_app.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://gitlab.com/mirza.shafique/car_customer_app/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Automatically merge when pipeline succeeds](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/ci/quick_start/index.html)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://gitlab.com/-/experiment/new_project_readme_content:9529efb8c774508b24431e4d43ca8b4e?https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 33
compileSdkVersion 31
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@ -44,7 +44,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.car_customer_app"
minSdkVersion 20
minSdkVersion 16
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName

@ -7,7 +7,6 @@
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

@ -0,0 +1,11 @@
<svg id="Group_761" data-name="Group 761" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.545" height="22.965" viewBox="0 0 21.545 22.965">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1484" data-name="Rectangle 1484" width="21.545" height="22.965" fill="#2699fb"/>
</clipPath>
</defs>
<g id="Group_761-2" data-name="Group 761" clip-path="url(#clip-path)">
<path id="Path_663" data-name="Path 663" d="M21.3,136.849l-1.91-.49-.881.734c0-.049-1.812-4.7-1.714-4.407a1.879,1.879,0,0,0-1.567-1.175,53.565,53.565,0,0,0-8.863,0A1.857,1.857,0,0,0,4.8,132.687c0,.049-1.812,4.7-1.714,4.407l-.881-.734-1.91.49a.42.42,0,0,0-.294.343v.441a.573.573,0,0,0,.392.539l1.861.783-.245.343a2.372,2.372,0,0,0-.343,1.273v5.876a1.547,1.547,0,0,0,1.567,1.567H4.456a1.547,1.547,0,0,0,1.567-1.567v-.832h9.646v.832a1.578,1.578,0,0,0,1.567,1.567H18.46a1.547,1.547,0,0,0,1.567-1.567V140.57a2.908,2.908,0,0,0-.343-1.273l-.294-.343,1.763-.734a.573.573,0,0,0,.392-.539v-.441A.388.388,0,0,0,21.3,136.849Zm-15.718,4.6-.734,1.518a.3.3,0,0,1-.294.2H2.938a.335.335,0,0,1-.343-.343V141.3a.335.335,0,0,1,.343-.343h2.3a.345.345,0,0,1,.343.49m-1.763-3.428,1.273-3.33c.588-.049,1.567-.147,3.183-.2a61.5,61.5,0,0,1,8.226.2l1.273,3.33h-.686a2.88,2.88,0,0,0-5.68,0Zm8.667,0a1.9,1.9,0,0,1,1.861-1.42,1.939,1.939,0,0,1,1.861,1.42ZM14,143.557H7.737a.579.579,0,0,1-.539-.832l.783-1.812a.6.6,0,0,1,.539-.343h4.75a.6.6,0,0,1,.539.343l.783,1.812a.623.623,0,0,1-.588.832m5.043-.734a.335.335,0,0,1-.343.343H17.138a.331.331,0,0,1-.294-.2l-.734-1.518a.337.337,0,0,1,.294-.49h2.3a.335.335,0,0,1,.343.343Z" transform="translate(0 -125.048)" fill="#2699fb"/>
<path id="Path_664" data-name="Path 664" d="M123.925,3.085a1.986,1.986,0,0,1,2.008,2.008h3.134V4.7a.477.477,0,0,0-.392-.49l-.93-.147a5.837,5.837,0,0,0-.392-.979l.539-.734a.4.4,0,0,0-.049-.588l-.539-.588a.519.519,0,0,0-.637-.049l-.734.539a2.428,2.428,0,0,0-.979-.392l-.147-.881a.477.477,0,0,0-.49-.392h-.783a.527.527,0,0,0-.49.392l-.147.881a5.836,5.836,0,0,0-.979.392l-.734-.539a.518.518,0,0,0-.637.049l-.539.588a.513.513,0,0,0-.049.637l.539.686a2.428,2.428,0,0,0-.392.979l-.93.147a.477.477,0,0,0-.392.49v.392h3.134A2.017,2.017,0,0,1,123.925,3.085Z" transform="translate(-113.104)" fill="#2699fb"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1,4 @@
<svg id="Component_144_1" data-name="Component 144 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<rect id="Rectangle_324" data-name="Rectangle 324" width="16" height="16" fill="none"/>
<path id="Path_110" data-name="Path 110" d="M8.154,3.077,2.462,8.923,0,16l7.077-2.308L12.769,8Zm7.231-.462-2-2a1.865,1.865,0,0,0-2.769,0L8.923,2.308l4.615,4.769,1.846-1.846A1.95,1.95,0,0,0,16,3.846,1.9,1.9,0,0,0,15.385,2.615Z" fill="#2699fb"/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13.412" height="17.882" viewBox="0 0 13.412 17.882">
<path id="Path_665" data-name="Path 665" d="M11.735,7.265V5.029a5.029,5.029,0,0,0-10.059,0V7.265A1.647,1.647,0,0,0,0,8.941v7.265a1.681,1.681,0,0,0,1.676,1.676H11.735a1.681,1.681,0,0,0,1.676-1.676V8.941a1.646,1.646,0,0,0-1.676-1.676M2.794,5.029a3.912,3.912,0,0,1,7.823,0V7.265H2.794ZM7.265,13.3v1.229a.559.559,0,1,1-1.118,0V13.3a1.628,1.628,0,0,1-1.118-1.565,1.676,1.676,0,0,1,3.353,0A1.628,1.628,0,0,1,7.265,13.3" fill="#2699fb"/>
</svg>

After

Width:  |  Height:  |  Size: 540 B

@ -0,0 +1,11 @@
<svg id="Group_773" data-name="Group 773" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="19.6" height="16" viewBox="0 0 19.6 16">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1471" data-name="Rectangle 1471" width="19.6" height="16" fill="#2699fb"/>
</clipPath>
</defs>
<g id="Group_18" data-name="Group 18" clip-path="url(#clip-path)">
<path id="Path_649" data-name="Path 649" d="M8,14.8a.325.325,0,0,1-.025-.169c.008-.046-.021-.083-.087-.112s-.1-.052-.1-.069-.048-.029-.144-.037L7.5,14.4H3.6a1.925,1.925,0,0,1-1.413-.588A1.926,1.926,0,0,1,1.6,12.4V3.6a1.926,1.926,0,0,1,.587-1.412A1.926,1.926,0,0,1,3.6,1.6h4a.378.378,0,0,0,.256-.081.415.415,0,0,0,.125-.244A2.1,2.1,0,0,0,8.019.981,3.11,3.11,0,0,0,8.012.65Q8,.45,8,.4A.385.385,0,0,0,7.881.119.385.385,0,0,0,7.6,0h-4A3.468,3.468,0,0,0,1.056,1.056,3.467,3.467,0,0,0,0,3.6v8.8a3.467,3.467,0,0,0,1.056,2.544A3.467,3.467,0,0,0,3.6,16h4a.379.379,0,0,0,.256-.081.415.415,0,0,0,.125-.244,2.108,2.108,0,0,0,.038-.294,3.107,3.107,0,0,0-.006-.331Q8,14.85,8,14.8" fill="#2699fb"/>
<path id="Path_650" data-name="Path 650" d="M124.2,16.169l-6.8-6.8a.8.8,0,0,0-1.363.563v3.6h-5.6a.811.811,0,0,0-.8.8v4.8a.811.811,0,0,0,.8.8h5.6v3.6a.8.8,0,0,0,1.363.562l6.8-6.8a.785.785,0,0,0,0-1.125" transform="translate(-104.833 -8.731)" fill="#2699fb"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,10 @@
<svg id="Group_775" data-name="Group 775" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="13" height="23.853" viewBox="0 0 13 23.853">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1493" data-name="Rectangle 1493" width="13" height="23.853" fill="#2699fb"/>
</clipPath>
</defs>
<g id="Group_774" data-name="Group 774" clip-path="url(#clip-path)">
<path id="Path_689" data-name="Path 689" d="M11.306,0H1.67A1.675,1.675,0,0,0,0,1.67V22.183a1.675,1.675,0,0,0,1.67,1.67H11.33A1.675,1.675,0,0,0,13,22.183V1.67A1.7,1.7,0,0,0,11.306,0M6.488,1.312a.477.477,0,1,1-.477.477.479.479,0,0,1,.477-.477M7.919,22.541H5.057v-.954H7.919Zm4.1-2.29H.93V3.6H12.022Z" fill="#2699fb"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 745 B

@ -0,0 +1,12 @@
<svg id="Group_766" data-name="Group 766" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="15" height="16.406" viewBox="0 0 15 16.406">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1486" data-name="Rectangle 1486" width="15" height="16.406" fill="#2699fb"/>
</clipPath>
</defs>
<g id="Group_765" data-name="Group 765" clip-path="url(#clip-path)">
<path id="Path_666" data-name="Path 666" d="M2.813,6.094H13.125V.937A.938.938,0,0,0,12.187,0H.937A.937.937,0,0,0,0,.937V15a.937.937,0,0,0,.937.937H8.906V12.656H2.813a.469.469,0,0,1,0-.938H8.325a3.924,3.924,0,0,1-.356-1.641V9.844H2.813a.469.469,0,0,1,0-.938h5.33A4.013,4.013,0,0,1,9.375,7.031H2.813a.469.469,0,1,1,0-.938m0-3.75H6.094a.469.469,0,0,1,0,.937H2.813a.469.469,0,1,1,0-.937" fill="#2699fb"/>
<path id="Path_667" data-name="Path 667" d="M205.714,160a3.047,3.047,0,1,1-3.047,3.047A3.047,3.047,0,0,1,205.714,160" transform="translate(-193.761 -152.969)" fill="#2699fb"/>
<path id="Path_668" data-name="Path 668" d="M228.219,306.24a3.98,3.98,0,0,1-4.219,0v2.948l2.109-.937,2.109.938Z" transform="translate(-214.156 -292.782)" fill="#2699fb"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,4 @@
<svg id="Notifications" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<rect id="Rectangle_479" data-name="Rectangle 479" width="16" height="16" fill="none"/>
<path id="Path_1" data-name="Path 1" d="M15,14H10a2,2,0,0,1-4,0H1a.961.961,0,0,1-.9-.7,1.068,1.068,0,0,1,.3-1.1A4.026,4.026,0,0,0,2,9V6A6,6,0,0,1,14,6V9a4.026,4.026,0,0,0,1.6,3.2.947.947,0,0,1,.3,1.1A.961.961,0,0,1,15,14Z" transform="translate(-0.063)" fill="#2699fb"/>
</svg>

After

Width:  |  Height:  |  Size: 472 B

@ -0,0 +1,4 @@
<svg id="Component_147_1" data-name="Component 147 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<rect id="Rectangle_193" data-name="Rectangle 193" width="16" height="16" fill="none"/>
<path id="Path_104" data-name="Path 104" d="M267.5,10a2,2,0,1,0-2-2A2.006,2.006,0,0,0,267.5,10Zm-4.1-6.4a5.64,5.64,0,0,1,2.4-1.3l.8-2.3h2l.8,2.3a6.983,6.983,0,0,1,2.4,1.3l2.4-.5,1,1.8-1.6,1.8a5.7,5.7,0,0,1,.1,1.3c0,.4-.1.9-.1,1.3l1.6,1.8-1,1.8-2.4-.5a5.64,5.64,0,0,1-2.4,1.3l-.8,2.3h-2l-.8-2.3a6.983,6.983,0,0,1-2.4-1.3l-2.4.5-1-1.8,1.6-1.8a5.7,5.7,0,0,1-.1-1.3c0-.4.1-.9.1-1.3L260,4.9l1-1.8Z" transform="translate(-260)" fill="#2699fb"/>
</svg>

After

Width:  |  Height:  |  Size: 675 B

@ -0,0 +1,269 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:car_customer_app/exceptions/api_exception.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:http/io_client.dart';
typedef FactoryConstructor<U> = U Function(dynamic);
class APIError {
int errorCode;
String errorMessage;
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage};
@override
String toString() {
return jsonEncode(this);
}
}
APIException _throwAPIException(Response response) {
switch (response.statusCode) {
case 400:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']);
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 401:
return APIException(APIException.UNAUTHORIZED);
case 403:
return APIException(APIException.FORBIDDEN);
case 404:
return APIException(APIException.NOT_FOUND);
case 500:
return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
default:
return APIException(APIException.OTHER);
}
}
class ApiClient {
static final ApiClient _instance = ApiClient._internal();
ApiClient._internal();
factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
if (!kReleaseMode) {
print("Url:$url");
print("body:$jsonObject");
}
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
print("res121:" + response.body);
print("res121:" + response.statusCode.toString());
}
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
print(ex);
print("exception:" + ex.toString());
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
String? requestBody;
if (jsonObject != null) {
requestBody = jsonEncode(jsonObject);
if (headers == null) {
headers = {'Content-Type': 'application/json'};
} else {
headers['Content-Type'] = 'application/json';
}
}
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
}
Future<Response> _postForResponse(
String url,
requestBody, {
String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
}) async {
try {
var _headers = <String, String>{};
if (token != null) {
_headers['Authorization'] = 'Bearer $token';
}
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
if (queryParameters != null) {
var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString;
}
var response;
response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 100));
if (!kReleaseMode) {
print("Url:$url");
print("body:$requestBody");
print("res: " + response.body);
}
if (response.statusCode >= 200 && response.statusCode < 500) {
return response;
} else {
throw _throwAPIException(response);
}
} on SocketException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on HttpException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on TimeoutException catch (e) {
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
}catch (ex) {
print("exception1:" + ex.toString());
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
bool _certificateCheck(X509Certificate cert, String host, int port) => true;
Future<T> _withClient<T>(Future<T> Function(Client) fn) async {
var httpClient = HttpClient()..badCertificateCallback = _certificateCheck;
var client = IOClient(httpClient);
try {
return await fn(client);
} finally {
client.close();
}
}
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
print("res:" + response.body);
}
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
print("exception:" + response.body);
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
if (headers == null) {
headers = {'Content-Type': 'application/json'};
} else {
headers['Content-Type'] = 'application/json';
}
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
}
Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
if (token != null) {
_headers['Authorization'] = 'Bearer $token';
}
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
if (queryParameters != null) {
String queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString.toString();
}
if (!kReleaseMode) {
print("Url:$url");
print("queryParameters:$queryParameters");
}
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
if (!kReleaseMode) {
print("res: " + response.body.toString());
}
if (response.statusCode >= 200 && response.statusCode < 300) {
return response;
} else {
throw _throwAPIException(response);
}
} on SocketException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on HttpException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on TimeoutException catch (e) {
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} catch (e) {
throw APIException(APIException.OTHER, arguments: e);
}
}
Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers));
}

@ -0,0 +1,69 @@
import 'dart:async';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/profile/branch.dart';
import 'package:car_customer_app/models/profile/categroy.dart';
import 'package:car_customer_app/models/profile/document.dart';
import 'package:car_customer_app/models/profile/services.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:http/http.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import '../api_client.dart';
class BranchApiClent {
static final BranchApiClent _instance = BranchApiClent._internal();
BranchApiClent._internal();
factory BranchApiClent() => _instance;
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
var postParams = {
// "id": 0,
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName,
"branchDescription": branchDescription,
"cityID": cityId,
"address": address,
"latitude": latitude,
"longitude": longitude,
"isActive": true
};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
}
Future<Branch> fetchAllBranches() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
}
Future<Category> fetchBranchCategory() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
}
Future<Services> fetchServices(String serviceCategoryId) async {
var postParams = {"ServiceCategoryID": serviceCategoryId};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t);
}
Future<MResponse> createService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
}
}

@ -0,0 +1,52 @@
import 'dart:async';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/profile/document.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:http/http.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import '../api_client.dart';
class ProfileApiClent {
static final ProfileApiClent _instance = ProfileApiClent._internal();
ProfileApiClent._internal();
factory ProfileApiClent() => _instance;
Future<Document> getServiceProviderDocument(dynamic userId) async {
var queryParameters = {
"ServiceProviderID": userId.toString(),
};
String? token = AppState().getUser.data?.accessToken;
print(token);
return await ApiClient().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
}
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
List<Map<String, dynamic>> map = [];
for (int i = 0; i < documents!.length; i++) {
if (documents[i].document != null) {
var postParams = {
"id": documents[i].id,
"serviceProviderID": documents[i].serviceProviderId,
"documentID": documents[i].documentId,
"documentExt": documents[i].fileExt,
"documentImage": documents[i].document,
"isActive": true
};
map.add(postParams);
}
}
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t);
}
}

@ -0,0 +1,214 @@
import 'dart:async';
import 'package:car_customer_app/models/user/change_email.dart';
import 'package:car_customer_app/models/user/change_mobile.dart';
import 'package:car_customer_app/models/user/cities.dart';
import 'package:car_customer_app/models/user/confirm_email.dart';
import 'package:car_customer_app/models/user/confirm_mobile.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/image_response.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/forget_password_otp_request.dart';
import 'package:car_customer_app/models/user/verify_email.dart';
import 'package:car_customer_app/models/user/verify_email_otp.dart';
import 'package:http/http.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import '../../classes/app_state.dart';
import '../../models/m_response.dart';
import '../api_client.dart';
class UserApiClent {
static final UserApiClent _instance = UserApiClent._internal();
UserApiClent._internal();
factory UserApiClent() => _instance;
Future<BasicOtp> basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}) async {
var postParams = {"countryID": countryId, "userMobileNo": phoneNo, "otpType": otpType, "userRole": roleId};
return await ApiClient().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.BasicOTP, postParams);
}
Future<RegisterUser> basicVerify(String phoneNo, String otp, String userToken) async {
var postParams = {
"userMobileNo": phoneNo,
"userOTP": otp,
"userToken": userToken,
};
return await ApiClient().postJsonForObject((json) => RegisterUser.fromJson(json), ApiConsts.BasicVerify, postParams);
}
Future<RegisterUser> basicComplete(String userId, String firstName, String lastName, String email, String password) async {
var postParams;
if(email.isEmpty){
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password};
}else{
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password};
}
return await ApiClient().postJsonForObject((json) => RegisterUser.fromJson(json), ApiConsts.BasicComplete, postParams);
}
Future<Response> login_V1(String phoneNo, String password) async {
var postParams = {
"mobileorEmail": phoneNo,
"password": password,
};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V1, postParams);
//return await ApiClient().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams);
}
Future<Response> login_V2_OTP(String userToken, String loginType) async {
var postParams = {
"userToken": userToken,
"loginType": loginType,
};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams);
}
Future<Response> login_V2_OTPVerify(String userToken, String otp) async {
var postParams = {"userToken": userToken, "userOTP": otp};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
}
Future<Response> RefreshToken(String token, String refreshToken) async {
var postParams = {
"token": token,
"refreshToken": refreshToken
};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForResponse(ApiConsts.RefreshToken, postParams, token: t);
}
Future<Country> getAllCountries() async {
var postParams = {};
return await ApiClient().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
}
Future<Cities> getAllCites(String countryId) async {
var postParams = {
"CountryID": countryId,
};
return await ApiClient().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
}
Future<Role> getRoles() async {
return await ApiClient().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
}
Future<Response> ForgetPasswordOTPRequest(String userName, int otpType) async {
var postParams = {
"userName": userName,
"otpType": 1,
};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams);
//return await ApiClient().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams);
}
Future<Response> ForgetPasswordOTPCompare(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams);
// return await ApiClient().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams);
}
Future<Response> ForgetPassword(String userToken, String newPassword) async {
var postParams = {
"userToken": userToken,
"newPassword": newPassword,
};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPassword, postParams);
//return await ApiClient().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams);
}
Future<MResponse> ChangePassword(String currentPasswor, String newPassword) async {
var postParams = {
"currentPassword": currentPasswor,
"newPassword": newPassword,
};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
}
Future<ChangeMobile> ChangeMobileNoOTPRequest(
countryID,
String mobileNo,
String password,
) async {
var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ChangeMobile.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t);
}
Future<ConfirmMobile> ChangeMobileNo(String userToken, String userOTP) async {
var postParams = {
"userToken": userToken,
"userOTP": userOTP,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ConfirmMobile.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t);
}
Future<ChanEmail> ChangeEmailOTPRequest(String email, String password) async {
var postParams = {"email": email, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ChanEmail.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t);
}
Future<ConfirmEmail> ChangeEmail(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ConfirmEmail.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t);
}
Future<VerifyEmail> EmailVerify(String email, String userID) async {
var postParams = {
// "email": email,
// "userID": userID,
"email": AppState().getUser.data!.userInfo!.email ?? "",
"userID": AppState().getUser.data!.userInfo!.userId ?? "",
};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => VerifyEmail.fromJson(json), ApiConsts.EmailVerify, postParams, token: t);
}
Future<MResponse> EmailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams =
{"userToken": userToken,
"userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t);
}
Future<ImageResponse> UpdateUserImage(String image) async {
var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
Future<ImageResponse> GetUserImage(String image) async {
var postParams = {};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
}

@ -0,0 +1,52 @@
import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart';
class SharedPrefManager {
static String USER_ID = "user.id";
static String USER_TOKEN = "user.token";
static String USER_NAME = "user.name";
static String PASSWORD = "user.password";
static Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
static setUserId(String cookie) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(USER_ID, cookie) ?? "NA";
}
static Future<String> getUserId() async {
SharedPreferences prefs = await _prefs;
return prefs.getString(USER_ID) ?? "";
}
static setUserToken(String cookie) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(USER_TOKEN, cookie) ?? "NA";
}
static Future<String> getUserToken() async {
SharedPreferences prefs = await _prefs;
return prefs.getString(USER_TOKEN) ?? "";
}
static setPhoneOrEmail(String cookie) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(USER_NAME, cookie) ?? "NA";
}
static Future<String> getPhoneOrEmail() async {
SharedPreferences prefs = await _prefs;
return prefs.getString(USER_NAME) ?? "";
}
static setUserPassword(String cookie) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(PASSWORD, cookie) ?? "NA";
}
static Future<String> getUserPassword() async {
SharedPreferences prefs = await _prefs;
return prefs.getString(PASSWORD) ?? "";
}
}

@ -0,0 +1,34 @@
import 'dart:async';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'api_client.dart';
class TangheemUserApiClient {
static final TangheemUserApiClient _instance = TangheemUserApiClient._internal();
TangheemUserApiClient._internal();
factory TangheemUserApiClient() => _instance;
Future<SurahModel> getSurahs() async {
String url = "${ApiConsts.baseUrl}AlSuar_Get";
var postParams = {};
return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams);
}
Future<MemberModel> getMembers() async {
String url = "${ApiConsts.baseUrl}Committee_Get";
var postParams = {};
return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams);
}
Future<ContentInfoModel> getContentInfo(int contentId) async {
String url = "${ApiConsts.baseUrl}ContentInfo_Get";
var postParams = {"contentTypeId": contentId};
return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams);
}
}

@ -0,0 +1,33 @@
import 'package:car_customer_app/models/post_params_model.dart';
import 'package:car_customer_app/models/user/user.dart';
class AppState {
static final AppState _instance = AppState._internal();
AppState._internal();
factory AppState() => _instance;
bool isLogged = false;
set setLogged(v) => isLogged = v;
bool? get getIsLogged => isLogged;
User? _user = null;
set setUser(v) => _user = v;
User get getUser => _user??User();
PostParamsModel? _postParams;
PostParamsModel? get postParamsObject => _postParams;
Map<String, dynamic> get postParamsJson => _postParams?.toJson() ?? {};
void setPostParamsModel(PostParamsModel _postParams) {
this._postParams = _postParams;
}
}

@ -0,0 +1,31 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyColors {
static const Color primaryColor = Colors.white;
static const Color accentColor = Colors.blue;
static const Color darkIconColor = Color(0xff28323A);
static const Color darkTextColor = Color(0xff2B353E);
static const Color normalTextColor = Color(0xff5A5A5A);
static const Color lightTextColor = Color(0xffBFBFBF);
static const Color gradiantStartColor = Color(0xff33c0a5);
static const Color gradiantEndColor = Color(0xff259db7 );
static const Color textMixColor = Color(0xff2BB8A6);
static const Color backgroundColor = Color(0xffF8F8F8);
static const Color grey57Color = Color(0xff575757);
static const Color grey77Color = Color(0xff777777);
static const Color grey70Color = Color(0xff707070);
static const Color greyACColor = Color(0xffACACAC);
static const Color grey98Color = Color(0xff989898);
static const Color lightGreyEFColor = Color(0xffEFEFEF);
static const Color lightGreyEDColor = Color(0xffEDEDED);
static const Color lightGreyEAColor = Color(0xffEAEAEA);
static const Color darkWhiteColor = Color(0xffE0E0E0);
static const Color redColor = Color(0xffD02127);
static const Color yellowColor = Color(0xffF4E31C);
static const Color backgroundBlackColor = Color(0xff202529);
static const Color black = Color(0xff000000);
static const Color white = Color(0xffffffff);
static const Color green = Color(0xffffffff);
static const Color borderColor = Color(0xffE8E8E8);
}

@ -0,0 +1,55 @@
class ApiConsts {
// static String baseUrl = "http://10.200.204.20:2801/"; // Local server
static String baseUrl = "https://mdlaboratories.com"; // production server
static String baseUrlServices = baseUrl + "/mc/"; // production server
static String BasicOTP = baseUrlServices + "api/Register/BasicOTP";
static String BasicVerify = baseUrlServices + "api/Register/BasicVerify";
static String BasicComplete = baseUrlServices + "api/Register/BasicComplete";
static String RefreshToken = baseUrlServices + "api/Account/RefreshToken";
//User
static String Login_V1 = baseUrlServices + "api/Account/Login_V1";
static String Login_V2_OTP = baseUrlServices + "api/Account/Login_V2_OTP";
static String Login_V2_OTPVerify = baseUrlServices + "api/Account/Login_V2_OTPVerify";
static String user = baseUrlServices + "api/User/";
static String GetAllCountry = baseUrlServices + "api/Master/Country_Get";
static String GetProviderRoles = baseUrlServices + "api/Master/RoleServiceProvider_Get";
static String GetAllCities = baseUrlServices + "api/Master/City_Get";
static String ForgetPasswordOTPRequest = baseUrlServices + "api/Account/ForgetPasswordOTPRequest";
static String ForgetPasswordOTPCompare = baseUrlServices + "api/Account/ForgetPasswordOTPCompare";
static String ForgetPassword = baseUrlServices + "api/Account/ForgetPassword";
static String Login_Email_OTP = baseUrlServices + "api/Account/EmailVerify";
static String Login_Email_OTPVerify = baseUrlServices + "api/Account/EmailVerifyOTPVerify";
static String ChangePassword = baseUrlServices + "api/Account/ChangePassword";
static String ChangeMobileNoOTPRequest = baseUrlServices + "api/Account/ChangeMobileNoOTPRequest";
static String ChangeMobileNo = baseUrlServices + "api/Account/ChangeMobileNo";
static String ChangeEmailOTPRequest = baseUrlServices + "api/Account/ChangeEmailOTPRequest";
static String ChangeEmail = baseUrlServices + "api/Account/ChangeEmail";
static String EmailVerify = baseUrlServices + "api/Account/EmailVerify";
static String EmailVerifyOTPVerify = baseUrlServices + "api/Account/EmailVerifyOTPVerify";
static String UpdateUserImage = baseUrlServices + "api/User_UpdateProfileImage";
static String GetUserImage = baseUrlServices + "api/ProfileImage";
//Profile
static String GetProviderDocument = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Get";
static String ServiceProviderDocument_Update = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Update";
//Branch
static String createProviderBranch = baseUrlServices + "api/ServiceProviders/ServiceProviderBranch_Create";
static String ServiceProviderBranchGet = baseUrlServices + "api/ServiceProviders/ServiceProviderBranch_Get";
static String ServiceCategory_Get = baseUrlServices + "api/Master/ServiceCategory_Get";
static String Services_Get = baseUrlServices + "api/ServiceProviders/Services_Get";
static String ServiceProviderService_Create = baseUrlServices + "api/ServiceProviders/ServiceProviderService_Create";
}
class GlobalConsts {
static String isRememberMe = "remember_me";
static String email = "email";
static String password = "password";
static String bookmark = "bookmark";
static String fontZoomSize = "font_zoom_size";
static String welcomeVideoUrl = "welcomeVideoUrl";
static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo";
}

@ -0,0 +1,71 @@
import 'package:car_customer_app/widgets/loading_dialog.dart';
import 'package:flutter/material.dart';
// import 'package:fluttertoast/fluttertoast.dart';
import 'package:car_customer_app/exceptions/api_exception.dart';
import 'package:fluttertoast/fluttertoast.dart';
class Utils {
static bool _isLoadingVisible = false;
static bool get isLoading => _isLoadingVisible;
static void showToast(String message) {
Fluttertoast.showToast(
msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0);
}
static dynamic getNotNullValue(List<dynamic> list, int index) {
try {
return list[index];
} catch (ex) {
return null;
}
}
static int stringToHex(String colorCode) {
try {
return int.parse(colorCode.replaceAll("#", "0xff"));
} catch (ex) {
return (0xff000000);
}
}
static void showLoading(BuildContext context) {
WidgetsBinding.instance?.addPostFrameCallback((_) {
_isLoadingVisible = true;
showDialog(
context: context,
barrierColor: Colors.black.withOpacity(0.5),
builder: (BuildContext context) => LoadingDialog(),
).then((value) {
_isLoadingVisible = false;
});
});
}
static void hideLoading(BuildContext context) {
if (_isLoadingVisible) {
_isLoadingVisible = false;
Navigator.of(context).pop();
}
_isLoadingVisible = false;
}
static void handleException(dynamic exception, Function(String)? onErrorMessage) {
String errorMessage;
if (exception is APIException) {
if (exception.message == APIException.UNAUTHORIZED) {
return;
} else {
errorMessage = exception.error?.errorMessage ?? exception.message;
}
} else {
errorMessage = APIException.UNKNOWN;
}
if (onErrorMessage != null) {
onErrorMessage(errorMessage);
} else {
showToast(errorMessage);
}
}
}

@ -0,0 +1,20 @@
// import 'package:car_customer_app/provider/counter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class AppProvider extends StatelessWidget {
final Widget child;
AppProvider({required this.child});
@override
Widget build(BuildContext context) {
return child;
// return MultiProvider(
// providers: [
// ChangeNotifierProvider(create: (_) => Counter()),
// ],
// child: child,
// );
}
}

@ -0,0 +1,8 @@
enum YesOrNo {
no,
yes,
}
const String icons = "assets/icons/";
const String categorySvgIcons = "assets/category/svg/";
const String svgIcons = "assets/svg/";

@ -1,8 +0,0 @@
import 'package:mc_common_app/config/dependencies.dart';
class CustomerDependencies {
static void addDependencies() {
AppDependencies.addDependencies();
}
}

@ -1,23 +0,0 @@
import 'package:car_customer_app/views/appointments/appointment_detail_view.dart';
import 'package:car_customer_app/views/appointments/book_appointment_services_view.dart';
import 'package:car_customer_app/views/appointments/pick_items_view.dart';
import 'package:car_customer_app/views/dashboard/dashboard_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/views/advertisement/ads_detail_view.dart';
import 'package:mc_common_app/views/advertisement/create_ad_view.dart';
import 'package:mc_common_app/views/payments/payment_methods_view.dart';
class CustomerAppRoutes {
static final Map<String, WidgetBuilder> routes = {
AppRoutes.dashboard: (context) => DashboardPage(),
AppRoutes.bookProviderAppView: (context) => BookProviderAppView(),
AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => CreateAdView(),
AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(),
};
}

@ -0,0 +1,90 @@
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/pages/dashboard/dashboard_page.dart';
// import 'package:car_customer_app/pages/settings/create_services_page.dart';
// import 'package:car_customer_app/pages/settings/dealership_page.dart';
// import 'package:car_customer_app/pages/settings/define_branch_page.dart';
// import 'package:car_customer_app/pages/settings/define_license_page.dart';
import 'package:car_customer_app/pages/user/change_email_page.dart';
import 'package:car_customer_app/pages/user/change_mobile_page.dart';
import 'package:car_customer_app/pages/user/change_password_page.dart';
import 'package:car_customer_app/pages/user/complete_profile_page.dart';
import 'package:car_customer_app/pages/user/confirm_new_password_page.dart';
import 'package:car_customer_app/pages/user/edit_account_page.dart';
import 'package:car_customer_app/pages/user/forget_password_method_page.dart';
import 'package:car_customer_app/pages/user/forget_password_page.dart';
import 'package:car_customer_app/pages/user/login_method_selection_page.dart';
import 'package:car_customer_app/pages/user/login_verification_page.dart';
import 'package:car_customer_app/pages/user/login_verify_account_page.dart';
import 'package:car_customer_app/pages/user/login_with_password_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_1_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_2_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_3_page.dart';
import 'package:car_customer_app/pages/user/register_page.dart';
import 'package:car_customer_app/pages/user/register_selection_page.dart';
import 'package:car_customer_app/pages/user/splash_page.dart';
import 'package:car_customer_app/pages/user/vertify_password_page.dart';
import 'package:flutter/material.dart';
class AppRoutes {
//User
static final String splash = "/splash";
static final String registerSelection = "/registerSelection";
static final String loginVerifyAccount = "/loginVerifyAccount";
static final String register = "/register";
static final String forgetPassword = "/forgetPassword";
static final String loginVerification = "/loginVerification";
static final String loginWithPassword = "/loginWithPassword";
static final String loginMethodSelection = "/loginMethodSelection";
static final String completeProfile = "/completeProfile";
static final String profile1 = "/profile1";
static final String profile2 = "/profile2";
static final String profile3 = "/profile3";
static final String vertifyPassword = "/vertifyPassword";
static final String confirmNewPasswordPage = "/confirmNewPasswordPage";
static final String defineLicense = "/defineLicese";
static final String changePassword = "/changePassword";
static final String forgetPasswordMethodPage = "/forgetPasswordMethodPage";
static final String changeMobilePage = "/changeMobilePage";
static final String changeEmailPage = "/changeEmailPage";
static final String editAccoundPage = "/editAccoundPage";
static final String dashboard = "/dashboard";
//settings
static final String dealershipSetting = "/dealershipSetting";
static final String defineBranch = "/defineBranch";
static final String createServices = "/createServices";
static final String initialRoute = splash;
static final Map<String, WidgetBuilder> routes = {
//User
splash: (context) => SplashPage(),
registerSelection: (context) => RegisterSelectionPage(),
loginVerifyAccount: (context) => LoginVerifyAccountPage(),
register: (context) => RegisterPage(),
forgetPassword: (context) => ForgetPasswordPage(),
loginVerification: (context) => LoginVerificationPage(),
loginWithPassword: (context) => LoginWithPassword(),
loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String),
completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUser),
// profile1: (context) => Profile1Page(),
// profile2: (context) => Profile2Page(),
// profile3: (context) => Profile3Page(),
// defineLicense: (context) => DefineLicensePage(),
vertifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String),
changePassword: (context) => ChangePasswordPage(),
forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String),
changeMobilePage: (context) => ChangeMobilePage(),
changeEmailPage : (context) => ChangeEmailPage(),
editAccoundPage : (context) => EditAccountPage(),
//Home page
dashboard: (context) => DashboardPage(),
//setting
// dealershipSetting: (context) => DealershipPage(),
// defineBranch: (context) => DefineBranchPage(),
// createServices: (context) => CreateServicesPage(),
};
}

@ -0,0 +1,29 @@
import 'dart:convert';
import 'package:car_customer_app/api/api_client.dart';
class APIException implements Exception {
static const String BAD_REQUEST = 'api_common_bad_request';
static const String UNAUTHORIZED = 'api_common_unauthorized';
static const String FORBIDDEN = 'api_common_forbidden';
static const String NOT_FOUND = 'api_common_not_found';
static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error';
static const String UPGRADE_REQUIRED = 'api_common_upgrade_required';
static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format';
static const String OTHER = 'api_common_http_error';
static const String TIMEOUT = 'api_common_http_timeout';
static const String UNKNOWN = 'unexpected_error';
final String message;
final APIError? error;
final arguments;
const APIException(this.message, {this.arguments, this.error});
Map<String, dynamic> toJson() => {'message': message, 'error': error, 'arguments': '$arguments'};
@override
String toString() {
return jsonEncode(this);
}
}

@ -0,0 +1,7 @@
import 'package:flutter/cupertino.dart';
extension IntExtensions on int {
Widget get height => SizedBox(height: toDouble());
Widget get width => SizedBox(width: toDouble());
}

@ -0,0 +1,118 @@
import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart';
import 'package:car_customer_app/classes/colors.dart';
extension EmailValidator on String {
Widget get toWidget => Text(this);
Widget toText({Color? color, bool isBold = false,double? fontSize}) => Text(
this,
style: TextStyle(fontSize: fontSize??10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
);
Widget toText10({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
);
Widget toText11({Color? color, bool isUnderLine = false, bool isBold = false}) => Text(
this,
style: TextStyle(
fontSize: 11,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.33,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text(
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
style: TextStyle(
fontSize: 12,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.72,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText13({Color? color, bool isUnderLine = false}) => Text(
this,
style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText14({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText16({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText17({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText22({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText24({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 23 / 24, color: color ?? MyColors.darkTextColor, fontSize: 24, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText32({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 32, letterSpacing: -1.92, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
bool isValidEmail() {
return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this);
}
bool isNum() {
return RegExp(r'^[0-9]+$').hasMatch(this);
}
String toFormattedDate() {
String date = this.split("T")[0];
String time = this.split("T")[1];
var dates = date.split("-");
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
}
getMonth(int month) {
switch (month) {
case 1:
return "January";
case 2:
return "February";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
}
}
}

@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
extension WidgetExtensions on Widget {
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);
Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this);
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) =>
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
}

@ -0,0 +1,249 @@
// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart
// ignore_for_file: prefer_single_quotes
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart' show AssetLoader;
class CodegenLoader extends AssetLoader{
const CodegenLoader();
@override
Future<Map<String, dynamic>> load(String fullPath, Locale locale ) {
return Future.value(mapLocales[locale.toString()]);
}
static const Map<String,dynamic> ar_SA = {
"firstTimeLogIn": "تسجيل الدخول لأول مره",
"signUp": "التسجيل",
"changeMobile": "تغيير رقم الجوال",
"notifications": "الاشعارات",
"general": "عام",
"defineLicences": "تحديد الرخص",
"dealershipSettings": "اعدادات البيع",
"changePassword": "تغيير كلمة المرور",
"retrievePassword": "استرجاع كلمة المرور",
"changeEmail": "تغيير الايميل",
"verify": "تحقق",
"verified": "تم التحقق",
"signOut": "تسجيل خروج",
"enterEmail": "ادخل الايميل",
"enterNewEmail": "ادخل ايميل جديد",
"enterCurrentPassword": "كلمة المرور الحاليه",
"enterNewPassword": "كلمة المرور الجديده",
"enterOldPassword": "كلمة المرور القديمه",
"confirm": "تأكيد",
"enterNewPhoneNumber": "رقم جوال جديد",
"completeProfile": "الملف الشخصي",
"continu": "استمرار",
"confirmPassword": "تأكيد كلمة المرور",
"createPassword": "انشاء كلمة مرور جديده",
"email": "ايميل",
"firstName": "الأسم الأول *",
"surname": "اسم العائله *",
"confirmPass": "تأكيد كلمة المرور *",
"createPass": "انشاء كلمة مرور جديده *",
"newPassword": " كلمة مرور جديده",
"forgetPassword": "نسيت كلمة المرور",
"editAccount": "تعديل الحساب",
"change": "تغيير",
"verifyAccount": "التحقق من الحساب",
"login": "تسجيل دخول",
"welcomeMessage": "مرحبا",
"forgetPass": "نسيت كلمة المرور ؟",
"enterPhoneNumber": "رقم جوال ",
"phoneNumberVerified": "تم التحقق من الجوال",
"verifyNewPassword": "التحقق من كلمة المرور",
"EnterPass": "ادخل كلمة المرور",
"alreadySigned": " تم تسجيل الدخول",
"emailChangedSuccessfully": "تم تغيير الايميل بنجاح",
"passwordIsUpdated": "تم تحجيث كلمة المرور",
"passwordShouldContains": "كلمة المرور يجب ان تحتوي على رمز رقم حرف كبير حرف صغير",
" successfullyRegistered": "تم التسجيل بنجاح",
"pleaseEnterSamePassword": "ادخل كلمة مرور مطابقه",
"firstNameMandatory": "ادخل الأسم الأول ",
"surnameNameMandatory": "ادخل اسم العائله",
"passwordNameMandatory": "ادخل كلمة المرور",
"enterValidEmail": "ادخل ايميل صحيح",
"pleaseAcceptTerms": "يجب الموافقه على الشروط",
"emailVerified": "تم التحقق من الايميل بنجاح",
"selectMethod": "اختر",
"emailAddress": "ايميل",
"loginSelection": "اختر",
"selectCountryCode": "اختر رمز الدوله",
"selectProviderRole": "اختر نوع الخدمه",
"addPhoneNo": "اضف الهاتف",
"onlyCustomerApp": "نأسف هذا التطبيق فقط للعملاء",
"imageUploaded": "تم تحميل الصوره",
"fileLarger": "1KB حجم الملف اكبر من",
"account": "الحساب",
"edit": "تعديل",
"imageDeleted": "تم حذف الصوره",
"dashboard": "الصفحه الرئيسيه",
"termsOfService": "من خلال إنشاء حساب فإنك توافق على شروط الخدمة و\n سياسة الخصوصية",
"userInformation": "معلومات المتسخدم",
"faceRecognition": "تحقق مع بصمة الوجه",
"fingerPrint": "تحقق مع بصمة الاصبع",
"whatsapp": "تحقق مع Whatsapp",
"SMS": "رسائل قصيره",
"selectRole": "حدد الدور",
"userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل",
"arabic": "عربي",
"english": "English",
"title": "Hello",
"msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language",
"clickMe": "Click me",
"profile": {
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
}
},
"clicked": {
"zero": "You clicked {} times!",
"one": "You clicked {} time!",
"two": "You clicked {} times!",
"few": "You clicked {} times!",
"many": "You clicked {} times!",
"other": "You clicked {} times!"
},
"amount": {
"zero": "Your amount : {} ",
"one": "Your amount : {} ",
"two": "Your amount : {} ",
"few": "Your amount : {} ",
"many": "Your amount : {} ",
"other": "Your amount : {} "
},
"gender": {
"male": "Hi man ;) ",
"female": "Hello girl :)",
"with_arg": {
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
},
"reset_locale": "Reset Language"
};
static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In",
"signUp": "Sing Up",
"changeMobile": "Change Mobile",
"notifications": "Notifications",
"general": "General",
"defineLicences": "Define Licences",
"dealershipSettings": "Dealership Settings",
"changePassword": "Change Password",
"retrievePassword": "Retrieve Password",
"changeEmail": "Change Email",
"verify": "Verify",
"verified": "Verified",
"signOut": "Sign Out",
"enterEmail": "Enter Email",
"enterNewEmail": "Enter New Email",
"enterNewPassword": "Enter New Password",
"enterCurrentPassword": "Enter Current Password",
"enterOldPassword": "Enter Old Password",
"confirm": "Confirm",
"completeProfile": "Complete Profile",
"enterNewPhoneNumber": "Enter New Phone Number",
"enterPhoneNumber": "Enter Phone Number",
"continu": "Continue",
"confirmPassword": "Confirm Password",
"createPassword": "Create Password",
"email": "Email",
"firstName": "First Name *",
"surname": "Surname *",
"confirmPass": "Confirm Password *",
"createPass": "Create Password *",
"newPassword": "New Password",
"forgetPassword": "Forget Password",
"editAccount": "Edit Account",
"change": "Change",
"verifyAccount": "Verify Account",
"login": "Log In",
"welcomeMessage": "Welcome Message",
"forgetPass": "Forget Password ?",
"phoneNumberVerified": "Phone Number Verified",
"verifyNewPassword": "Verify New Password",
"EnterPass": "Enter Password ?",
"alreadySigned": " Already Signed Up and Logged In",
"emailChangedSuccessfully": "Email is Changed Successfully",
"passwordIsUpdated": "Password is Updated",
"passwordShouldContains": "Password Should contains Character, Number, Capital and small letters,",
" successfullyRegistered": " Successfully Registered, Please login once,",
"pleaseEnterSamePassword": "Please enter same password",
"firstNameMandatory": "First name is mandatory",
"surnameNameMandatory": "Surname is mandatory",
"passwordNameMandatory": "Password is mandatory",
"enterValidEmail": "Enter Valid Email",
"pleaseAcceptTerms": "Please accept terms",
"emailVerified": "Email is verified successfully",
"selectMethod": "Select Method",
"emailAddress": "Email Address",
"loginSelection": "Login Selection",
"selectCountryCode": "Please select Country Code",
"selectProviderRole": "Please select Provider Role",
"addPhoneNo": "Please add Phone No",
"onlyCustomerApp": "Sorry, Only Customer's can log in this app",
"imageUploaded": "Image is uploaded",
"fileLarger": "File is larger then 1KB",
"account": "Account",
"edit": "EDIT",
"imageDeleted": "Image is Deleted",
"dashboard": "Dashboard/Main Page",
"termsOfService": "By creating an account you agree to our Terms of Service and\n Privacy Policy",
"userInformation": "User Information",
"faceRecognition": "Face Recognition",
"fingerPrint": "Finger Print",
"whatsapp": "With Whatsapp",
"SMS": "With SMS",
"selectRole": "Select Role",
"userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email",
"number": "Number",
"english": "English",
"title": "Hello",
"msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language",
"clickMe": "Click me",
"profile": {
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
}
},
"clicked": {
"zero": "You clicked {} times!",
"one": "You clicked {} time!",
"two": "You clicked {} times!",
"few": "You clicked {} times!",
"many": "You clicked {} times!",
"other": "You clicked {} times!"
},
"amount": {
"zero": "Your amount : {} ",
"one": "Your amount : {} ",
"two": "Your amount : {} ",
"few": "Your amount : {} ",
"many": "Your amount : {} ",
"other": "Your amount : {} "
},
"gender": {
"male": "Hi man ;) ",
"female": "Hello girl :)",
"with_arg": {
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
},
"reset_locale": "Reset Language"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -1,109 +1,61 @@
import 'package:car_customer_app/config/customer_dependencies.dart';
import 'package:car_customer_app/config/customer_routes.dart';
import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:car_customer_app/view_models/dashboard_view_model.dart';
import 'package:car_customer_app/view_models/providers_view_model.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/config/app_provider.dart';
import 'package:car_customer_app/models/post_params_model.dart';
import 'package:car_customer_app/theme/app_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/post_params_model.dart';
import 'package:mc_common_app/repositories/ads_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/repositories/payments_repo.dart';
import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/services/payments_service.dart';
import 'package:mc_common_app/theme/app_theme.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/payment_view_model.dart';
import 'package:mc_common_app/view_models/user_view_model.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:sizer/sizer.dart';
import 'config/routes.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
CustomerDependencies.addDependencies();
await EasyLocalization.ensureInitialized();
CustomerAppRoutes.routes.addAll(AppRoutes.routes);
await EasyLocalization.ensureInitialized();
runApp(
MultiProvider(
providers: <SingleChildWidget>[
ChangeNotifierProvider<BaseVM>(create: (_) => BaseVM()),
ChangeNotifierProvider<DashboardVM>(
create: (_) => DashboardVM(
commonServices: injector.get<CommonAppServices>(),
userRepo: injector.get<UserRepo>(),
),
),
ChangeNotifierProvider<UserVM>(
create: (_) => UserVM(userRepo: injector.get<UserRepo>()),
),
ChangeNotifierProvider<AdVM>(
create: (_) => AdVM(
commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(),
adsRepo: injector.get<AdsRepo>(),
),
),
ChangeNotifierProvider<ProvidersVM>(
create: (_) => ProvidersVM(
commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(),
),
),
ChangeNotifierProvider<AppointmentsVM>(
create: (_) => AppointmentsVM(
commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(),
),
),
ChangeNotifierProvider<PaymentVM>(
create: (_) => PaymentVM(paymentService: injector.get<PaymentService>(), paymentRepo: injector.get<PaymentsRepo>()),
),
EasyLocalization(
supportedLocales: [
Locale('ar', 'SA'),
Locale('en', 'US')
],
child: const MyApp(),
).setupLocale(),
fallbackLocale: Locale('en', 'US'),
startLocale: Locale('ar', 'SA'),
path: 'resources/langs',
child: MyApp(),
),
);
}
// todo terminal command to generate translation files
// flutter pub run easy_localization:generate --source-dir ./assets/langs
// todo terminal command to generate translation keys
// flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart
// todo terminal command to genertate translation files
// flutter pub run easy_localization:generate --source-dir ./resources/langs
// todo terminal command to genertate translation keys
// flutter pub run easy_localization:generate --source-dir ./resources/langs -f keys -o locale_keys.g.dart
// command to generate languages data from json
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Sizer(
builder: (context, orientation, deviceType) {
injector.get<AppState>().setAppType(AppType.customer);
AppState().setPostParamsModel(
PostParamsModel(
languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,
),
);
return MaterialApp(
theme: AppTheme.getTheme(
isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar",
),
debugShowCheckedModeBanner: false,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
initialRoute: AppRoutes.initialRoute,
routes: CustomerAppRoutes.routes,
);
},
return AppProvider(
child: Sizer(
builder: (context, orientation, deviceType) {
AppState().setPostParamsModel(
PostParamsModel(languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,),
);
return MaterialApp(
theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"),
debugShowCheckedModeBanner: false,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
initialRoute: AppRoutes.initialRoute,
routes: AppRoutes.routes,
);
},
),
);
}
}

@ -0,0 +1,44 @@
// To parse this JSON data, do
//
// final account = accountFromJson(jsonString);
import 'dart:convert';
import 'package:car_customer_app/models/parent_list.dart';
Account accountFromJson(String str) => Account.fromJson(json.decode(str));
String accountToJson(Account data) => json.encode(data.toJson());
class Account {
Account({
required this.parentList,
required this.selectedItem,
});
List<ParentList>? parentList;
int selectedItem;
factory Account.fromJson(Map<String, dynamic> json) => Account(
parentList: json["parentList"] == null
? null
: List<ParentList>.from(
json["parentList"].map((x) => ParentList.fromJson(x))),
selectedItem:
json["selectedItem"] == null ? null : json["selectedItem"],
);
Map<String, dynamic> toJson() => {
"parentList": parentList == null
? null
: List<dynamic>.from(parentList!.map((x) => x.toJson())),
"selectedItem": selectedItem == null ? null : selectedItem,
};
Map<String, dynamic> toJsonData() => {
"selectedItem": selectedItem == null ? null : selectedItem,
};
}

@ -0,0 +1,12 @@
class ConfigModel {
ConfigModel(this.endpoint, this.organizationName);
String endpoint;
String organizationName;
factory ConfigModel.fromJson(Map<String, dynamic> json) =>
ConfigModel("", "");
// Map<String, dynamic> toJson() => _$ConfigModelToJson(this);
}

@ -0,0 +1,65 @@
class ContentInfoModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<ContentInfoDataModel>? data;
ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data});
ContentInfoModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
statusCode = json['statusCode'];
message = json['message'];
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(new ContentInfoDataModel.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
data['statusCode'] = this.statusCode;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data?.map((v) => v.toJson()).toList();
}
return data;
}
}
class ContentInfoDataModel {
int? contentInfoId;
int? contentTypeId;
String? content;
String? contentTypeNameEn;
String? contentTypeNameAr;
String? fileName;
String? exposeFilePath;
ContentInfoDataModel({this.contentInfoId, this.contentTypeId, this.content, this.contentTypeNameEn, this.contentTypeNameAr, this.fileName, this.exposeFilePath});
ContentInfoDataModel.fromJson(Map<String, dynamic> json) {
contentInfoId = json['contentInfoId'];
contentTypeId = json['contentTypeId'];
content = json['content'];
contentTypeNameEn = json['contentTypeNameEn'];
contentTypeNameAr = json['contentTypeNameAr'];
fileName = json['fileName'];
exposeFilePath = json['exposeFilePath'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['contentInfoId'] = this.contentInfoId;
data['contentTypeId'] = this.contentTypeId;
data['content'] = this.content;
data['contentTypeNameEn'] = this.contentTypeNameEn;
data['contentTypeNameAr'] = this.contentTypeNameAr;
data['fileName'] = this.fileName;
data['exposeFilePath'] = this.exposeFilePath;
return data;
}
}

@ -0,0 +1,33 @@
// To parse this JSON data, do
//
// final mResponse = mResponseFromJson(jsonString);
import 'dart:convert';
MResponse mResponseFromJson(String str) => MResponse.fromJson(json.decode(str));
String mResponseToJson(MResponse data) => json.encode(data.toJson());
class MResponse {
MResponse({
this.totalItemsCount,
this.messageStatus,
this.message,
});
int? totalItemsCount;
int? messageStatus;
String? message;
factory MResponse.fromJson(Map<String, dynamic> json) => MResponse(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}

@ -0,0 +1,62 @@
class MemberModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<MemberDataModel>? data;
MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data});
MemberModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
statusCode = json['statusCode'];
message = json['message'];
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(new MemberDataModel.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
data['statusCode'] = this.statusCode;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data?.map((v) => v.toJson()).toList();
}
return data;
}
}
class MemberDataModel {
int? committeeId;
String? firstName;
String? lastName;
String? description;
String? picture;
int? orderNo;
MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo});
MemberDataModel.fromJson(Map<String, dynamic> json) {
committeeId = json['committeeId'];
firstName = json['firstName'];
lastName = json['lastName'];
description = json['description'];
picture = json['picture'];
orderNo = json['orderNo'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['committeeId'] = this.committeeId;
data['firstName'] = this.firstName;
data['lastName'] = this.lastName;
data['description'] = this.description;
data['picture'] = this.picture;
data['orderNo'] = this.orderNo;
return data;
}
}

@ -0,0 +1,26 @@
class ParentList {
ParentList({
required this.dbId,
required this.text,
required this.path,
required this.isSelected,
});
int dbId;
String text;
String path;
bool isSelected;
factory ParentList.fromJson(Map<String, dynamic> json) => ParentList(
dbId: json["dbId"] == null ? null : json["dbId"],
text: json["text"] == null ? null : json["text"],
path: json["path"] == null ? null : json["path"],
isSelected: false,
);
Map<String, dynamic> toJson() => {
"dbId": dbId == null ? null : dbId,
"text": text == null ? null : text,
"path": path == null ? null : path,
};
}

@ -0,0 +1,35 @@
class PostParamsModel {
double? versionID;
int? channel;
int? languageID;
String? mobileType;
String? logInTokenID;
String? tokenID;
PostParamsModel({this.versionID, this.channel, this.languageID, this.mobileType, this.logInTokenID, this.tokenID});
PostParamsModel.fromJson(Map<String, dynamic> json) {
versionID = json['VersionID'];
channel = json['Channel'];
languageID = json['LanguageID'];
mobileType = json['MobileType'];
logInTokenID = json['LogInTokenID'];
tokenID = json['TokenID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['VersionID'] = this.versionID;
data['Channel'] = this.channel;
data['LanguageID'] = this.languageID;
data['MobileType'] = this.mobileType;
data['LogInTokenID'] = this.logInTokenID;
data['TokenID'] = this.tokenID;
return data;
}
set setLogInTokenID(String? token) => logInTokenID = token;
set setTokenID(String? token) => tokenID = token;
}

@ -0,0 +1,85 @@
// To parse this JSON data, do
//
// final branch = branchFromJson(jsonString);
import 'dart:convert';
Branch branchFromJson(String str) => Branch.fromJson(json.decode(str));
String branchToJson(Branch data) => json.encode(data.toJson());
class Branch {
Branch({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<BranchData>? data;
int? messageStatus;
String? message;
factory Branch.fromJson(Map<String, dynamic> json) => Branch(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<BranchData>.from(json["data"].map((x) => BranchData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class BranchData {
BranchData({
this.id,
this.serviceProviderId,
this.branchName,
this.branchDescription,
this.cityId,
this.address,
this.latitude,
this.longitude,
this.status,
});
int? id;
int? serviceProviderId;
String? branchName;
String? branchDescription;
int? cityId;
String? address;
String? latitude;
String? longitude;
int? status;
factory BranchData.fromJson(Map<String, dynamic> json) => BranchData(
id: json["id"] == null ? null : json["id"],
serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"],
branchName: json["branchName"] == null ? null : json["branchName"],
branchDescription: json["branchDescription"] == null ? null : json["branchDescription"],
cityId: json["cityID"] == null ? null : json["cityID"],
address: json["address"] == null ? null : json["address"],
latitude: json["latitude"] == null ? null : json["latitude"],
longitude: json["longitude"] == null ? null : json["longitude"],
status: json["status"] == null ? null : json["status"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"serviceProviderID": serviceProviderId == null ? null : serviceProviderId,
"branchName": branchName == null ? null : branchName,
"branchDescription": branchDescription == null ? null : branchDescription,
"cityID": cityId == null ? null : cityId,
"address": address == null ? null : address,
"latitude": latitude == null ? null : latitude,
"longitude": longitude == null ? null : longitude,
"status": status == null ? null : status,
};
}

@ -0,0 +1,69 @@
// To parse this JSON data, do
//
// final category = categoryFromJson(jsonString);
import 'dart:convert';
Category categoryFromJson(String str) => Category.fromJson(json.decode(str));
String categoryToJson(Category data) => json.encode(data.toJson());
class Category {
Category({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<CategoryData>? data;
int? messageStatus;
String? message;
factory Category.fromJson(Map<String, dynamic> json) => Category(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<CategoryData>.from(json["data"].map((x) => CategoryData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class CategoryData {
CategoryData({
this.id,
this.categoryName,
this.categoryNameN,
this.serviceCategoryIconUrl,
this.serviceCategoryImageUrl,
});
int? id;
String? categoryName;
String? categoryNameN;
dynamic? serviceCategoryIconUrl;
dynamic? serviceCategoryImageUrl;
factory CategoryData.fromJson(Map<String, dynamic> json) => CategoryData(
id: json["id"] == null ? null : json["id"],
categoryName: json["categoryName"] == null ? null : json["categoryName"],
categoryNameN: json["categoryNameN"] == null ? null : json["categoryNameN"],
serviceCategoryIconUrl: json["serviceCategoryIconUrl"],
serviceCategoryImageUrl: json["serviceCategoryImageUrl"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"categoryName": categoryName == null ? null : categoryName,
"categoryNameN": categoryNameN == null ? null : categoryNameN,
"serviceCategoryIconUrl": serviceCategoryIconUrl,
"serviceCategoryImageUrl": serviceCategoryImageUrl,
};
}

@ -0,0 +1,83 @@
// To parse this JSON data, do
//
// final document = documentFromJson(jsonString);
import 'dart:convert';
Document documentFromJson(String str) => Document.fromJson(json.decode(str));
String documentToJson(Document data) => json.encode(data.toJson());
class Document {
Document({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<DocumentData>? data;
int? messageStatus;
String? message;
factory Document.fromJson(Map<String, dynamic> json) => Document(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<DocumentData>.from(json["data"].map((x) => DocumentData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class DocumentData {
DocumentData({
this.id,
this.serviceProviderId,
this.documentId,
this.documentUrl,
this.status,
this.comment,
this.isActive,
this.document,
this.fileExt,
});
int? id;
int? serviceProviderId;
int? documentId;
dynamic? documentUrl;
int? status;
dynamic? comment;
bool? isActive;
String? document;
String? fileExt;
factory DocumentData.fromJson(Map<String, dynamic> json) => DocumentData(
id: json["id"] == null ? null : json["id"],
serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"],
documentId: json["documentID"] == null ? null : json["documentID"],
documentUrl: json["documentURL"],
status: json["status"] == null ? null : json["status"],
comment: json["comment"],
isActive: json["isActive"] == null ? null : json["isActive"],
document: null,
fileExt: null,
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"serviceProviderID": serviceProviderId == null ? null : serviceProviderId,
"documentID": documentId == null ? null : documentId,
"documentURL": documentUrl,
"status": status == null ? null : status,
"comment": comment,
"isActive": isActive == null ? null : isActive,
};
}

@ -0,0 +1,80 @@
// To parse this JSON data, do
//
// final services = servicesFromJson(jsonString);
import 'dart:convert';
Services servicesFromJson(String str) => Services.fromJson(json.decode(str));
String servicesToJson(Services data) => json.encode(data.toJson());
class Services {
Services({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<ServicesData>? data;
int? messageStatus;
String? message;
factory Services.fromJson(Map<String, dynamic> json) => Services(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<ServicesData>.from(json["data"].map((x) => ServicesData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class ServicesData {
ServicesData({
this.id,
this.description,
this.descriptionN,
this.serviceIconUrl,
this.serviceImageUrl,
this.serviceCategoryId,
this.categoryName,
this.isSelected,
});
int? id;
String? description;
String? descriptionN;
dynamic? serviceIconUrl;
dynamic? serviceImageUrl;
int? serviceCategoryId;
dynamic? categoryName;
bool? isSelected;
factory ServicesData.fromJson(Map<String, dynamic> json) => ServicesData(
id: json["id"] == null ? null : json["id"],
description: json["description"] == null ? null : json["description"],
descriptionN: json["descriptionN"] == null ? null : json["descriptionN"],
serviceIconUrl: json["serviceIconUrl"],
serviceImageUrl: json["serviceImageUrl"],
serviceCategoryId: json["serviceCategoryID"] == null ? null : json["serviceCategoryID"],
categoryName: json["categoryName"],
isSelected: false,
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"description": description == null ? null : description,
"descriptionN": descriptionN == null ? null : descriptionN,
"serviceIconUrl": serviceIconUrl,
"serviceImageUrl": serviceImageUrl,
"serviceCategoryID": serviceCategoryId == null ? null : serviceCategoryId,
"categoryName": categoryName,
};
}

@ -0,0 +1,34 @@
///
/// This example was taken from
/// https://flutter.dev/docs/development/data-and-backend/json
///
/// This allows the `User` class to access private members in
/// the generated file. The value for this is *.g.dart, where
/// the star denotes the source file name.
/// An annotation for the code generator to know that this class needs the
/// JSON serialization logic to be generated.
class BackendResponse {
BackendResponse({required this.id, required this.isOk, required this.result});
int id;
bool isOk;
dynamic result;
/// A necessary factory constructor for creating a new User instance
/// from a map. Pass the map to the generated `_$UserFromJson()` constructor.
/// The constructor is named after the source class, in this case, User.
factory BackendResponse.fromJson(Map<String, dynamic> json) =>
BackendResponse(
id: 1,
isOk: false,
result: null,
);
//
// /// `toJson` is the convention for a class to declare support for serialization
// /// to JSON. The implementation simply calls the private, generated
// /// helper method `_$UserToJson`.
// Map<String, dynamic> toJson() => _$BackendResponseToJson(this);
}

@ -0,0 +1,74 @@
class SurahModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<SurahModelData>? data;
SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data});
SurahModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
statusCode = json['statusCode'];
message = json['message'];
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(SurahModelData.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = totalItemsCount;
data['statusCode'] = statusCode;
data['message'] = message;
if (this.data != null) {
data['data'] = this.data?.map((v) => v.toJson()).toList();
}
return data;
}
}
class SurahModelData {
int? id;
int? surahID;
String? nameAR;
String? nameEN;
int? numberOfAyahs;
String? englishNameTranslation;
int? revelationID;
String? revelationType;
int? startPageNo;
int? endPageNo;
SurahModelData({this.id, this.surahID, this.nameAR, this.nameEN, this.numberOfAyahs, this.englishNameTranslation, this.revelationID, this.revelationType, this.startPageNo, this.endPageNo});
SurahModelData.fromJson(Map<String, dynamic> json) {
id = json['id'];
surahID = json['surahID'];
nameAR = json['nameAR'];
nameEN = json['nameEN'];
numberOfAyahs = json['numberOfAyahs'];
englishNameTranslation = json['englishNameTranslation'];
revelationID = json['revelation_ID'];
revelationType = json['revelationType'];
startPageNo = json['startPageNo'];
endPageNo = json['endPageNo'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['surahID'] = this.surahID;
data['nameAR'] = this.nameAR;
data['nameEN'] = this.nameEN;
data['numberOfAyahs'] = this.numberOfAyahs;
data['englishNameTranslation'] = this.englishNameTranslation;
data['revelation_ID'] = this.revelationID;
data['revelationType'] = this.revelationType;
data['startPageNo'] = this.startPageNo;
data['endPageNo'] = this.endPageNo;
return data;
}
}

@ -0,0 +1,61 @@
// To parse this JSON data, do
//
// final basicOtp = basicOtpFromJson(jsonString);
import 'dart:convert';
BasicOtp basicOtpFromJson(String str) => BasicOtp.fromJson(json.decode(str));
String basicOtpToJson(BasicOtp data) => json.encode(data.toJson());
class BasicOtp {
BasicOtp({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
dynamic totalItemsCount;
Data? data;
int? messageStatus;
String? message;
factory BasicOtp.fromJson(Map<String, dynamic> json) => BasicOtp(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class Data {
Data({
this.userToken,
});
String? userToken;
factory Data.fromJson(Map<String, dynamic> json) => Data(
userToken: checkValue(json),
);
static String checkValue(Map<String, dynamic> json) {
try {
return json["userToken"] == null ? null : json["userToken"];
} catch (e) {
return json["token"] == null ? null : json["token"];
}
}
Map<String, dynamic> toJson() => {
"userToken": userToken == null ? null : userToken,
};
}

@ -0,0 +1,51 @@
import 'dart:convert';
ChanEmail changeEmailFromJson(String str) => ChanEmail.fromJson(json.decode(str));
String changeEmailToJson(ChanEmail data) => json.encode(data.toJson());
class ChanEmail {
int? messageStatus;
Null? totalItemsCount;
Data? data;
String? message;
ChanEmail(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ChanEmail.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['messageStatus'] = this.messageStatus;
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,51 @@
import 'dart:convert';
ChangeMobile changeMobileFromJson(String str) => ChangeMobile.fromJson(json.decode(str));
String changeMobileToJson(ChangeMobile data) => json.encode(data.toJson());
class ChangeMobile {
int? messageStatus;
Null? totalItemsCount;
Data? data;
String? message;
ChangeMobile(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ChangeMobile.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['messageStatus'] = this.messageStatus;
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,34 @@
import 'dart:convert';
ChangePassword changePasswordFromJson(String str) => ChangePassword.fromJson(json.decode(str));
String changePasswordToJson(ChangePassword data) => json.encode(data.toJson());
class ChangePassword {
int? messageStatus;
Null? totalItemsCount;
bool? data;
String? message;
ChangePassword(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ChangePassword.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['messageStatus'] = this.messageStatus;
data['totalItemsCount'] = this.totalItemsCount;
data['data'] = this.data;
data['message'] = this.message;
return data;
}
}

@ -0,0 +1,65 @@
// To parse this JSON data, do
//
// final cities = citiesFromJson(jsonString);
import 'dart:convert';
Cities citiesFromJson(String str) => Cities.fromJson(json.decode(str));
String citiesToJson(Cities data) => json.encode(data.toJson());
class Cities {
Cities({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<CityData>? data;
int? messageStatus;
String? message;
factory Cities.fromJson(Map<String, dynamic> json) => Cities(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<CityData>.from(json["data"].map((x) => CityData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class CityData {
CityData({
this.id,
this.cityName,
this.cityNameN,
this.countryId,
});
int? id;
String? cityName;
String? cityNameN;
int? countryId;
factory CityData.fromJson(Map<String, dynamic> json) => CityData(
id: json["id"] == null ? null : json["id"],
cityName: json["cityName"] == null ? null : json["cityName"],
cityNameN: json["cityNameN"] == null ? null : json["cityNameN"],
countryId: json["countryID"] == null ? null : json["countryID"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"cityName": cityName == null ? null : cityName,
"cityNameN": cityNameN == null ? null : cityNameN,
"countryID": countryId == null ? null : countryId,
};
}

@ -0,0 +1,51 @@
import 'dart:convert';
ConfirmEmail confirmEmailFromJson(String str) => ConfirmEmail.fromJson(json.decode(str));
String confirmEmailToJson(ConfirmEmail data) => json.encode(data.toJson());
class ConfirmEmail {
int? messageStatus;
Null? totalItemsCount;
Data? data;
String? message;
ConfirmEmail(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ConfirmEmail.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['messageStatus'] = this.messageStatus;
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = this.message;
return data;
}
}
class Data {
String? userID;
Data({this.userID});
Data.fromJson(Map<String, dynamic> json) {
userID = json['userID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userID'] = this.userID;
return data;
}
}

@ -0,0 +1,53 @@
import 'dart:convert';
ConfirmMobile confirmMobileFromJson(String str) => ConfirmMobile.fromJson(json.decode(str));
String confirmMobileToJson(ConfirmMobile data) => json.encode(data.toJson());
class ConfirmMobile {
int? messageStatus;
Null? totalItemsCount;
Data? data;
String? message;
ConfirmMobile(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ConfirmMobile.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['messageStatus'] = this.messageStatus;
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['message'] = this.message;
return data;
}
}
class Data {
String? userID;
Data({this.userID});
Data.fromJson(Map<String, dynamic> json) {
userID = json['userID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userID'] = this.userID;
return data;
}
}

@ -0,0 +1,30 @@
import 'dart:convert';
ConfirmPassword confirmPasswordFromJson(String str) => ConfirmPassword.fromJson(json.decode(str));
String confirmPasswordToJson(ConfirmPassword data) => json.encode(data.toJson());
class ConfirmPassword {
dynamic totalItemsCount;
int? messageStatus;
String? message;
ConfirmPassword(
{this.totalItemsCount, this.messageStatus, this.message});
ConfirmPassword.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
messageStatus = json['messageStatus'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
data['messageStatus'] = this.messageStatus;
data['message'] = this.message;
return data;
}
}

@ -0,0 +1,81 @@
// To parse this JSON data, do
//
// final country = countryFromJson(jsonString);
import 'dart:convert';
Country countryFromJson(String str) => Country.fromJson(json.decode(str));
String countryToJson(Country data) => json.encode(data.toJson());
class Country {
Country({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<CountryData>? data;
int? messageStatus;
String? message;
factory Country.fromJson(Map<String, dynamic> json) => Country(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<CountryData>.from(json["data"].map((x) => CountryData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class CountryData {
CountryData({
this.id,
this.countryName,
this.countryNameN,
this.nationality,
this.nationalityN,
this.countryCode,
this.alpha2Code,
this.alpha3Code,
});
int? id;
String? countryName;
String? countryNameN;
String? nationality;
String? nationalityN;
String? countryCode;
String? alpha2Code;
String? alpha3Code;
factory CountryData.fromJson(Map<String, dynamic> json) => CountryData(
id: json["id"] == null ? null : json["id"],
countryName: json["countryName"] == null ? null : json["countryName"],
countryNameN: json["countryNameN"] == null ? null : json["countryNameN"],
nationality: json["nationality"] == null ? null : json["nationality"],
nationalityN: json["nationalityN"] == null ? null : json["nationalityN"],
countryCode: json["countryCode"] == null ? null : json["countryCode"],
alpha2Code: json["alpha2Code"] == null ? null : json["alpha2Code"],
alpha3Code: json["alpha3Code"] == null ? null : json["alpha3Code"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"countryName": countryName == null ? null : countryName,
"countryNameN": countryNameN == null ? null : countryNameN,
"nationality": nationality == null ? null : nationality,
"nationalityN": nationalityN == null ? null : nationalityN,
"countryCode": countryCode == null ? null : countryCode,
"alpha2Code": alpha2Code == null ? null : alpha2Code,
"alpha3Code": alpha3Code == null ? null : alpha3Code,
};
}

@ -0,0 +1,52 @@
import 'dart:convert';
VerifyEmail verifyEmailFromJson(String str) => VerifyEmail.fromJson(json.decode(str));
String verifyEmailToJson(VerifyEmail data) => json.encode(data.toJson());
class VerifyEmail {
Null? totalItemsCount;
Data? data;
int? messageStatus;
String? message;
VerifyEmail(
{this.totalItemsCount, this.data, this.messageStatus, this.message});
VerifyEmail.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['messageStatus'] = this.messageStatus;
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,26 @@
import 'dart:convert';
VerifyEmailOTP verifyEmailOTPFromJson(String str) => VerifyEmailOTP.fromJson(json.decode(str));
String verifyEmailOTPToJson(VerifyEmailOTP data) => json.encode(data.toJson());
class VerifyEmailOTP {
bool? success;
Null? errors;
VerifyEmailOTP({this.success, this.errors});
VerifyEmailOTP.fromJson(Map<String, dynamic> json) {
success = json['success'];
errors = json['errors'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['success'] = this.success;
data['errors'] = this.errors;
return data;
}
}

@ -0,0 +1,48 @@
import 'dart:convert';
PasswordOTPCompare otpCompareFromJson(String str) => PasswordOTPCompare.fromJson(json.decode(str));
String otpCompareToJson(PasswordOTPCompare data) => json.encode(data.toJson());
class PasswordOTPCompare {
dynamic totalItemsCount;
Data? data;
int? messageStatus;
String? message;
PasswordOTPCompare({this.totalItemsCount, this.data, this.messageStatus, this.message});
PasswordOTPCompare.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['messageStatus'] = this.messageStatus;
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,50 @@
import 'dart:convert';
PasswordOTPRequest otpRequestFromJson(String str) => PasswordOTPRequest.fromJson(json.decode(str));
String otpRequestToJson(PasswordOTPRequest data) => json.encode(data.toJson());
class PasswordOTPRequest {
dynamic totalItemsCount;
Data? data;
int? messageStatus;
String? message;
PasswordOTPRequest(
{this.totalItemsCount, this.data, this.messageStatus, this.message});
PasswordOTPRequest.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['messageStatus'] = this.messageStatus;
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,37 @@
// To parse this JSON data, do
//
// final imageResponse = imageResponseFromJson(jsonString);
import 'dart:convert';
ImageResponse imageResponseFromJson(String str) => ImageResponse.fromJson(json.decode(str));
String imageResponseToJson(ImageResponse data) => json.encode(data.toJson());
class ImageResponse {
ImageResponse({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
dynamic? totalItemsCount;
String? data;
int? messageStatus;
String? message;
factory ImageResponse.fromJson(Map<String, dynamic> json) => ImageResponse(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : json["data"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data,
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}

@ -0,0 +1,53 @@
// To parse this JSON data, do
//
// final loginPassword = loginPasswordFromJson(jsonString);
import 'dart:convert';
LoginPassword loginPasswordFromJson(String str) => LoginPassword.fromJson(json.decode(str));
String loginPasswordToJson(LoginPassword data) => json.encode(data.toJson());
class LoginPassword {
LoginPassword({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
dynamic totalItemsCount;
Data? data;
int? messageStatus;
String? message;
factory LoginPassword.fromJson(Map<String, dynamic> json) => LoginPassword(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class Data {
Data({
this.userToken,
});
String? userToken;
factory Data.fromJson(Map<String, dynamic> json) => Data(
userToken: json["userToken"] == null ? null : json["userToken"],
);
Map<String, dynamic> toJson() => {
"userToken": userToken == null ? null : userToken,
};
}

@ -0,0 +1,153 @@
// To parse this JSON data, do
//
// final registerUser = registerUserFromJson(jsonString);
import 'dart:convert';
RegisterUser registerUserFromJson(String str) => RegisterUser.fromJson(json.decode(str));
String registerUserToJson(RegisterUser data) => json.encode(data.toJson());
class RegisterUser {
RegisterUser({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
dynamic? totalItemsCount;
Data? data;
int? messageStatus;
String? message;
factory RegisterUser.fromJson(Map<String, dynamic> json) => RegisterUser(
totalItemsCount: json["totalItemsCount"],
data: Data.fromJson(json["data"]),
messageStatus: json["messageStatus"],
message: json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data!.toJson(),
"messageStatus": messageStatus,
"message": message,
};
}
class Data {
Data({
this.accessToken,
this.refreshToken,
this.expiryDate,
this.userInfo,
});
String? accessToken;
String? refreshToken;
DateTime? expiryDate;
UserInfo? userInfo;
factory Data.fromJson(Map<String, dynamic> json) => Data(
accessToken: json["accessToken"],
refreshToken: json["refreshToken"],
expiryDate: DateTime.parse(json["expiryDate"]),
userInfo: UserInfo.fromJson(json["userInfo"]),
);
Map<String, dynamic> toJson() => {
"accessToken": accessToken,
"refreshToken": refreshToken,
"expiryDate": expiryDate!.toIso8601String(),
"userInfo": userInfo!.toJson(),
};
}
class UserInfo {
UserInfo({
this.id,
this.userId,
this.firstName,
this.lastName,
this.mobileNo,
this.email,
this.userImageUrl,
this.roleId,
this.roleName,
this.isEmailVerified,
this.serviceProviderBranch,
this.isVerified,
this.userRoles,
this.isCustomer,
this.isProviderDealership,
this.isDealershipUser,
this.providerId,
this.customerId,
this.dealershipId,
});
int? id;
String? userId;
String? firstName;
String? lastName;
String? mobileNo;
String? email;
String? userImageUrl;
int? roleId;
String? roleName;
bool? isEmailVerified;
List<dynamic>? serviceProviderBranch;
bool? isVerified;
List<dynamic>? userRoles;
bool? isCustomer;
bool? isProviderDealership;
bool? isDealershipUser;
dynamic? providerId;
int? customerId;
dynamic? dealershipId;
factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(
id: json["id"],
userId: json["userID"],
firstName: json["firstName"],
lastName: json["lastName"],
mobileNo: json["mobileNo"],
email: json["email"],
userImageUrl: json["userImageUrl"],
roleId: json["roleID"],
roleName: json["roleName"],
isEmailVerified: json["isEmailVerified"],
serviceProviderBranch: List<dynamic>.from(json["serviceProviderBranch"].map((x) => x)),
isVerified: json["isVerified"],
userRoles: List<dynamic>.from(json["userRoles"].map((x) => x)),
isCustomer: json["isCustomer"],
isProviderDealership: json["isProviderDealership"],
isDealershipUser: json["isDealershipUser"],
providerId: json["providerID"],
customerId: json["customerID"],
dealershipId: json["dealershipID"],
);
Map<String, dynamic> toJson() => {
"id": id,
"userID": userId,
"firstName": firstName,
"lastName": lastName,
"mobileNo": mobileNo,
"email": email,
"userImageUrl": userImageUrl,
"roleID": roleId,
"roleName": roleName,
"isEmailVerified": isEmailVerified,
"serviceProviderBranch": List<dynamic>.from(serviceProviderBranch!.map((x) => x)),
"isVerified": isVerified,
"userRoles": List<dynamic>.from(userRoles!.map((x) => x)),
"isCustomer": isCustomer,
"isProviderDealership": isProviderDealership,
"isDealershipUser": isDealershipUser,
"providerID": providerId,
"customerID": customerId,
"dealershipID": dealershipId,
};
}

@ -0,0 +1,65 @@
// To parse this JSON data, do
//
// final role = roleFromJson(jsonString);
import 'dart:convert';
Role roleFromJson(String str) => Role.fromJson(json.decode(str));
String roleToJson(Role data) => json.encode(data.toJson());
class Role {
Role({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
int? totalItemsCount;
List<RoleData>? data;
int? messageStatus;
String? message;
factory Role.fromJson(Map<String, dynamic> json) => Role(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<RoleData>.from(json["data"].map((x) => RoleData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class RoleData {
RoleData({
this.id,
this.roleName,
this.roleNameN,
this.isActive,
});
int? id;
String? roleName;
String? roleNameN;
bool? isActive;
factory RoleData.fromJson(Map<String, dynamic> json) => RoleData(
id: json["id"] == null ? null : json["id"],
roleName: json["roleName"] == null ? null : json["roleName"],
roleNameN: json["roleNameN"] == null ? null : json["roleNameN"],
isActive: json["isActive"] == null ? null : json["isActive"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"roleName": roleName == null ? null : roleName,
"roleNameN": roleNameN == null ? null : roleNameN,
"isActive": isActive == null ? null : isActive,
};
}

@ -0,0 +1,153 @@
// To parse this JSON data, do
//
// final user = userFromJson(jsonString);
import 'dart:convert';
User userFromJson(String str) => User.fromJson(json.decode(str));
String userToJson(User data) => json.encode(data.toJson());
class User {
User({
this.totalItemsCount,
this.data,
this.messageStatus,
this.message,
});
dynamic totalItemsCount;
Data? data;
int? messageStatus;
String? message;
factory User.fromJson(Map<String, dynamic> json) => User(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class Data {
Data({
this.accessToken,
this.refreshToken,
this.expiryDate,
this.userInfo,
});
String? accessToken;
String? refreshToken;
DateTime? expiryDate;
UserInfo? userInfo;
factory Data.fromJson(Map<String, dynamic> json) => Data(
accessToken: json["accessToken"] == null ? null : json["accessToken"],
refreshToken: json["refreshToken"] == null ? null : json["refreshToken"],
expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]),
userInfo: json["userInfo"] == null ? null : UserInfo.fromJson(json["userInfo"]),
);
Map<String, dynamic> toJson() => {
"accessToken": accessToken == null ? null : accessToken,
"refreshToken": refreshToken == null ? null : refreshToken,
"expiryDate": expiryDate == null ? null : expiryDate!.toIso8601String(),
"userInfo": userInfo == null ? null : userInfo!.toJson(),
};
}
class UserInfo {
UserInfo({
this.id,
this.userId,
this.firstName,
this.lastName,
this.mobileNo,
this.email,
this.userImageUrl,
this.roleId,
this.roleName,
this.isEmailVerified,
this.serviceProviderBranch,
this.isVerified,
this.userRoles,
this.isCustomer,
this.isProviderDealership,
this.isDealershipUser,
this.providerId,
this.customerId,
this.dealershipId,
});
int? id;
String? userId;
String? firstName;
String? lastName;
String? mobileNo;
String? email;
dynamic userImageUrl;
int? roleId;
String? roleName;
bool? isEmailVerified;
List<dynamic>? serviceProviderBranch;
bool? isVerified;
List<dynamic>? userRoles;
bool? isCustomer;
bool? isProviderDealership;
bool? isDealershipUser;
dynamic providerId;
int? customerId;
dynamic dealershipId;
factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(
id: json["id"] == null ? null : json["id"],
userId: json["userID"] == null ? null : json["userID"],
firstName: json["firstName"] == null ? null : json["firstName"],
lastName: json["lastName"] == null ? null : json["lastName"],
mobileNo: json["mobileNo"] == null ? null : json["mobileNo"],
email: json["email"] == null ? null : json["email"],
userImageUrl: json["userImageUrl"],
roleId: json["roleID"] == null ? null : json["roleID"],
roleName: json["roleName"] == null ? null : json["roleName"],
isEmailVerified: json["isEmailVerified"] == null ? null : json["isEmailVerified"],
serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<dynamic>.from(json["serviceProviderBranch"].map((x) => x)),
isVerified: json["isVerified"] == null ? null : json["isVerified"],
userRoles: json["userRoles"] == null ? null : List<dynamic>.from(json["userRoles"].map((x) => x)),
isCustomer: json["isCustomer"] == null ? null : json["isCustomer"],
isProviderDealership: json["isProviderDealership"] == null ? null : json["isProviderDealership"],
isDealershipUser: json["isDealershipUser"] == null ? null : json["isDealershipUser"],
providerId: json["providerID"],
customerId: json["customerID"] == null ? null : json["customerID"],
dealershipId: json["dealershipID"],
);
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"userID": userId == null ? null : userId,
"firstName": firstName == null ? null : firstName,
"lastName": lastName == null ? null : lastName,
"mobileNo": mobileNo == null ? null : mobileNo,
"email": email == null ? null : email,
"userImageUrl": userImageUrl,
"roleID": roleId == null ? null : roleId,
"roleName": roleName == null ? null : roleName,
"isEmailVerified": isEmailVerified == null ? null : isEmailVerified,
"serviceProviderBranch": serviceProviderBranch == null ? null : List<dynamic>.from(serviceProviderBranch!.map((x) => x)),
"isVerified": isVerified == null ? null : isVerified,
"userRoles": userRoles == null ? null : List<dynamic>.from(userRoles!.map((x) => x)),
"isCustomer": isCustomer == null ? null : isCustomer,
"isProviderDealership": isProviderDealership == null ? null : isProviderDealership,
"isDealershipUser": isDealershipUser == null ? null : isDealershipUser,
"providerID": providerId,
"customerID": customerId == null ? null : customerId,
"dealershipID": dealershipId,
};
}

@ -0,0 +1,53 @@
import 'dart:convert';
VerifyEmail verifyEmailFromJson(String str) => VerifyEmail.fromJson(json.decode(str));
String verifyEmailToJson(VerifyEmail data) => json.encode(data.toJson());
class VerifyEmail {
Null? totalItemsCount;
Data? data;
int? messageStatus;
String? message;
VerifyEmail(
{this.totalItemsCount, this.data, this.messageStatus, this.message});
VerifyEmail.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['totalItemsCount'] = this.totalItemsCount;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['messageStatus'] = this.messageStatus;
data['message'] = this.message;
return data;
}
}
class Data {
String? userToken;
Data({this.userToken});
Data.fromJson(Map<String, dynamic> json) {
userToken = json['userToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userToken'] = this.userToken;
return data;
}
}

@ -0,0 +1,27 @@
import 'dart:convert';
VerifyEmailOTP verifyEmailOTPFromJson(String str) => VerifyEmailOTP.fromJson(json.decode(str));
String verifyEmailOTPToJson(VerifyEmailOTP data) => json.encode(data.toJson());
class VerifyEmailOTP {
bool? success;
Null? errors;
VerifyEmailOTP({this.success, this.errors});
VerifyEmailOTP.fromJson(Map<String, dynamic> json) {
success = json['success'];
errors = json['errors'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['success'] = this.success;
data['errors'] = this.errors;
return data;
}
}

@ -0,0 +1,264 @@
import 'package:car_customer_app/api/shared_prefrence.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import '../../api/client/user_api_client.dart';
import '../../classes/app_state.dart';
import '../../classes/consts.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
import '../../classes/utils.dart';
import '../../config/routes.dart';
import '../../models/user/image_response.dart';
import '../../utils/utils.dart';
class DashboardPage extends StatefulWidget {
@override
State<DashboardPage> createState() => _DashboardPageState();
}
class _DashboardPageState extends State<DashboardPage> {
String userName = "";
// void _handleURLButtonPress(BuildContext context, var type) {
// Navigator.push(context,
// MaterialPageRoute(builder: (context) => ImageFromGalleryEx(type)));
// }
File? imagePicked;
String image64 = "";
final _picker = ImagePicker();
@override
void initState() {
// TODO: implement initState
super.initState();
fetchUsername();
}
fetchUsername() async {
userName = await SharedPrefManager.getPhoneOrEmail();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(
title: "Logo/Brand",
),
drawer: showDrawer(context),
body: Container(
child: Center(
child: LocaleKeys.dashboard.tr().toText24(),
),
),
);
}
Widget showDrawer(BuildContext context) {
return Drawer(
child: Container(
child: Column(
children: [
Stack(children: [
Container(
width: double.infinity,
height: 200,
color: accentColor.withOpacity(0.3),
child: Image.network(ApiConsts.baseUrlServices + AppState().getUser.data!.userInfo!.userImageUrl.toString()),
),
Positioned(
top: 10,
right: 10,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Column(
children: [
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(30),
),
child: Icon(
Icons.edit,
color: Colors.blue,
).onPress(() {
_openImagePicker();
// _handleURLButtonPress(context, ImageSourceType.camera);
}),
),
12.height,
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(30),
),
child: Icon(
Icons.delete,
color: Colors.blue,
).onPress(() async {
Utils.showLoading(context);
ImageResponse response = await UserApiClent().UpdateUserImage("");
if (response.messageStatus == 1) {
Utils.showToast( LocaleKeys.imageDeleted.tr());
//("Image is Deleted");
setState(() {
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
});
}
Utils.hideLoading(context);
}),
),
],
),
],
),
)
]),
Container(
width: double.infinity,
color: accentColor.withOpacity(0.1),
padding: EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
userName.toText24(),
LocaleKeys.userRoleOrTitle.tr().toText12(),
],
),
),
ShowFillButton(
title:LocaleKeys.edit.tr(),
onPressed: () {
navigateWithName(context, AppRoutes.editAccoundPage);
},
),
],
),
),
ListTile(
leading: Icon(Icons.notifications),
title: LocaleKeys.notifications.tr().toText12(),
),
ListTile(
leading: Icon(Icons.settings),
title: LocaleKeys.general.tr().toText12(),
),
ListTile(
leading: Icon(Icons.person),
title: LocaleKeys.account.tr().toText12(),
),
ListTile(
leading: Icon(Icons.logout),
title: LocaleKeys.signOut.tr().toText12(),
onTap: () {
pop(context);
pop(context);
},
),
],
),
),
);
}
void _openImagePicker() {
showDialog<ImageSource>(
context: context,
builder: (context) => AlertDialog(content: Text("Choose image source"), actions: [
FlatButton(child: Text("Camera"), onPressed: () => cameraImage()),
FlatButton(child: Text("Gallery"), onPressed: () => gallaryImage()),
]),
// .then((ImageSource source) async {
// if (source != null) {
// final pickedFile = await ImagePicker().getImage(source: source);
// setState(() => imagePicked = File(pickedFile.path));
// }
// }
);
}
void gallaryImage() async {
final picker = ImagePicker();
final pickedImage = await picker.pickImage(
source: ImageSource.gallery,
);
final pickedImageFile = File(pickedImage!.path);
int sizeInBytes = pickedImageFile.lengthSync();
// double sizeInMb = sizeInBytes / (1024 * 1024);
if (sizeInBytes > 1000) {
Utils.showToast(LocaleKeys.fileLarger.tr());
//("File is larger then 1KB");
} else {
image64 = convertFileToBase64(pickedImageFile);
Utils.showLoading(context);
ImageResponse response = await UserApiClent().UpdateUserImage(image64);
Utils.hideLoading(context);
Navigator.pop(context);
if (response.messageStatus == 1) {
Utils.showToast(LocaleKeys.imageUploaded.tr());
//("Image is uploaded");
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
} else {
Utils.showToast(response.message ?? "");
}
setState(() {
imagePicked = pickedImageFile;
});
}
}
void cameraImage() async {
final picker = ImagePicker();
final pickedImage = await picker.pickImage(
source: ImageSource.camera,
);
final pickedImageFile = File(pickedImage!.path);
int sizeInBytes = pickedImageFile.lengthSync();
// double sizeInMb = sizeInBytes / (1024 * 1024);
if (sizeInBytes > 1000) {
Utils.showToast(LocaleKeys.fileLarger.tr());
//("File is larger then 1KB");
} else {
image64 = convertFileToBase64(pickedImageFile);
Utils.showLoading(context);
ImageResponse response = await UserApiClent().UpdateUserImage(image64);
Utils.hideLoading(context);
Navigator.pop(context);
if (response.messageStatus == 1) {
Utils.showToast(LocaleKeys.imageUploaded.tr());
//("Image is uploaded");
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
} else {
Utils.showToast(response.message ?? "");
}
setState(() {
imagePicked = pickedImageFile;
});
}
}
}

@ -0,0 +1,120 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/change_email.dart';
import 'package:car_customer_app/models/user/confirm_email.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
class ChangeEmailPage extends StatefulWidget {
@override
State<ChangeEmailPage> createState() => _ChangeEmailPageState();
}
class _ChangeEmailPageState extends State<ChangeEmailPage> {
String password = "";
String email = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.changeEmail.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.enterEmail.tr().toText24(),
12.height,
TextFormField(
decoration: InputDecoration(
hintText: LocaleKeys.enterNewEmail,
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: false,
onChanged: (v) => email = v,
),
12.height,
TextFormField(
decoration: InputDecoration(
hintText: LocaleKeys.enterCurrentPassword.tr(),
// hintText: "Enter Current Password ",
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => password = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
width: double.infinity,
onPressed: () {
changeEmail(context);
},
),
],
),
),
),
);
}
Future<void> changeEmail(BuildContext context) async {
Utils.showLoading(context);
ChanEmail otpRequest = await UserApiClent().ChangeEmailOTPRequest(email, password);
Utils.hideLoading(context);
if (otpRequest.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
ConfirmEmail otpCompare = await UserApiClent().ChangeEmail(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.emailChangedSuccessfully.tr(),
//"Email is Changed Successfully",
onClick: () {
Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route<dynamic> route) => false);
},
),
);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
}

@ -0,0 +1,124 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/change_mobile.dart';
import 'package:car_customer_app/models/user/confirm_mobile.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
class ChangeMobilePage extends StatefulWidget {
@override
State<ChangeMobilePage> createState() => _ChangeMobilePageState();
}
class _ChangeMobilePageState extends State<ChangeMobilePage> {
int countryID=1 ;
String mobileNo = '';
String password = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.changeMobile.tr(),),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.enterNewPhoneNumber.tr().toText24(),
12.height,
TextFormField(
decoration: InputDecoration(
//hintText: "Enter New Phone Number",
hintText: LocaleKeys.enterNewPhoneNumber.tr(),
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: false,
onChanged: (v) => mobileNo = v,
),
12.height,
TextFormField(
decoration: InputDecoration(
hintText: LocaleKeys.enterCurrentPassword.tr(),
// hintText: "Enter Current Password",
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => password = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
width: double.infinity,
onPressed: () {
changeMobile(context);
},
),
],
),
),
),
);
}
Future<void> changeMobile(BuildContext context) async {
Utils.showLoading(context);
ChangeMobile otpRequest = await UserApiClent().ChangeMobileNoOTPRequest(countryID, mobileNo, password);
Utils.hideLoading(context);
if (otpRequest.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
ConfirmMobile otpCompare = await UserApiClent().ChangeMobileNo(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
showMDialog(
context,
child: MessageDialog(
title:LocaleKeys.phoneNumberVerified.tr(),
//"Phone Number Verified",
onClick: () {
Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route<dynamic> route) => false);
},
),
);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
}

@ -0,0 +1,118 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/change_password.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
import '../../models/m_response.dart';
class ChangePasswordPage extends StatefulWidget {
ChangePasswordPage({Key? key}) : super(key: key);
@override
State<ChangePasswordPage> createState() => _ChangePasswordPageState();
}
class _ChangePasswordPageState extends State<ChangePasswordPage> {
String newPassword = "";
String currentPasswor = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.changePassword.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.enterNewPassword.tr().toText24(),
12.height,
TextFormField(
decoration: InputDecoration(
// hintText: "Enter Old Password",
hintText: LocaleKeys.enterOldPassword.tr(),
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => currentPasswor = v,
),
12.height,
TextFormField(
decoration: InputDecoration(
//hintText: "Enter New Password",
hintText: LocaleKeys.enterNewPassword.tr(),
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => newPassword = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
width: double.infinity,
onPressed: () {
changePassword(context);
},
),
],
),
),
),
);
}
Future<void> changePassword(BuildContext context) async {
if (validateStructure(newPassword ?? "")) {
Utils.showLoading(context);
MResponse res = await UserApiClent().ChangePassword(currentPasswor, newPassword);
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.passwordIsUpdated.tr());
//("Password is Updated");
// navigateWithName(context, AppRoutes.loginWithPassword);
Navigator.of(context)
.pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route<dynamic> route) => false);
} else {
Utils.showToast(res.message ?? "");
}
} else {
Utils.showToast(LocaleKeys.passwordShouldContains.tr());
//("Password Should contains Character, Number, Capital and small letters");
}
}
bool validateStructure(String value) {
String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{6,}$';
RegExp regExp = new RegExp(pattern);
return regExp.hasMatch(value);
}
}

@ -0,0 +1,287 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_password_strength/flutter_password_strength.dart';
class CompleteProfilePage extends StatefulWidget {
RegisterUser user;
CompleteProfilePage(this.user);
@override
State<CompleteProfilePage> createState() => _CompleteProfilePageState();
}
class _CompleteProfilePageState extends State<CompleteProfilePage> {
String? firstName = "",
lastName = "",
email = "",
confirmPassword = "";
late String password = "";
bool isChecked = false;
double _strength = 0;
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.signUp.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(20),
child: Column(
children: [
LocaleKeys.completeProfile.tr().toText24(),
12.height,
TxtField(
hint: LocaleKeys.firstName.tr(),
value: firstName,
onChanged: (v) {
firstName = v;
},
),
12.height,
TxtField(
hint: LocaleKeys.surname.tr(),
value: lastName,
onChanged: (v) {
lastName = v;
},
),
12.height,
TxtField(
hint: LocaleKeys.email.tr(),
value: email,
// isButtonEnable: email!.length > 0 ? true : false,
buttonTitle: LocaleKeys.verify.tr(),
onChanged: (v) {
email = v;
},
),
12.height,
TxtField(
hint: LocaleKeys.createPass.tr(),
isPasswordEnabled: true,
maxLines: 1,
value: password,
onChanged: (value) => _checkPassword(value),
// onChanged: (v) {
// password = v;
// },
),
password!.isNotEmpty ? 12.height : 0.height,
// The strength indicator bar
password!.isNotEmpty ? LinearProgressIndicator(
value: _strength,
backgroundColor: Colors.grey[300],
color: _strength <= 1 / 4
? Colors.yellow
: _strength == 2 / 4
? Colors.orange
: _strength == 3 / 4
? Colors.deepOrange
: Colors.red,
minHeight: 4,
): Container(),
// The message about the strength of the entered password
Text(
_displayText,
style: const TextStyle(fontSize: 12),
),
12.height,
TxtField(
hint: LocaleKeys.confirmPass.tr(),
isPasswordEnabled: true,
maxLines: 1,
value: confirmPassword,
onChanged: (v) {
confirmPassword = v;
},
),
// 12.height,
// TxtField(
// hint: "Phone Number",
// ),
50.height,
Row(
children: [
buildCheckbox(),
LocaleKeys.termsOfService.tr().toText12(),
],
),
16.height,
ShowFillButton(
title: LocaleKeys.continu.tr(),
width: double.infinity,
onPressed: () {
if (validation()) performCompleteProfile();
},
),
],
),
),
),
),
);
}
Widget buildCheckbox() =>
Checkbox(
value: isChecked,
activeColor: Colors.blue,
onChanged: (value) {
setState(() {
isChecked = value!;
});
},
);
// Future<void> performCompleteProfile() async {
// if(validateStructure(password??"")){
// if (password == confirmPassword) {
// print(widget.user.data!.userId??"userId");
// Utils.showLoading(context);
// RegisterUser user = await UserApiClent().basicComplete(widget.user.data?.userId ?? "", firstName!, lastName!, email!, password!);
// Utils.hideLoading(context);
// if (user.messageStatus == 1) {
// Utils.showToast( "Successfully registered, Please login once");
// pop(context);
// // pop(context);
// // navigateReplaceWithName(context, AppRoutes.dashboard,arguments: user);
// } else {
// Utils.showToast(user.message ?? "");
// }
// } else {
// Utils.showToast("Please enter same password");
// }
// }else{
// Utils.showToast("Password Should contains character, Number, Capital and small letters");
// }
//
// }
Future<void> performCompleteProfile() async {
if (validateStructure(password ?? "")) {
if (password == confirmPassword) {
print(widget.user.data!.userInfo!.userId ?? "userId");
Utils.showLoading(context);
RegisterUser user = await UserApiClent().basicComplete(widget.user.data?.userInfo!.userId ?? "", firstName!, lastName!, email!, password!);
Utils.hideLoading(context);
if (user.messageStatus == 1) {
Utils.showToast(LocaleKeys.successfullyRegistered.tr());
//("Successfully Registered, Please login once");
pop(context);
// navigateReplaceWithName(context, AppRoutes.dashboard,arguments: user);
} else {
Utils.showToast(user.message ?? "");
}
} else {
Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr());
//("Please enter same password");
}
} else {
Utils.showToast(LocaleKeys.passwordShouldContains.tr());
//("Password Should contains Character, Number, Capital and small letters");
}
}
bool validateStructure(String value) {
String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{6,}$';
RegExp regExp = new RegExp(pattern);
return regExp.hasMatch(value);
}
bool isEmail(String em) {
String p = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
RegExp regExp = new RegExp(p);
return regExp.hasMatch(em);
}
bool validation() {
bool isValid = true;
if (firstName!.isEmpty) {
Utils.showToast(LocaleKeys.firstNameMandatory.tr());
//("First name is mandatory");
isValid = false;
} else if (lastName!.isEmpty) {
Utils.showToast(LocaleKeys.surnameNameMandatory.tr());
//("Surname is mandatory");
isValid = false;
} else if (email!.isNotEmpty) {
if (!isEmail(email!)) {
Utils.showToast(LocaleKeys.enterValidEmail.tr());
//("Enter Valid Email");
isValid = false;
}
} else if (password!.isEmpty) {
Utils.showToast(LocaleKeys.passwordNameMandatory.tr());
//("Password is mandatory");
isValid = false;
} else if (!isChecked) {
Utils.showToast(LocaleKeys.pleaseAcceptTerms.tr());
//("Please accept terms");
isValid = false;
}
return isValid;
}
RegExp numReg = RegExp(r".*[0-9].*");
RegExp letterReg = RegExp(r".*[A-Za-z].*");
String _displayText = '';
void _checkPassword(String value) {
password = value.trim();
if (password!.length <= 6) {
setState(() {
_strength = 1 / 4;
_displayText = 'Your password is too short';
});
} else if (password!.length < 8) {
setState(() {
_strength = 2 / 4;
_displayText = 'Your password is acceptable but not strong';
});
} else {
if (!letterReg.hasMatch(password!) || !numReg.hasMatch(password!)) {
setState(() {
_strength = 3 / 4;
_displayText = 'Your password is strong';
});
} else {
setState(() {
_strength = 1;
_displayText = 'Your password is very strong';
});
}
}
}
}

@ -0,0 +1,76 @@
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
import '../../api/client/user_api_client.dart';
class ConfirmNewPasswordPage extends StatelessWidget {
String userToken;
ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key);
String newPassword = "";
// String userToken = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.forgetPassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.newPassword.tr().toText24(),
12.height,
TxtField(
// hint: "Enter New Password",
hint: LocaleKeys.enterNewPassword.tr(),
value: newPassword,
onChanged: (v) {
newPassword = v;
},
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
width: double.infinity,
onPressed: () {
confirmPasswordOTP(context);
},
),
],
),
),
);
}
Future<void> confirmPasswordOTP(BuildContext context) async {
Utils.showLoading(context);
Response res = await UserApiClent().ForgetPassword(userToken, newPassword);
Utils.hideLoading(context);
ConfirmPassword data = ConfirmPassword.fromJson(jsonDecode(res.body));
if (data.messageStatus == 1) {
navigateWithName(context, AppRoutes.loginWithPassword);
} else {
Utils.showToast(data.message ?? "");
}
}
}

@ -0,0 +1,125 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
class ConfirmNewPasswordPage extends StatefulWidget {
String userToken;
ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key);
@override
State<ConfirmNewPasswordPage> createState() => _ConfirmNewPasswordPageState();
}
class _ConfirmNewPasswordPageState extends State<ConfirmNewPasswordPage> {
String newPassword = "";
String confirmPassword = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.forgetPassword.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.newPassword.toText24(),
12.height,
TextFormField(
decoration: InputDecoration(
// hintText: "Enter New Password",
hintText: LocaleKeys.enterNewPassword.tr(),
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => newPassword = v,
),
12.height,
TextFormField(
decoration: InputDecoration(
// hintText: "Confirm Password",
hintText: LocaleKeys.confirmPassword.tr(),
hintStyle: TextStyle(color: Colors.grey),
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
const Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => confirmPassword = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
width: double.infinity,
onPressed: () {
if (validation()) confirmPasswordOTP(context);
},
),
],
),
),
),
);
}
Future<void> confirmPasswordOTP(BuildContext context) async {
if(validateStructure(newPassword??"")){
Utils.showLoading(context);
Response res = await UserApiClent().ForgetPassword(widget.userToken, newPassword);
Utils.hideLoading(context);
ConfirmPassword data = ConfirmPassword.fromJson(jsonDecode(res.body));
if (data.messageStatus == 1) {
Utils.showToast(LocaleKeys.passwordIsUpdated.tr());
//("Password is Updated");
navigateWithName(context, AppRoutes.loginWithPassword);
} else {
Utils.showToast(data.message ?? "");
}
}else{
Utils.showToast(LocaleKeys.passwordShouldContains.tr());
//("Password Should contains Character, Number, Capital and small letters");
}
}
bool validation() {
bool isValid = true;
if (newPassword != confirmPassword) {
Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr());
isValid = false;
}
return isValid;
}
bool validateStructure(String value){
String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{6,}$';
RegExp regExp = new RegExp(pattern);
return regExp.hasMatch(value);
}
}

@ -0,0 +1,161 @@
import 'dart:convert';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/user/verify_email.dart';
import 'package:car_customer_app/models/user/verify_email_otp.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class EditAccountPage extends StatefulWidget {
@override
State<EditAccountPage> createState() => _EditAccountPageState();
}
class _EditAccountPageState extends State<EditAccountPage> {
String userID = "";
String email = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.editAccount.tr(),),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
20.height,
ListTile(
leading: SvgPicture.asset("assets/images/ic_lock.svg"),
title: LocaleKeys.changePassword.tr().toText12(),
onTap: () {
navigateWithName(context, AppRoutes.changePassword);
},
),
15.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
SvgPicture.asset("assets/images/ic_mobile.svg"),
LocaleKeys.changeMobile.tr().toText12(),
LocaleKeys.verify.tr().toText12(),
RaisedButton(
onPressed: () {
navigateWithName(context, AppRoutes.changeMobilePage);
},
child: Text(
LocaleKeys.change.tr(),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
color: Colors.blue,
textColor: Colors.white,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8))
],
),
20.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Icon(
Icons.email,
color: Colors.blue,
),
LocaleKeys.changeEmail.tr().toText12(),
InkWell(
child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? LocaleKeys.verified.tr() : LocaleKeys.verify.tr()).toText12(),
onTap: (AppState().getUser.data!.userInfo!.isEmailVerified ?? false)
? null
: () {
verifyEmail(context);
},
),
RaisedButton(
onPressed: () {
navigateWithName(context, AppRoutes.changeEmailPage);
},
child: Text(
LocaleKeys.change.tr(),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
color: Colors.blue,
textColor: Colors.white,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8))
],
)
// ListTile(
// leading: SvgPicture.asset("assets/images/ic_mobile.svg"),
// title: "Change Mobile".toText12(),
// onTap: () {
// navigateWithName(context, AppRoutes.changeMobilePage);
// },
// ),
// ListTile(
// leading: Icon(Icons.email_outlined, color: Colors.blue,),
// title: "Change Email".toText12(),
// onTap: () {
// navigateWithName(context, AppRoutes.changeEmailPage);
// },
// ),
],
),
),
);
}
Future<void> verifyEmail(BuildContext context) async {
Utils.showLoading(context);
VerifyEmail otpRequest = await UserApiClent().EmailVerify(email, userID);
Utils.hideLoading(context);
if (otpRequest.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
MResponse otpCompare = await UserApiClent().EmailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
AppState().getUser.data!.userInfo!.isEmailVerified = true;
setState(() {});
Utils.showToast(LocaleKeys.emailVerified.tr());
//("Email is verified successfully");
// Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.dashboard, (Route<dynamic> route) => false);
// showMDialog(
// context,
// child: MessageDialog(
// title: "Email is Verified",
// onClick: () {
// Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.dashboard, (Route<dynamic> route) => false);
// },
// ),
// );
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
}

@ -0,0 +1,97 @@
import 'dart:convert';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class ForgetPasswordMethodPage extends StatefulWidget {
String userToken;
ForgetPasswordMethodPage(this.userToken);
@override
State<ForgetPasswordMethodPage> createState() => _ForgetPasswordMethodPageState();
}
class _ForgetPasswordMethodPageState extends State<ForgetPasswordMethodPage> {
int otpType = 1;
String userOTP = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.forgetPassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.selectMethod.tr().toText24(),
12.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
forgetPasswordOTPMethod(context);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
forgetPasswordOTPMethod(context);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png",
),
),
],
),
mFlex(10),
],
),
),
);
}
Future<void> forgetPasswordOTPMethod(BuildContext context) async {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response res = await UserApiClent().ForgetPasswordOTPCompare(widget.userToken?? "", code);
Utils.hideLoading(context);
PasswordOTPCompare otpCompare = PasswordOTPCompare.fromJson(jsonDecode(res.body));
if (otpCompare.messageStatus == 1) {
var userToken = otpCompare.data!.userToken;
navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
}
}

@ -0,0 +1,177 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/api/shared_prefrence.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/forget_password_otp_request.dart';
import 'package:car_customer_app/pages/user/vertify_password_page.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:car_customer_app/models/user/user.dart';
import 'dart:convert';
import 'package:http/http.dart';
import '../../models/user/country.dart';
import '../../widgets/dropdown/dropdow_field.dart';
import '../../widgets/tab/login_email_tab.dart';
class ForgetPasswordPage extends StatefulWidget {
@override
State<ForgetPasswordPage> createState() => _ForgetPasswordPageState();
}
class _ForgetPasswordPageState extends State<ForgetPasswordPage> {
int otpType = 1;
String userName = "";
ClassType type = ClassType.NUMBER;
Country? _country;
String countryCode = "";
@override
void initState() {
super.initState();
getCountryList();
}
getCountryList() async {
_country = await UserApiClent().getAllCountries();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.changePassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
mFlex(1),
LoginEmailTab(
onSelection: (ClassType type) {
setState(() {
this.type = type;
});
},
),
50.height,
LocaleKeys.retrievePassword.tr().toText24(),
12.height,
type == ClassType.NUMBER ? Column(children: [
getCountry(),
TxtField(
hint: "5********",
value: userName,
onChanged: (v) {
userName = v;
},
keyboardType: TextInputType.number,
)
],) : TxtField(
hint: LocaleKeys.emailAddress.tr(),
//"Email Address",
value: userName,
onChanged: (v) {
userName = v;
},
),
50.height,
ShowFillButton(
title: LocaleKeys.continu.tr(),
width: double.infinity,
onPressed: () {
if (userName.isNum() && type==ClassType.NUMBER) {
forgetPasswordPhoneOTP(context);
} else if (userName.isValidEmail() && type==ClassType.EMAIL) {
forgetPasswordEmailOTP(context);
}
},
),
mFlex(10),
],
),
),
);
}
Widget getCountry() {
if (_country != null) {
List<DropValue> dropList = [];
_country!.data?.forEach((element) {
dropList.add(new DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? ""));
});
return Padding(
padding: const EdgeInsets.all(2.0),
child: DropdownField((DropValue value) {
countryCode = value.subValue;
}, list: dropList, hint: LocaleKeys.selectCountryCode.tr()),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}
Future<void> forgetPasswordPhoneOTP(BuildContext context) async {
Utils.showLoading(context);
Response response = await UserApiClent().ForgetPasswordOTPRequest(countryCode+userName, otpType);
Utils.hideLoading(context);
PasswordOTPRequest otpRequest = PasswordOTPRequest.fromJson(jsonDecode(response.body));
if (otpRequest.messageStatus == 1) {
var userToken = otpRequest.data!.userToken;
navigateReplaceWithName(context, AppRoutes.forgetPasswordMethodPage, arguments: userToken);
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
Future<void> forgetPasswordEmailOTP(BuildContext context) async {
Utils.showLoading(context);
Response response = await UserApiClent().ForgetPasswordOTPRequest(userName, otpType);
Utils.hideLoading(context);
PasswordOTPRequest otpRequest = PasswordOTPRequest.fromJson(jsonDecode(response.body));
if (otpRequest.messageStatus == 1) {
Utils.showToast(LocaleKeys.codeSentToEmail.tr());
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response res = await UserApiClent().ForgetPasswordOTPCompare(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
PasswordOTPCompare otpCompare = PasswordOTPCompare.fromJson(jsonDecode(res.body));
if (otpCompare.messageStatus == 1) {
var userToken = otpCompare.data!.userToken;
print("token is ________");
print(userToken);
navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
}

@ -0,0 +1,138 @@
import 'dart:convert';
import 'package:car_customer_app/api/shared_prefrence.dart';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/login_password.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/models/user/user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class LoginMethodSelectionPage extends StatelessWidget {
String userToken;
LoginMethodSelectionPage(this.userToken);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.loginSelection.tr().toText24(),
mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face_id.png",
),
),
],
),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
// navigateWithName(context, AppRoutes.dashboard);
performBasicOtp(context);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png",
),
),
],
),
mFlex(10),
],
),
),
);
}
Future<void> performBasicOtp(BuildContext context) async {
Utils.showLoading(context);
Response response = await UserApiClent().login_V2_OTP(userToken, "1");
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await UserApiClent().login_V2_OTPVerify(user.data!.userToken??"", code);
Utils.hideLoading(context);
RegisterUser verifiedUser = RegisterUser.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
Utils.showLoading(context);
Response res = await UserApiClent().RefreshToken(verifiedUser.data.toString()??"", verifiedUser.data.toString()??"");
Utils.hideLoading(context);
User user = User.fromJson(jsonDecode(response2.body));
if(user.data!.userInfo!.roleId==4){
AppState().setUser = user;
SharedPrefManager.setUserToken(user.data!.accessToken ?? "");
SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? "");
navigateReplaceWithName(context, AppRoutes.dashboard);
}else{
Utils.showToast(LocaleKeys.onlyCustomerApp.tr());
//("Sorry, Only Customer's can log in this app");
}
} else {
Utils.showToast(verifiedUser.message??"");
}
},
));
} else {
Utils.showToast(user.message ?? "");
}
}
}

@ -0,0 +1,182 @@
import 'dart:convert';
import 'package:car_customer_app/api/shared_prefrence.dart';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/login_password.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/models/user/user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class LoginVerificationPage extends StatefulWidget {
@override
State<LoginVerificationPage> createState() => _LoginVerificationPageState();
}
class _LoginVerificationPageState extends State<LoginVerificationPage> {
String userToken = "";
@override
void initState() {
// TODO: implement initState
super.initState();
performApiCall();
}
performApiCall() async {
String userName = await SharedPrefManager.getPhoneOrEmail();
String password = await SharedPrefManager.getUserPassword();
if (userName.isNotEmpty && userName.isNotEmpty) {
Utils.showLoading(context);
Response response = await UserApiClent().login_V1(userName, password);
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
userToken = user.data!.userToken ?? "";
// navigateWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken);
} else {
Utils.showToast(user.message ?? "");
}
}
}
Future<void> performBasicOtp(BuildContext context, String userToken) async {
Utils.showLoading(context);
Response response = await UserApiClent().login_V2_OTP(userToken, "1");
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await UserApiClent().login_V2_OTPVerify(user.data!.userToken ?? "", code);
Utils.hideLoading(context);
RegisterUser verifiedUser = RegisterUser.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
User user = User.fromJson(jsonDecode(response2.body));
AppState().setUser = user;
print(user.data!.userInfo!.providerId.toString());
navigateReplaceWithName(context, AppRoutes.dashboard);
} else {
Utils.showToast(verifiedUser.message ?? "");
}
},
));
} else {
Utils.showToast(user.message ?? "");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyAccount.tr().toText24(),
mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
},
title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
},
title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face_id.png",
),
),
],
),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png",
),
),
],
),
mFlex(10),
],
),
),
);
}
// Future<void> performBasicOtp(BuildContext context) async {
// Utils.showLoading(context);
// String userToken=await SharedPrefManager.getUserToken();
// Response response = await UserApiClent().login_V2_OTP(userToken, "1");
// Utils.hideLoading(context);
// if (response.statusCode == 200) {
// String userToken = jsonDecode(response.body)["token"];
// showMDialog(context, child: OtpDialog(
// onClick: (String code) async {
// pop(context);
// Utils.showLoading(context);
// Response response2 = await UserApiClent().login_V2_OTPVerify(userToken, code);
// Utils.hideLoading(context);
// if (response2.statusCode == 200) {
// User user = User.fromJson(jsonDecode(response2.body));
// SharedPrefManager.setUserToken(user.data!.accessToken ?? "");
// SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? "");
// navigateWithName(context, AppRoutes.dashboard);
// } else {
// Utils.showToast("Something went wrong");
// }
// },
// ));
// } else {
// String res = jsonDecode(response.body)["errors"][0] ?? "";
// Utils.showToast(res);
// }
// }
}

@ -0,0 +1,147 @@
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
class LoginVerifyAccountPage extends StatelessWidget {
int otpType = 1;
String phoneNum = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyAccount.tr().toText24(),
mFlex(1),
TxtField(
hint: "966501234567",
value: phoneNum,
onChanged: (v) {
phoneNum = v;
},
),
mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
performBasicOtp(context);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) {
// pop(context);
// delay(300).then(
// (value) => showMDialog(
// context,
// child: MessageDialog(
// title: "Phone Number Verified",
// onClick: () {
// otpType=1;
// performBasicOtp(context);
// // navigateWithName(context, AppRoutes.completeProfile);
// },
// ),
// ),
// );
// },
// ));
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
performBasicOtp(context);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) {
// pop(context);
// delay(300).then(
// (value) => showMDialog(
// context,
// child: MessageDialog(
// title: "Phone Number Verified",
// onClick: () {
// otpType=2;
// performBasicOtp(context);
// // navigateWithName(context, AppRoutes.completeProfile);
// },
// ),
// ),
// );
// },
// ));
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png",
),
),
],
),
mFlex(10),
],
),
),
);
}
Future<void> performBasicOtp(BuildContext context) async {
Utils.showLoading(context);
BasicOtp basicOtp = await UserApiClent().basicOtp(phoneNum, otpType: otpType);
Utils.hideLoading(context);
if (basicOtp.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
RegisterUser user = await UserApiClent().basicVerify(phoneNum, code, basicOtp.data!.userToken ?? "");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
Utils.showToast(user.message ?? "");
showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(),
//"Phone Number Verified",
onClick: () {
pop(context);
navigateWithName(context, AppRoutes.profile1,arguments: user);
},
),
);
} else {
Utils.showToast(user.message ?? "");
}
},
));
} else {
Utils.showToast(basicOtp.message ?? "");
}
}
}

@ -0,0 +1,158 @@
import 'dart:convert';
import 'package:car_customer_app/api/shared_prefrence.dart';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/login_password.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/widgets/tab/login_email_tab.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import '../../models/user/country.dart';
import '../../widgets/dropdown/dropdow_field.dart';
class LoginWithPassword extends StatefulWidget {
@override
State<LoginWithPassword> createState() => _LoginWithPasswordState();
}
class _LoginWithPasswordState extends State<LoginWithPassword> {
int otpType = 1;
ClassType type = ClassType.NUMBER;
String phoneNum = "", password = "";
String email = "";
String countryCode = "";
Country? _country;
@override
void initState() {
super.initState();
getCountryList();
}
getCountryList() async {
_country = await UserApiClent().getAllCountries();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LoginEmailTab(
onSelection: (ClassType type) {
setState(() {
this.type = type;
});
},
),
50.height,
(type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText24(),
mFlex(1),
Column(
children: [
if (type == ClassType.NUMBER)
getCountry(),
6.height,
TxtField(
hint: type == ClassType.NUMBER ? "5********" : LocaleKeys.enterEmail.tr(),
value: phoneNum,
onChanged: (v) {
phoneNum = v;
},
),
6.height,
TxtField(
hint: LocaleKeys.EnterPass.tr(),
value: password,
isPasswordEnabled: true,
maxLines: 1,
onChanged: (v) {
password = v;
},
),
],
),
10.height,
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
LocaleKeys.forgetPass.tr().toText12(color: Colors.blue).onPress(() {
navigateWithName(context, AppRoutes.forgetPassword);
}),
],
),
50.height,
ShowFillButton(
title: LocaleKeys.login.tr(),
width: double.infinity,
onPressed: () {
performBasicOtp(context);
},
),
mFlex(10),
],
),
),
);
}
Widget getCountry() {
if (_country != null) {
List<DropValue> dropList = [];
_country!.data?.forEach((element) {
dropList.add(new DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? ""));
});
return Padding(
padding: const EdgeInsets.all(2.0),
child: DropdownField((DropValue value) {
countryCode = value.subValue;
}, list: dropList, hint: LocaleKeys.selectCountryCode.tr()),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}
Future<void> performBasicOtp(BuildContext context) async {
Utils.showLoading(context);
Response response = await UserApiClent().login_V1(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum, password);
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
SharedPrefManager.setPhoneOrEmail(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum);
SharedPrefManager.setUserPassword(password);
navigateReplaceWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken);
} else {
Utils.showToast(user.message ?? "");
}
}
}

@ -0,0 +1,136 @@
import 'package:car_customer_app/api/api_client.dart';
import 'package:car_customer_app/api/client/user_api_client.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/dropdown/dropdow_field.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
class RegisterPage extends StatelessWidget {
String phoneNum = "", countryCode = "";
int role = 4, countryId = -1;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.signUp.tr(),),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.enterPhoneNumber.tr().toText24(),
// 12.height,
// FutureBuilder<Role>(
// future: UserApiClent().getRoles(),
// builder: (context, snapshot) {
// if (snapshot.hasData) {
// List<DropValue> dropList = [];
// snapshot.data?.data?.forEach((element) {
// dropList.add(new DropValue(element.id ?? 0, element.roleName ?? "", ""));
// });
// return DropdownField((DropValue value) {
// role = value.id;
// }, list: dropList, hint: "Chosse Role");
// } else {
// return CircularProgressIndicator();
// }
// },
// ),
12.height,
FutureBuilder<Country>(
future: UserApiClent().getAllCountries(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<DropValue> dropList = [];
snapshot.data?.data?.forEach((element) {
dropList.add(new DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? ""));
});
return DropdownField((DropValue value) {
countryCode = value.subValue;
countryId = value.id;
}, list: dropList, hint: LocaleKeys.selectCountryCode.tr());
} else {
return CircularProgressIndicator();
}
},
),
TxtField(
hint: "5********",
onChanged: (v) {
phoneNum = v;
},
),
50.height,
ShowFillButton(
title: LocaleKeys.continu.tr(),
width: double.infinity,
onPressed: () {
if (validation()) performBasicOtp(context);
},
),
],
),
),
);
}
Future<void> performBasicOtp(BuildContext context) async {
Utils.showLoading(context);
BasicOtp basicOtp = await UserApiClent().basicOtp(countryCode + phoneNum, roleId: role);
Utils.hideLoading(context);
if (basicOtp.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
RegisterUser user = await UserApiClent().basicVerify(countryCode + phoneNum, code, basicOtp.data!.userToken ?? "");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
Utils.showToast(user.message ?? "");
navigateReplaceWithName(context, AppRoutes.completeProfile, arguments: user);
} else {
Utils.showToast(user.message ?? "");
}
},
));
} else {
Utils.showToast(basicOtp.message ?? "");
}
}
bool validation() {
bool isValid = true;
if (role == -1) {
Utils.showToast(LocaleKeys.selectProviderRole.tr());
//("Please select Provider Role");
isValid = false;
} else if (countryCode.isEmpty) {
Utils.showToast(LocaleKeys.selectCountryCode.tr());
//("Please select Country Code");
isValid = false;
} else if (phoneNum.isEmpty) {
Utils.showToast(LocaleKeys.addPhoneNo.tr());
//("Please add Phone No");
isValid = false;
}
return isValid;
}
}

@ -0,0 +1,64 @@
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
class RegisterSelectionPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.welcomeMessage.tr().toText24(),
mFlex(1),
ShowFillButton(
title: LocaleKeys.login.tr(),
// title: "Log In With Password",
width: double.infinity,
onPressed: () {
navigateWithName(context, AppRoutes.loginWithPassword);
},
),
// 20.height,
// ShowFillButton(
// title: "Log In",
// width: double.infinity,
// onPressed: () {
// navigateWithName(context, AppRoutes.loginVerifyAccount);
// },
// ),
20.height,
ShowFillButton(
title: LocaleKeys.signUp.tr(),
width: double.infinity,
onPressed: () {
navigateWithName(context, AppRoutes.register);
},
),
20.height,
ShowFillButton(
title: LocaleKeys.forgetPassword.tr(),
width: double.infinity,
onPressed: () {
navigateWithName(context, AppRoutes.forgetPassword);
},
),
mFlex(2),
],
),
),
);
}
}

@ -0,0 +1,47 @@
import 'dart:async';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
class SplashPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
mFlex(5),
"Logo".toText(fontSize: 45, isBold: true),
mFlex(3),
LocaleKeys.firstTimeLogIn.tr().toText(fontSize: 18, isBold: true).onPress(() {
navigateWithName(context, AppRoutes.registerSelection);
}),
mFlex(1),
LocaleKeys.alreadySigned.tr().toText(fontSize: 18, isBold: true).onPress(() {
navigateWithName(context, AppRoutes.loginVerification);
}),
35.height,
TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.white,
),
onPressed: () { },
child: Text( LocaleKeys.english.tr(), ),
),
mFlex(5),
],
),
),
);
}
}

@ -0,0 +1,165 @@
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/forget_password_otp_request.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
class VerifyPasswordPage extends StatelessWidget {
int otpType = 1;
String phoneNum = "";
String userName = "";
String userToken = "";
String otp = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(title: LocaleKeys.changePassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyNewPassword.tr().toText24(),
mFlex(1),
TxtField(
hint: "966500000000",
value: phoneNum,
onChanged: (v) {
phoneNum = v;
},
),
mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
// sendPasswordOTP(context);
showMDialog(context, child: OtpDialog(
onClick: (String code) {
pop(context);
delay(300).then(
(value) => showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(),
onClick: () {
otpType=1;
navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context);
},
),
),
);
},
));
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
// sendPasswordOTP(context);
showMDialog(context, child: OtpDialog(
onClick: (String code) {
pop(context);
delay(300).then(
(value) => showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(),
//"Phone Number Verified ",
onClick: () {
otpType=2;
navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context);
},
),
),
);
},
));
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png",
),
),
],
),
mFlex(10),
],
),
),
);
}
// Future<void> sendPasswordOTP(BuildContext context) async {
// Utils.showLoading(context);
// PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// if (otpCompare.messageStatus == 1) {
// // navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) async {
// pop(context);
// Utils.showLoading(context);
// // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// },
// ));
// } else {
// Utils.showToast(otpCompare.message ?? "");
// }
// }
// User otpRequest = User.fromJson(jsonDecode(res.body));
// SharedPrefManager.setUserToken(otpRequest.data!.accessToken ?? "");
// SharedPrefManager.setUserId(otpRequest.data!.userInfo!.userId ?? "");
// showMDialog(context, child: OtpDialog(
// onClick: (String code) {
// pop(context);
// delay(300).then(
// (value) => showMDialog(
// context,
// child: MessageDialog(
// title: "Phone Number Verified",
// onClick: () {
// otpType=1;
// navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// // ForgetPasswordOTP(context);
// },
// ),
// ),
// );
// },
// ));
}

@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'colors.dart';
class AppTheme {
static getTheme(isArabic) => ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primaryColor: primaryColor,
primarySwatch: Colors.blue,
backgroundColor: Colors.white,
primaryTextTheme: TextTheme(
headline6: TextStyle(color: Colors.white),
),
);
}
extension ExtendedRevoCheckTheme on TextTheme {
//add custom styles and colors here
//taken from https://medium.com/@crizantlai/flutter-how-to-extend-themedata-b5b987a95bb5
TextStyle get price => const TextStyle(color: Colors.redAccent);
}

@ -0,0 +1,13 @@
import 'package:flutter/material.dart';
const Color primaryColor = Colors.white;
const Color accentColor = Colors.blue;
const Color appBackgroundColor = Colors.white;
Color? accentColorDark = Colors.green[800];
const Color borderColor = Colors.blueGrey;
Color? borderLightColor = Colors.blueGrey[50];
Color backgroudColor =
Colors.blueGrey[50]!.withOpacity(0.5) ?? Colors.transparent;
const Color iconColor = Colors.blueGrey;
Color? headingColor = Colors.blueGrey[800];
Color? txtColor = Colors.blueGrey[500];

@ -0,0 +1,36 @@
import 'package:permission_handler/permission_handler.dart';
import 'dialogs.dart';
enum ConfirmAction { CANCEL, ACCEPT }
Future<bool> requestPermissionGranted(
context, Permission requestPermissions) async {
var result = await requestPermissions.request();
switch (result) {
case PermissionStatus.granted:
// Application has been given permission to use the feature.
return true;
case PermissionStatus.denied:
// Application has been denied permission to use the feature.
return false;
case PermissionStatus.permanentlyDenied:
ConfirmAction? res = await showConfirmDialogs(
context,
'You was denied Permission. You have give manual permission from app setting. ',
'Open App Setting',
'Cancel');
if (res == ConfirmAction.ACCEPT) {
return false;
} else if (res == ConfirmAction.CANCEL) {
return false;
}
return false;
case PermissionStatus.restricted:
// iOS has restricted access to a specific feature.
return false;
default:
return false;
}
}

@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import 'AppPermissionHandler.dart';
Future<ConfirmAction?> showConfirmDialogs(
context, msg, positiveText, negativeText) async {
return showDialog<ConfirmAction>(
context: context,
barrierDismissible: false,
builder: (context) {
return AlertDialog(
backgroundColor: Colors.white,
title: Text(msg, style: TextStyle(fontSize: 16)),
actions: <Widget>[
TextButton(
child: Text(
negativeText,
),
onPressed: () {
Navigator.of(context).pop(ConfirmAction.CANCEL);
},
),
TextButton(
child: Text(
positiveText,
),
onPressed: () {
Navigator.of(context).pop(ConfirmAction.ACCEPT);
},
)
],
);
},
);
}

@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
navigateWithName(BuildContext context, String routeName, {Object? arguments}) {
Navigator.pushNamed(context, routeName, arguments: arguments);
}
navigateReplaceWithName(BuildContext context, String routeName, {Object? arguments}) {
Navigator.pushReplacementNamed(context, routeName, arguments: arguments);
}
pop(BuildContext context) {
Navigator.of(context).pop();
}

@ -0,0 +1,320 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:sizer/sizer.dart';
Color getColorFromHex(String hexColor) {
hexColor = hexColor.toUpperCase().replaceAll('#', '');
if (hexColor.length == 6) {
hexColor = 'FF' + hexColor;
}
return Color(int.parse(hexColor, radix: 16));
}
Widget spacerVertical(double v) {
return Container(
height: v,
width: double.infinity,
);
}
String convertFileToBase64(File file) {
List<int> imageBytes = file.readAsBytesSync();
return base64Encode(imageBytes);
}
// String checkFileExt(String path) {
// String ex = p.extension(path);
// var parts = ex.split('.');
// return parts[1] ?? "png"; // '.dart'
// }
Future delay(int millis) async {
return await Future.delayed(Duration(milliseconds: millis));
}
inkWellCorner({double? r}) {
return RoundedRectangleBorder(
borderRadius: BorderRadius.circular(r ?? 4),
);
}
Widget spacerHorizontal(double v) {
return Container(
height: v,
width: v,
);
}
// Widget mHeight(double f) {
// return Container(
// width: f,
// height: f,
// );
// }
Widget mDivider(Color color, {double? h}) {
return Container(
width: double.infinity,
height: h ?? 1,
color: color,
);
}
Widget mDivider3({double? h}) {
return Container(
width: double.infinity,
height: h ?? 1,
color: borderLightColor!.withOpacity(0.7) ?? Colors.transparent,
);
}
Widget mDivider2(Color color, double w) {
return Container(
width: w,
height: 1,
color: color,
);
}
InputDecoration txtField(String label) {
return new InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
hintText: label,
hintStyle: TextStyle(color: Colors.grey),
disabledBorder: InputBorder.none,
isDense: false,
contentPadding: EdgeInsets.only(left: 15, right: 15),
);
}
// Widget mWidth(double f) {
// return Container(
// width: f,
// height: f,
// );
// }
Widget mFlex(int f) {
return Flexible(
flex: f,
child: Container(
width: double.infinity,
height: double.infinity,
),
);
}
Widget mExp(int f) {
return Expanded(
flex: f,
child: Container(
width: double.infinity,
),
);
}
spacer() {
return SizedBox(
height: 8,
);
}
//
// Widget floatButton(String icon, {Color? color, required Function onClick, String? title}) {
// return Padding(
// padding: const EdgeInsets.only(top: 12, bottom: 12),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// FloatingActionButton(
// onPressed: () {
// onClick();
// },
// heroTag: icon,
// backgroundColor: accentColor,
// elevation: 4,
// child: Container(
// child: SvgPicture.asset(
// categorySvgIcons + icon,
// color: color,
// ),
// width: double.infinity,
// height: double.infinity,
// decoration: containerRadius(Colors.white, 200),
// clipBehavior: Clip.antiAlias,
// padding: EdgeInsets.all(15),
// margin: EdgeInsets.all(1),
// ),
// ),
// if (title != null) mHeight(2.w),
// if (title != null)
// Txt(
// title,
// fontSize: 12.sp,
// bold: true,
// color: headingColor,
// )
// ],
// ),
// );
// }
navigateTo(context, page) {
Navigator.push(context, MaterialPageRoute(builder: (context) => page));
}
circularImage(String im, double width, double height) {
return new Container(width: 190.0, height: 190.0, decoration: new BoxDecoration(shape: BoxShape.circle, image: new DecorationImage(fit: BoxFit.fill, image: new AssetImage(im))));
}
circularImage2(String im, double width, double height) {
return new Container(width: width, height: height, decoration: new BoxDecoration(shape: BoxShape.circle, image: new DecorationImage(fit: BoxFit.fill, image: new AssetImage(im))));
}
cardRadius(double radius) {
return RoundedRectangleBorder(
side: BorderSide(color: Colors.transparent, width: 1),
borderRadius: BorderRadius.circular(radius),
);
}
cardRadiusWithoutBorder(double radius) {
return RoundedRectangleBorder(
side: BorderSide(color: Colors.transparent, width: 1),
borderRadius: BorderRadius.circular(radius),
);
}
Image imageFromBase64String(String base64String) {
return Image.memory(base64Decode(base64String));
}
Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
String base64String(Uint8List data) {
return base64Encode(data);
}
Widget overLayWidget({double? width, double? height, List<Color>? color}) {
return Container(
width: width ?? double.infinity,
height: height ?? 60,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: color != null
? color
: [
Colors.black.withOpacity(0.2),
Colors.black.withOpacity(0.1),
Colors.black.withOpacity(0.004),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
tileMode: TileMode.clamp,
),
),
);
}
Decoration containerRadius(Color color, double r) {
return BoxDecoration(
color: color,
borderRadius: BorderRadius.all(Radius.circular(r)),
);
}
Decoration containerRadiusTop({Color? color, double? r}) {
return BoxDecoration(
color: color ?? Colors.white,
borderRadius: BorderRadius.only(topRight: Radius.circular(r ?? 12), topLeft: Radius.circular(r ?? 12)),
);
}
Decoration containerRadiusBorder(Color color, double r) {
return BoxDecoration(
color: Colors.transparent,
border: Border.all(color: color, width: 1),
borderRadius: BorderRadius.all(Radius.circular(r)),
);
}
Decoration containerRadiusBottom(Color color, double r) {
return BoxDecoration(
color: color,
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(r), bottomRight: Radius.circular(r)),
);
}
ShapeBorder cardRadiusTop(double radius) {
return RoundedRectangleBorder(
side: BorderSide(color: Colors.transparent, width: 0),
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
);
}
Decoration containerColorRadiusBorderWidth(Color background, double radius, Color color, double w) {
return BoxDecoration(
color: background,
border: Border.all(
width: w, //
color: color // <--- border width here
),
borderRadius: BorderRadius.circular(radius),
);
}
ShapeBorder cardRadiusTop2(double radius) {
return RoundedRectangleBorder(
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
);
}
ShapeBorder cardRadiusBottom(double radius) {
return RoundedRectangleBorder(
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(radius), bottomRight: Radius.circular(radius)),
);
}
Decoration containerColorRadiusBorder(Color background, double radius, Color color) {
return BoxDecoration(
color: background,
border: Border.all(
width: 1, //
color: color // <--- border width here
),
borderRadius: BorderRadius.circular(radius),
);
}
//Decoration appGradient = BoxDecoration(
// gradient: LinearGradient(
// colors: [
// Colors.green[200],
// Colors.green,
// ],
// begin: Alignment.topCenter,
// end: Alignment.bottomCenter,
// ),
//);
// launchURL(String url) async {
// if (await canLaunch(url)) {
// await launch(url);
// } else {
// throw 'Could not launch $url';
// }
// }

@ -1,102 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/provider_category_model.dart';
import 'package:mc_common_app/models/provider_service_model.dart';
import 'package:mc_common_app/models/widgets_models.dart';
import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
class AppointmentsVM extends ChangeNotifier {
final CommonRepo commonRepo;
final CommonAppServices commonServices;
AppointmentsVM({required this.commonServices, required this.commonRepo});
bool isFetchingLists = false;
List<AppointmentListModel> myAppointments = [];
List<FilterListModel> appointmentsFilterOptions = [];
bool isFetchingServices = false;
List<ProviderCategoryModel> providerCategories = [];
bool isHomeTapped = false;
void updateIsHomeTapped(bool value) {
isHomeTapped = value;
notifyListeners();
}
String pickedHomeLocation = "";
void updatePickedHomeLocation(String value) {
pickedHomeLocation = value;
notifyListeners();
}
SelectionModel providerCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
void updateProviderCategoryId(SelectionModel id) async {
providerCategoryId = id;
await getProviderServices(id.selectedId);
notifyListeners();
}
List<ProviderServiceModel> providerServices = [];
SelectionModel providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
void updateProviderServiceId(SelectionModel id) async {
providerServiceId = id;
notifyListeners();
}
void getProviderCategories() async {
notifyListeners();
providerCategories = await commonRepo.getProviderServiceCategories();
notifyListeners();
}
getProviderServices(int categoryId) async {
providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
isHomeTapped = false;
pickedHomeLocation = "";
if (categoryId != -1) {
isFetchingServices = true;
notifyListeners();
providerServices = await commonRepo.getProviderServices(categoryId: categoryId);
isFetchingServices = false;
notifyListeners();
}
}
populateAppointmentsFilterList() {
appointmentsFilterOptions.clear();
appointmentsFilterOptions = [
FilterListModel(title: "All Appointments", isSelected: true, id: -1),
FilterListModel(title: "Booked", isSelected: false, id: 1),
FilterListModel(title: "Confirmed", isSelected: false, id: 2),
FilterListModel(title: "Arrived", isSelected: false, id: 3),
FilterListModel(title: "Cancelled", isSelected: false, id: 4),
];
notifyListeners();
}
applyFilterOnAppointmentsVM({required int index}) {
if (appointmentsFilterOptions.isEmpty) return;
for (var value in appointmentsFilterOptions) {
value.isSelected = false;
}
appointmentsFilterOptions[index].isSelected = true;
notifyListeners();
}
Future<void> getMyAppointments() async {
isFetchingLists = true;
myAppointments = await commonRepo.getMyAppointments();
isFetchingLists = false;
notifyListeners();
}
}

@ -1,55 +0,0 @@
import 'dart:io';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/user/image_response.dart';
import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:flutter/cupertino.dart';
import 'package:easy_localization/easy_localization.dart';
class DashboardVM extends BaseVM {
final CommonAppServices commonServices;
final UserRepo userRepo;
DashboardVM({required this.commonServices, required this.userRepo});
String pickedImage = "";
int selectedNavbarBarIndex = 2;
void onNavbarTapped(int index) {
selectedNavbarBarIndex = index;
notifyListeners();
}
void pickImageFromPhone(BuildContext context, int sourceFlag) async {
final File? pickedImageFile = await commonServices.pickImageFromPhone(sourceFlag);
if (pickedImageFile == null) {
return;
}
int sizeInBytes = pickedImageFile.lengthSync();
if (sizeInBytes > 1000) {
Utils.showToast(LocaleKeys.fileLarger.tr());
return;
} else {
String image64 = Utils.convertFileToBase64(pickedImageFile);
Utils.showLoading(context);
ImageResponse response = await userRepo.updateUserImage(image64);
Utils.hideLoading(context);
Navigator.pop(context);
if (response.messageStatus == 1) {
Utils.showToast(LocaleKeys.imageUploaded.tr());
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
} else {
Utils.showToast(response.message ?? "");
}
}
}
Future<ImageResponse> updateUserImage(String image) async {
return await userRepo.updateUserImage(image);
}
}

@ -1,35 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/models/widgets_models.dart';
import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
class ProvidersVM extends ChangeNotifier {
final CommonRepo commonRepo;
final CommonAppServices commonServices;
ProvidersVM({required this.commonServices, required this.commonRepo});
List<FilterListModel> providersFilterOptions = [];
populateProvidersFilterList() {
providersFilterOptions.clear();
providersFilterOptions = [
FilterListModel(title: "All Providers", isSelected: true, id: -1),
FilterListModel(title: "Maintenance", isSelected: false, id: 0),
FilterListModel(title: "Oil Service", isSelected: false, id: 1),
FilterListModel(title: "Accessories", isSelected: false, id: 2),
FilterListModel(title: "Tire Service", isSelected: false, id: 3),
FilterListModel(title: "Dent and Paint", isSelected: false, id: 4),
];
notifyListeners();
}
applyFilterOnProviders({required int index}) {
if (providersFilterOptions.isEmpty) return;
for (var value in providersFilterOptions) {
value.isSelected = false;
}
providersFilterOptions[index].isSelected = true;
notifyListeners();
}
}

@ -1,128 +0,0 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/card_button_with_icon.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class AppointmentDetailView extends StatelessWidget {
AppointmentListModel appointmentListModel;
AppointmentDetailView({Key? key, required this.appointmentListModel}) : super(key: key);
final List<String> servicesList = [
"Mechanic",
"Electrician",
" Car Denting",
"Oil Change",
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Appointment",
profileImageUrl: MyAssets.bnCar,
isRemoveBackButton: false,
isDrawerEnabled: false,
),
body: Container(
padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21),
child: Stack(
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
appointmentListModel.providerName!.toText(fontSize: 18, isBold: true),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
MyAssets.miniClockDark.buildSvg(
height: 10,
width: 10,
fit: BoxFit.fill,
),
10.width,
"${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}".toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor),
],
),
13.height,
Row(
children: [
MyAssets.maintenanceIcon.buildSvg(
height: 10,
width: 10,
fit: BoxFit.fill,
),
10.width,
"Maintenance".toText(fontSize: 18, isBold: true),
],
),
Column(
children: servicesList
.map((e) => e
.toText(
textAlign: TextAlign.start,
fontSize: 13,
isBold: true,
color: MyColors.lightTextColor,
)
.paddingOnly(bottom: 5))
.toList(),
).paddingOnly(left: 15),
15.height,
Row(
children: [
CardButtonWithIcon(
title: "Reschedule Appointment",
onCardTapped: () {},
icon: MyAssets.scheduleAppointmentIcon.buildSvg(),
),
10.width,
CardButtonWithIcon(
title: "Pay for Appointment",
onCardTapped: () {},
icon: MyAssets.creditCardIcon.buildSvg(),
),
],
),
15.height,
],
).toWhiteContainer(width: double.infinity, allPading: 12),
Align(
alignment: Alignment.bottomCenter,
child: Row(
children: [
Expanded(
child: ShowFillButton(
maxHeight: 55,
title: "Cancel",
onPressed: () {},
backgroundColor: MyColors.redColor,
),
),
if (appointmentListModel.appointmentStatusID == 1) ...[
12.width,
Expanded(
child: ShowFillButton(
maxHeight: 55,
title: "Confirm",
onPressed: () {},
backgroundColor: MyColors.greenColor,
),
),
],
],
),
),
],
),
),
);
}
}

@ -1,325 +0,0 @@
import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/widgets_models.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/views/advertisement/custom_add_button.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart';
class BookAppointmentServicesView extends StatelessWidget {
const BookAppointmentServicesView({Key? key}) : super(key: key);
void openTheAddServiceBottomSheet(BuildContext context) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
builder: (BuildContext context) {
AppointmentsVM appointmentsVM = context.watch<AppointmentsVM>();
return SizedBox(
height: MediaQuery.of(context).size.height * 0.85,
child: Column(
children: [
Container(
margin: const EdgeInsets.all(8),
height: 8,
width: 60,
decoration: const BoxDecoration(color: MyColors.lightTextColor, borderRadius: BorderRadius.all(Radius.circular(20))),
),
12.height,
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
"Select Category".toText(fontSize: 24, isBold: true),
],
),
30.height,
Expanded(
child: ListView(
children: [
Builder(
builder: (context) {
List<DropValue> serviceCategories = [];
for (var element in appointmentsVM.providerCategories) {
if (!element.isSelected!) {
serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.categoryName ?? "", ""));
}
}
return DropdownField(
(DropValue value) => appointmentsVM.updateProviderCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)),
list: serviceCategories,
hint: "Select Category",
dropdownValue: appointmentsVM.providerCategoryId.selectedId != -1
? DropValue(appointmentsVM.providerCategoryId.selectedId, appointmentsVM.providerCategoryId.selectedOption, "")
: null,
);
},
),
if (appointmentsVM.isFetchingServices) ...[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [const CircularProgressIndicator().paddingAll(10)],
),
] else if (appointmentsVM.providerServices.isNotEmpty) ...[
8.height,
Builder(
builder: (context) {
List<DropValue> serviceCategories = [];
for (var element in appointmentsVM.providerServices) {
if (!element.isSelected!) {
serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.id.toString(), ""));
}
}
return DropdownField(
(DropValue value) => appointmentsVM.updateProviderServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)),
list: serviceCategories,
hint: "Select Services",
dropdownValue: appointmentsVM.providerServiceId.selectedId != -1
? DropValue(appointmentsVM.providerServiceId.selectedId, appointmentsVM.providerServiceId.selectedOption, "")
: null,
);
},
),
],
if (appointmentsVM.providerServiceId.selectedId != -1 && !appointmentsVM.isFetchingServices) ...[
16.height,
Row(
children: [
"Select Service Location".toText(
fontSize: 16,
isBold: true,
color: MyColors.black,
),
],
),
8.height,
Row(
children: [
Expanded(
child: ShowFillButton(
isFilled: appointmentsVM.isHomeTapped,
maxHeight: 48,
title: "Home",
txtColor: appointmentsVM.isHomeTapped ? MyColors.white : MyColors.darkTextColor,
onPressed: () => appointmentsVM.updateIsHomeTapped(true),
),
),
12.width,
Expanded(
child: ShowFillButton(
isFilled: !appointmentsVM.isHomeTapped,
txtColor: !appointmentsVM.isHomeTapped ? MyColors.white : MyColors.darkTextColor,
maxHeight: 48,
title: "Workshop",
onPressed: () => appointmentsVM.updateIsHomeTapped(false),
),
),
],
),
if (appointmentsVM.isHomeTapped) ...[
8.height,
TxtField(
hint: 'Pick Home Location',
value: appointmentsVM.pickedHomeLocation,
isNeedClickAll: true,
postfixData: Icons.location_on,
postFixDataColor: MyColors.darkTextColor,
onTap: () {
//TODO: open the place picked to pick the location and save it in provider.
appointmentsVM.updatePickedHomeLocation("PM58+F97, Al Olaya, Riyadh 12333");
},
),
14.height,
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Icon(
Icons.warning,
color: MyColors.adPendingStatusColor,
size: 19,
).paddingOnly(bottom: 2),
3.width,
"Some services are not available on home location.".toText(
color: MyColors.adPendingStatusColor,
fontSize: 12,
isItalic: true,
),
],
),
]
],
],
),
),
SizedBox(
width: double.infinity,
child: Column(
children: [
if (appointmentsVM.isHomeTapped && !appointmentsVM.isFetchingServices) ...[
const Divider(thickness: 1, height: 1),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
// TODO: This Price will be decided according to the service selected
150.toString().toText(fontSize: 30, isBold: true),
"SAR".toText(fontSize: 15, isBold: true, color: MyColors.lightTextColor).paddingOnly(bottom: 5),
],
),
"These charges are additional to the actual service charges. For heavy items the charges may vary.".toText(fontSize: 12, color: MyColors.lightTextColor),
22.height,
],
SizedBox(
width: double.infinity,
child: ShowFillButton(
maxHeight: 55,
title: "Next",
onPressed: () {},
),
),
],
),
).paddingOnly(bottom: 20)
],
)).horPaddingMain();
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Book Appointment",
isRemoveBackButton: false,
isDrawerEnabled: false,
actions: [MyAssets.searchIcon.buildSvg().paddingOnly(right: 21)],
onBackButtonTapped: () => Navigator.pop(context),
),
body: Consumer(
builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
21.height,
CustomAddButton(
onTap: () => {openTheAddServiceBottomSheet(context)},
text: "Add Services",
icon: Container(
height: 24,
width: 24,
decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.darkTextColor),
child: const Icon(Icons.add, color: MyColors.white),
),
),
// 20.height,
// ListView.builder(
// physics: const NeverScrollableScrollPhysics(),
// shrinkWrap: true,
// itemCount: adVM.specialServiceCards.length,
// itemBuilder: (BuildContext context, int index) {
// SpecialServiceCard specialServicesCard = adVM.specialServiceCards[index];
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Column(
// children: [
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Expanded(
// child: specialServicesCard.serviceSelectedId!.selectedOption.toText(fontSize: 16, isBold: true),
// ),
// Align(
// alignment: Alignment.topRight,
// child: MyAssets.closeWithOrangeBg.buildSvg(
// fit: BoxFit.fill,
// height: 30,
// width: 30,
// ),
// ).onPress(() => adVM.removeSpecialServiceCard(index))
// ],
// ),
// Builder(builder: (context) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// if (specialServicesCard.serviceSelectedId!.selectedId != 1 && specialServicesCard.serviceSelectedId!.selectedId != 3) ...[
// // Row(
// // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [
// // "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
// // (specialServicesCard.duration ?? "").toText(fontSize: 12, isBold: true).expand(),
// // ],
// // ),
// 8.height,
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// "Description: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
// (specialServicesCard.description ?? "").toText(fontSize: 12, isBold: true).expand(),
// ],
// ),
// ],
// if (specialServicesCard.serviceSelectedId!.selectedId == 1 || specialServicesCard.serviceSelectedId!.selectedId == 3) ...[
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// const Icon(
// weight: 2,
// Icons.location_on_outlined,
// color: MyColors.primaryColor,
// size: 17,
// ),
// "${specialServicesCard.duration} km".toText(fontSize: 10, color: MyColors.primaryColor),
// ],
// ),
// 8.height,
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// "Branch Address: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
// (specialServicesCard.address ?? "").toText(fontSize: 12, isBold: true).expand(),
// ],
// ),
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// "Appointment Time: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
// "${specialServicesCard.serviceDate} - ${specialServicesCard.serviceTime}".toText(fontSize: 12, isBold: true).expand(),
// ],
// ),
// ],
// 6.height,
// Row(
// crossAxisAlignment: CrossAxisAlignment.end,
// children: [
// (specialServicesCard.serviceSelectedId!.itemPrice).toText(fontSize: 20, isBold: true),
// 2.width,
// "SAR".toText(color: MyColors.lightTextColor, fontSize: 14),
// ],
// ),
// ],
// );
// }),
// 3.height,
// const Divider(thickness: 1.5)
// ],
// ),
// 10.height,
// ],
// );
// },
// ),
],
);
},
).horPaddingMain());
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save