Merge branch 'faiz_development' into 'master'

Upgraded the App's Architecture

See merge request mirza.shafique/car_customer_app!1
mirza_development
Mirza Shafique 3 years ago
commit dc7548fea4

@ -1,16 +1,93 @@
# car_customer_app # car_customer_app
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application. ## Getting started
A few resources to get you started if this is your first Flutter project: To make it easy for you to get started with GitLab, here's a list of recommended next steps.
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 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)!
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
## 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.
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" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 31 compileSdkVersion 33
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8

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

@ -2,13 +2,16 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/exceptions/api_exception.dart'; import 'package:car_customer_app/exceptions/api_exception.dart';
import 'package:car_customer_app/models/user/refresh_token.dart';
import 'package:car_customer_app/models/user/user.dart';
import 'package:car_customer_app/utils/shared_prefrence.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:http/io_client.dart'; import 'package:http/io_client.dart';
import 'client/user_api_client.dart';
typedef FactoryConstructor<U> = U Function(dynamic); typedef FactoryConstructor<U> = U Function(dynamic);
class APIError { class APIError {
@ -23,40 +26,48 @@ class APIError {
String toString() { String toString() {
return jsonEncode(this); return jsonEncode(this);
} }
}
APIException _throwAPIException(Response response) {
switch (response.statusCode) { static APIException throwAPIException(Response response) {
case 400: switch (response.statusCode) {
APIError? apiError; case 400:
if (response.body != null && response.body.isNotEmpty) { APIError? apiError;
var jsonError = jsonDecode(response.body); if (response.body != null && response.body.isNotEmpty) {
apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']); var jsonError = jsonDecode(response.body);
} apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']);
return APIException(APIException.BAD_REQUEST, error: apiError); }
case 401: return APIException(APIException.BAD_REQUEST, error: apiError);
return APIException(APIException.UNAUTHORIZED); case 401:
case 403: return const APIException(APIException.UNAUTHORIZED);
return APIException(APIException.FORBIDDEN); case 403:
case 404: return const APIException(APIException.FORBIDDEN);
return APIException(APIException.NOT_FOUND); case 404:
case 500: return const APIException(APIException.NOT_FOUND);
return APIException(APIException.INTERNAL_SERVER_ERROR); case 500:
case 444: return const APIException(APIException.INTERNAL_SERVER_ERROR);
var downloadUrl = response.headers["location"]; case 444:
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); var downloadUrl = response.headers["location"];
default: return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
return APIException(APIException.OTHER); default:
return const APIException(APIException.OTHER);
}
} }
} }
class ApiClient { abstract class ApiClient {
static final ApiClient _instance = ApiClient._internal(); 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});
Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0});
ApiClient._internal(); Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0});
factory ApiClient() => _instance; Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0});
}
class ApiClientImp implements ApiClient {
@override
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject, 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 { {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'}; var _headers = {'Accept': 'application/json'};
@ -64,24 +75,25 @@ class ApiClient {
_headers.addAll(headers); _headers.addAll(headers);
} }
if (!kReleaseMode) { if (!kReleaseMode) {
print("Url:$url"); debugPrint("Url:$url");
print("body:$jsonObject"); debugPrint("body:$jsonObject");
} }
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try { try {
if (!kReleaseMode) { if (!kReleaseMode) {
print("res121:" + response.body); debugPrint("res121:" + response.body);
print("res121:" + response.statusCode.toString()); debugPrint("res121:" + response.statusCode.toString());
} }
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData); return factoryConstructor(jsonData);
} catch (ex) { } catch (ex) {
print(ex); debugPrint(ex.toString());
print("exception:" + ex.toString()); debugPrint("exception:" + ex.toString());
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
} }
} }
@override
Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
String? requestBody; String? requestBody;
if (jsonObject != null) { if (jsonObject != null) {
@ -115,41 +127,41 @@ class ApiClient {
} }
if (queryParameters != null) { if (queryParameters != null) {
var queryString = new Uri(queryParameters: queryParameters).query; var queryString = Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString; url = url + '?' + queryString;
} }
var response; Response response;
response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 100)); response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(const Duration(seconds: 100));
if (!kReleaseMode) { if (!kReleaseMode) {
print("Url:$url"); debugPrint("Url:$url");
print("body:$requestBody"); debugPrint("body:$requestBody");
print("res: " + response.body); debugPrint("res: " + response.body);
} }
if (response.statusCode >= 200 && response.statusCode < 500) { if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") {
String mToken = await UserApiClent().UpdateUserToken(); String mToken = await updateUserToken();
return await _postForResponse(url, requestBody, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); return await _postForResponse(url, requestBody, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
} }
return response; return response;
} else { } else {
throw _throwAPIException(response); throw APIError.throwAPIException(response);
} }
} on SocketException catch (e) { } on SocketException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); debugPrint('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} on HttpException catch (e) { } on HttpException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); debugPrint('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -158,14 +170,14 @@ class ApiClient {
throw APIException(APIException.TIMEOUT, arguments: e); throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); debugPrint('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} catch (ex) { } catch (ex) {
print("exception1:" + ex.toString()); debugPrint("exception1:" + ex.toString());
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
} }
} }
@ -184,6 +196,7 @@ class ApiClient {
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
@override
Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'}; var _headers = {'Accept': 'application/json'};
@ -193,16 +206,17 @@ class ApiClient {
var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try { try {
if (!kReleaseMode) { if (!kReleaseMode) {
print("res:" + response.body); debugPrint("res:" + response.body);
} }
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData); return factoryConstructor(jsonData);
} catch (ex) { } catch (ex) {
print("exception:" + response.body); debugPrint("exception:" + response.body);
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
} }
} }
@override
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
if (headers == null) { if (headers == null) {
headers = {'Content-Type': 'application/json'}; headers = {'Content-Type': 'application/json'};
@ -225,42 +239,42 @@ class ApiClient {
_headers.addAll(headers); _headers.addAll(headers);
} }
if (queryParameters != null) { if (queryParameters != null) {
String queryString = new Uri(queryParameters: queryParameters).query; String queryString = Uri(queryParameters: queryParameters).query;
if (isFirstCall) url = url + '?' + queryString.toString(); if (isFirstCall) url = url + '?' + queryString.toString();
} }
if (!kReleaseMode) { if (!kReleaseMode) {
print("Url:$url"); debugPrint("Url:$url");
print("queryParameters:$queryParameters"); debugPrint("queryParameters:$queryParameters");
} }
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60)); var response = await _get(Uri.parse(url), headers: _headers).timeout(const Duration(seconds: 60));
if (!kReleaseMode) { if (!kReleaseMode) {
print("res: " + response.body.toString()); debugPrint("res: " + response.body.toString());
} }
if (response.statusCode >= 200 && response.statusCode < 500) { if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") {
String mToken = await UserApiClent().UpdateUserToken(); String mToken = await updateUserToken();
isFirstCall = false; isFirstCall = false;
return await _getForResponse(url, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); return await _getForResponse(url, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
} }
return response; return response;
} else { } else {
throw _throwAPIException(response); throw APIError.throwAPIException(response);
} }
} on SocketException catch (e) { } on SocketException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); debugPrint('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} on HttpException catch (e) { } on HttpException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); debugPrint('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -269,7 +283,7 @@ class ApiClient {
throw APIException(APIException.TIMEOUT, arguments: e); throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
await Future.delayed(Duration(seconds: 3)); await Future.delayed(const Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -280,4 +294,24 @@ class ApiClient {
} }
Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers)); Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers));
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? "";
return await postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams);
}
Future<String> updateUserToken() async {
String token = await SharedPrefManager.getUserToken();
String refreshToken = await SharedPrefManager.getRefreshToken();
RefreshToken refresh = await refreshTokenAPI(token, refreshToken);
SharedPrefManager.setUserToken(refresh.data!.accessToken ?? "");
SharedPrefManager.setRefreshToken(refresh.data!.refreshToken ?? "");
String mdata = await SharedPrefManager.getData();
UserInfo info = UserInfo.fromJson(jsonDecode(mdata));
User user = User();
user.data = UserData(accessToken: refresh.data!.accessToken ?? "", refreshToken: refresh.data!.refreshToken ?? "", userInfo: info);
AppState().setUser = user;
return refresh.data!.accessToken??"";
}
} }

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

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

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

@ -1,34 +0,0 @@
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);
}
}

@ -1,63 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyColors {
static const Color darkPrimaryColor = Color(0xffF47F20);
static const Color primaryColor = Color(0xffF69521);
static const Color accentColor = Colors.blue;
static const Color lightTextColor = Color(0xff969696);
static const Color textColor = Color(0xff777777);
static const Color textFieldColor = Color(0xffF3F5F7);
static const Color darkIconColor = Color(0xff28323A);
static const Color darkTextColor = Color(0xff2B353E);
static const Color normalTextColor = Color(0xff5A5A5A);
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);
static Decoration gradient = BoxDecoration(
gradient: new LinearGradient(colors: [
darkPrimaryColor,
primaryColor,
]),
boxShadow: [
new BoxShadow(
color: primaryColor.withOpacity(0.5),
blurRadius: 20.0,
spreadRadius: 1.0,
)
],
);
static Decoration gradientButton = BoxDecoration(
gradient: new LinearGradient(colors: [
darkPrimaryColor,
primaryColor,
]),
borderRadius: BorderRadius.circular(6),
boxShadow: [
new BoxShadow(
color: primaryColor.withOpacity(0.2),
blurRadius: 4.0,
spreadRadius: 0.5,
)
],
);
}

@ -53,3 +53,12 @@ class GlobalConsts {
static String welcomeVideoUrl = "welcomeVideoUrl"; static String welcomeVideoUrl = "welcomeVideoUrl";
static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo";
} }
const String icons = "assets/icons/";
const String categorySvgIcons = "assets/category/svg/";
const String svgIcons = "assets/svg/";
RegExp numReg = RegExp(r".*[0-9].*");
RegExp letterReg = RegExp(r".*[A-Za-z].*");

@ -1,72 +0,0 @@
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);
}
}
}

@ -1,20 +0,0 @@
// 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,
// );
}
}

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

@ -0,0 +1,24 @@
// import 'package:firebase_crashlytics/firebase_crashlytics.dart';
// import 'package:flutter/material.dart';
import 'package:car_customer_app/api/api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/repositories/branch_repo.dart';
import 'package:car_customer_app/repositories/user_repo.dart';
import 'package:car_customer_app/services/services.dart';
import 'package:injector/injector.dart';
Injector injector = Injector.appInstance;
class AppDependencies {
static void addDependencies() {
//services
injector.registerSingleton<AppState>(() => AppState());
injector.registerSingleton<ApiClient>(() => ApiClientImp());
injector.registerSingleton<CommonServices>(() => CommonServicesImp());
//repos
injector.registerSingleton<UserRepo>(() => UserRepoImp());
injector.registerSingleton<BranchRepo>(() => BranchRepoImp());
}
}

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

@ -1,82 +1,79 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:car_customer_app/classes/colors.dart';
extension EmailValidator on String { extension EmailValidator on String {
Widget get toWidget => Text(this); Widget toText({Color? color, bool isBold = false, double? fontSize, bool isUnderLine = false, TextDecoration? textDecoration, double letterSpacing = -0.4, TextAlign? textAlign, double? height}) =>
Text(
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,TextAlign? textAlign,}) => Text(
this, this,
textAlign: textAlign, textAlign: textAlign,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), style: TextStyle(
); height: height,
decoration: textDecoration ?? TextDecoration.none,
Widget toText16({Color? color, bool isBold = false}) => Text( fontSize: fontSize ?? 10,
this, fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), color: color ?? MyColors.darkTextColor,
); letterSpacing: letterSpacing,
),
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 toText20({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 23 / 24, color: color ?? MyColors.darkTextColor, fontSize: 20, letterSpacing: -1.44, 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( // Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text(
this, // this,
style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 32, letterSpacing: -1.92, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), // 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,
// TextAlign? textAlign,
// }) =>
// Text(
// this,
// textAlign: textAlign,
// 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 toText20({Color? color, bool isBold = false}) => Text(
// this,
// style: TextStyle(height: 23 / 24, color: color ?? MyColors.darkTextColor, fontSize: 20, letterSpacing: -1.44, 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, fontSize: 24, letterSpacing: -1.44, color: color ?? MyColors.darkTextColor, 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() { 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); 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);
@ -87,8 +84,8 @@ extension EmailValidator on String {
} }
String toFormattedDate() { String toFormattedDate() {
String date = this.split("T")[0]; String date = split("T")[0];
String time = this.split("T")[1]; String time = split("T")[1];
var dates = date.split("-"); 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))}"; return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
} }

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
extension WidgetExtensions on Widget { extension WidgetExtensions on Widget {
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);

@ -46,6 +46,7 @@ class CodegenLoader extends AssetLoader{
"createPass": "انشاء كلمة مرور جديده *", "createPass": "انشاء كلمة مرور جديده *",
"newPassword": " كلمة مرور جديده", "newPassword": " كلمة مرور جديده",
"forgetPassword": "نسيت كلمة المرور", "forgetPassword": "نسيت كلمة المرور",
"forgetPasswordRecover": "نسيت كلمة المرور؟ استعادة",
"editAccount": "تعديل الحساب", "editAccount": "تعديل الحساب",
"change": "تغيير", "change": "تغيير",
"verifyAccount": "التحقق من الحساب", "verifyAccount": "التحقق من الحساب",
@ -81,7 +82,7 @@ class CodegenLoader extends AssetLoader{
"edit": "تعديل", "edit": "تعديل",
"imageDeleted": "تم حذف الصوره", "imageDeleted": "تم حذف الصوره",
"dashboard": "الصفحه الرئيسيه", "dashboard": "الصفحه الرئيسيه",
"termsOfService": "من خلال إنشاء حساب فإنك توافق على شروط الخدمة و\n سياسة الخصوصية", "termsOfService": "من خلال إنشاء حساب فإنك توافق على",
"userInformation": "معلومات المتسخدم", "userInformation": "معلومات المتسخدم",
"faceRecognition": "تحقق مع بصمة الوجه", "faceRecognition": "تحقق مع بصمة الوجه",
"fingerPrint": "تحقق مع بصمة الاصبع", "fingerPrint": "تحقق مع بصمة الاصبع",
@ -91,7 +92,6 @@ class CodegenLoader extends AssetLoader{
"userRoleOrTitle": "عنوان المستخدم", "userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل", "codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل", "number": "موبايل",
"arabic": "عربي",
"english": "English", "english": "English",
"title": "Hello", "title": "Hello",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
@ -128,11 +128,33 @@ class CodegenLoader extends AssetLoader{
"female": "Hello girl :) {}" "female": "Hello girl :) {}"
} }
}, },
"reset_locale": "Reset Language" "reset_locale": "Reset Language",
"welcomeDes": "أنت مكان واحد لكل ما تحتاجه سيارتك",
"log_in": "تسجيل الدخول",
"send": "إرسال",
"phoneNumber": "رقم الهاتف",
"forgetPasswordQ": "نسيت كلمة المرور؟",
"recover": "استعادة",
"retrivePassword": "استرجع كلمة المرور بإحدى الطرق التالية",
"retriveOnPhone": "سوف نرسل الاختيار إلى رقم هاتفك المحمول المسجل",
"retriveOnEmail": "سوف نرسل الاختيار إلى عنوان بريدك الإلكتروني المسجل",
"enterPhoneForVerfication": "الرجاء إدخال رقم هاتفك وسنرسل لك رمز التحقق",
"welcomeBack": "مرحبًا بعودتك!!!",
"selectYourCountry": "اختر بلدك",
"chooseCountry": "اختر الدوله",
"terms": "بنود الخدمة وخصوصية السياسة",
"profileMsg": "أدخل التفاصيل أدناه وأكمل معلومات الملف الشخصي",
"save": "حفظ",
"insert_otp_code": "ادخل الرمز",
"type_code": "الرجاء كتابة الرمز الذي أرسلناه إلى",
"resend_code": "أعد إرسال الرمز",
"check_code": "التحقق من الشفرة",
"time_will_expire": "إعادة إرسال الرمز بتنسيق",
"sec": "ثانية"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
"signUp": "Sing Up", "signUp": "Sign Up",
"changeMobile": "Change Mobile", "changeMobile": "Change Mobile",
"notifications": "Notifications", "notifications": "Notifications",
"general": "General", "general": "General",
@ -163,6 +185,7 @@ static const Map<String,dynamic> en_US = {
"createPass": "Create Password *", "createPass": "Create Password *",
"newPassword": "New Password", "newPassword": "New Password",
"forgetPassword": "Forget Password", "forgetPassword": "Forget Password",
"forgetPasswordRecover": "Forget Password? Recover",
"editAccount": "Edit Account", "editAccount": "Edit Account",
"change": "Change", "change": "Change",
"verifyAccount": "Verify Account", "verifyAccount": "Verify Account",
@ -197,7 +220,7 @@ static const Map<String,dynamic> en_US = {
"edit": "EDIT", "edit": "EDIT",
"imageDeleted": "Image is Deleted", "imageDeleted": "Image is Deleted",
"dashboard": "Dashboard/Main Page", "dashboard": "Dashboard/Main Page",
"termsOfService": "By creating an account you agree to our Terms of Service and\n Privacy Policy", "termsOfService": "By creating an account you agree to our",
"userInformation": "User Information", "userInformation": "User Information",
"faceRecognition": "Face Recognition", "faceRecognition": "Face Recognition",
"fingerPrint": "Finger Print", "fingerPrint": "Finger Print",
@ -207,7 +230,7 @@ static const Map<String,dynamic> en_US = {
"userRoleOrTitle": "User role or title", "userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email", "codeSentToEmail": "Code is sent to email",
"number": "Number", "number": "Number",
"english": "English", "english": "عربي",
"title": "Hello", "title": "Hello",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language", "msg_named": "{} are written in the {lang} language",
@ -243,7 +266,29 @@ static const Map<String,dynamic> en_US = {
"female": "Hello girl :) {}" "female": "Hello girl :) {}"
} }
}, },
"reset_locale": "Reset Language" "reset_locale": "Reset Language",
"welcomeDes": "You one stop place all your car needs",
"log_in": "Log In",
"send": "Send",
"phoneNumber": "Phone Number",
"forgetPasswordQ": "Forget Password?",
"recover": "Recover",
"retrivePassword": "Retrive password by one of following method",
"retriveOnPhone": "We will send the opt to your registered mobile number",
"retriveOnEmail": "We will send the opt to your registered email address",
"enterPhoneForVerfication": "Please enter your phone number We will send you the verification code",
"welcomeBack": "Welcome Back!!!",
"selectYourCountry": "Select Your Country",
"chooseCountry": "Choose Country",
"terms": "Terms of Service and Privacy Policy",
"profileMsg": "Enter the details below and complete the profile info",
"save": "Save",
"insert_otp_code": "Enter the code",
"type_code": "Please type the code we sent to",
"resend_code": "Resend Code",
"check_code": "Check Code",
"time_will_expire": "Resend code in",
"sec": "sec"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -1,62 +1,81 @@
import 'package:car_customer_app/classes/app_state.dart'; import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/config/app_provider.dart'; import 'package:car_customer_app/config/dependencies.dart';
import 'package:car_customer_app/models/post_params_model.dart'; import 'package:car_customer_app/models/post_params_model.dart';
import 'package:car_customer_app/repositories/user_repo.dart';
import 'package:car_customer_app/services/services.dart';
import 'package:car_customer_app/theme/app_theme.dart'; import 'package:car_customer_app/theme/app_theme.dart';
import 'package:car_customer_app/view_models/base_view_model.dart';
import 'package:car_customer_app/view_models/dashboard_view_model.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'config/routes.dart'; import 'config/routes.dart';
import 'generated/codegen_loader.g.dart';
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
AppDependencies.addDependencies();
await EasyLocalization.ensureInitialized(); await EasyLocalization.ensureInitialized();
runApp( runApp(
EasyLocalization( EasyLocalization(
supportedLocales: [ supportedLocales: const [Locale('ar', 'SA'), Locale('en', 'US')],
Locale('ar', 'SA'), fallbackLocale: const Locale('en', 'US'),
Locale('en', 'US') startLocale: const Locale('en', 'US'),
assetLoader: const CodegenLoader(),
], path: "assetsl/langs",
fallbackLocale: Locale('en', 'US'), child: MultiProvider(
// startLocale: Locale('ar', 'SA'), providers: <SingleChildWidget>[
startLocale: Locale('en', 'US'), ChangeNotifierProvider<BaseVM>(
path: 'resources/langs', create: (_) => BaseVM(),
child: MyApp(), ),
ChangeNotifierProvider<DashboardVM>(
create: (_) => DashboardVM(
userRepo: injector.get<UserRepo>(),
commonServices: injector.get<CommonServices>(),
),
),
ChangeNotifierProvider<UserVM>(
create: (_) => UserVM(userRepo: injector.get<UserRepo>()),
),
],
child: const MyApp(),
),
), ),
); );
} }
// todo terminal command to genertate translation files // todo terminal command to generate translation files
// flutter pub run easy_localization:generate --source-dir ./resources/langs // flutter pub run easy_localization:generate --source-dir ./assets/langs
// todo terminal command to genertate translation keys // todo terminal command to generate translation keys
// flutter pub run easy_localization:generate --source-dir ./resources/langs -f keys -o locale_keys.g.dart // flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart
// command to generate languages data from json // command to generate languages data from json
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppProvider( return Sizer(
child: Sizer( builder: (context, orientation, deviceType) {
builder: (context, orientation, deviceType) { AppState().setPostParamsModel(
AppState().setPostParamsModel( PostParamsModel(
PostParamsModel(languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,), languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,
); ),
return MaterialApp( );
theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), return MaterialApp(
debugShowCheckedModeBanner: false, theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"),
localizationsDelegates: context.localizationDelegates, debugShowCheckedModeBanner: false,
supportedLocales: context.supportedLocales, localizationsDelegates: context.localizationDelegates,
locale: context.locale, supportedLocales: context.supportedLocales,
initialRoute: AppRoutes.initialRoute, locale: context.locale,
routes: AppRoutes.routes, initialRoute: AppRoutes.initialRoute,
); routes: AppRoutes.routes,
}, );
), },
); );
} }
} }

@ -20,14 +20,14 @@ class MResponse {
String? message; String? message;
factory MResponse.fromJson(Map<String, dynamic> json) => MResponse( factory MResponse.fromJson(Map<String, dynamic> json) => MResponse(
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], totalItemsCount: json["totalItemsCount"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], messageStatus: json["messageStatus"],
message: json["message"] == null ? null : json["message"], message: json["message"],
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount, "totalItemsCount": totalItemsCount,
"messageStatus": messageStatus == null ? null : messageStatus, "messageStatus": messageStatus,
"message": message == null ? null : message, "message": message,
}; };
} }

@ -4,12 +4,12 @@
import 'dart:convert'; import 'dart:convert';
BasicOtp basicOtpFromJson(String str) => BasicOtp.fromJson(json.decode(str)); BasicOtpRespModel basicOtpFromJson(String str) => BasicOtpRespModel.fromJson(json.decode(str));
String basicOtpToJson(BasicOtp data) => json.encode(data.toJson()); String basicOtpToJson(BasicOtpRespModel data) => json.encode(data.toJson());
class BasicOtp { class BasicOtpRespModel {
BasicOtp({ BasicOtpRespModel({
this.totalItemsCount, this.totalItemsCount,
this.data, this.data,
this.messageStatus, this.messageStatus,
@ -21,7 +21,7 @@ class BasicOtp {
int? messageStatus; int? messageStatus;
String? message; String? message;
factory BasicOtp.fromJson(Map<String, dynamic> json) => BasicOtp( factory BasicOtpRespModel.fromJson(Map<String, dynamic> json) => BasicOtpRespModel(
totalItemsCount: json["totalItemsCount"], totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]), data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],

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

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

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

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

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

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

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

@ -4,12 +4,12 @@
import 'dart:convert'; import 'dart:convert';
LoginPassword loginPasswordFromJson(String str) => LoginPassword.fromJson(json.decode(str)); LoginPasswordRespModel loginPasswordFromJson(String str) => LoginPasswordRespModel.fromJson(json.decode(str));
String loginPasswordToJson(LoginPassword data) => json.encode(data.toJson()); String loginPasswordToJson(LoginPasswordRespModel data) => json.encode(data.toJson());
class LoginPassword { class LoginPasswordRespModel {
LoginPassword({ LoginPasswordRespModel({
this.totalItemsCount, this.totalItemsCount,
this.data, this.data,
this.messageStatus, this.messageStatus,
@ -21,7 +21,7 @@ class LoginPassword {
int? messageStatus; int? messageStatus;
String? message; String? message;
factory LoginPassword.fromJson(Map<String, dynamic> json) => LoginPassword( factory LoginPasswordRespModel.fromJson(Map<String, dynamic> json) => LoginPasswordRespModel(
totalItemsCount: json["totalItemsCount"], totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]), data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],

@ -4,12 +4,12 @@
import 'dart:convert'; import 'dart:convert';
RegisterUser registerUserFromJson(String str) => RegisterUser.fromJson(json.decode(str)); RegisterUserRespModel registerUserFromJson(String str) => RegisterUserRespModel.fromJson(json.decode(str));
String registerUserToJson(RegisterUser data) => json.encode(data.toJson()); String registerUserToJson(RegisterUserRespModel data) => json.encode(data.toJson());
class RegisterUser { class RegisterUserRespModel {
RegisterUser({ RegisterUserRespModel({
this.messageStatus, this.messageStatus,
this.totalItemsCount, this.totalItemsCount,
this.data, this.data,
@ -21,7 +21,7 @@ class RegisterUser {
final Data? data; final Data? data;
final String? message; final String? message;
factory RegisterUser.fromJson(Map<String, dynamic> json) => RegisterUser( factory RegisterUserRespModel.fromJson(Map<String, dynamic> json) => RegisterUserRespModel(
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
totalItemsCount: json["totalItemsCount"], totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]), data: json["data"] == null ? null : Data.fromJson(json["data"]),

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

@ -1,294 +0,0 @@
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/easy_localization.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/colors.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(context, title: "Logo/Brand", isRemoveBackButton: true),
drawer: showDrawer(context),
body: Center(
child: LocaleKeys.dashboard.tr().toText24(),
),
);
}
Widget showDrawer(BuildContext context) {
return Drawer(
child: Column(
children: [
Stack(children: [
Container(
width: double.infinity,
height: 200,
color: MyColors.darkPrimaryColor.withOpacity(0.01),
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: const Icon(
Icons.edit,
color: MyColors.darkPrimaryColor,
).onPress(() {
_openImagePicker();
// _handleURLButtonPress(context, ImageSourceType.camera);
}),
),
12.height,
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(30),
),
child: const Icon(
Icons.delete,
color: Colors.red,
).onPress(() async {
Utils.showLoading(context);
ImageResponse response = await UserApiClent().UpdateUserImage("");
if (response.messageStatus == 1) {
Utils.showToast("Image is Deleted");
setState(() {
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
});
}
Utils.hideLoading(context);
}),
),
],
),
],
),
)
]),
Container(
width: double.infinity,
color: MyColors.darkPrimaryColor.withOpacity(0.1),
padding: const EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
userName.toText20(isBold: true),
AppState().getUser.data!.userInfo!.roleName!.toText10(),
],
),
),
ShowFillButton(
title: LocaleKeys.edit.tr(),
fontSize: 12,
maxHeight: 35,
maxWidth: 70,
onPressed: () {
navigateWithName(context, AppRoutes.editAccoundPage);
},
),
],
),
),
ListTile(
leading: const Icon(
Icons.notifications,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.notifications.tr().toText12(),
),
ListTile(
leading: const Icon(
Icons.settings,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.general.tr().toText12(),
),
ListTile(
leading: const Icon(
Icons.person,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.account.tr().toText12(),
),
ListTile(
leading: Image.asset(
"assets/images/ic_world.png",
width: 20,
height: 20,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.english.tr().toText12(),
onTap: () {
if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA")
context.setLocale(const Locale("en", "US"));
else
context.setLocale(const Locale('ar', 'SA'));
},
),
ListTile(
leading: const Icon(
Icons.logout,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.signOut.tr().toText12(),
onTap: () {
pop(context);
navigateReplaceWithName(context, AppRoutes.registerSelection);
},
),
],
),
);
}
void _openImagePicker() {
showDialog<ImageSource>(
context: context,
builder: (context) => AlertDialog(
content: const Text("Choose image source"),
actions: [
TextButton(child: const Text("Camera"), onPressed: () => cameraImage()),
TextButton(child: const 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;
});
}
}
}

@ -1,100 +0,0 @@
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';
import '../../widgets/txt_field.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(context, title: LocaleKeys.changeEmail.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(20),
child: Column(
children: [
LocaleKeys.enterEmail.tr().toText24(),
12.height,
TxtField(
hint: LocaleKeys.enterNewEmail.tr(),
onChanged: (v) => email = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterCurrentPassword.tr(),
onChanged: (v) => password = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: 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 ?? "");
}
}
}

@ -1,106 +0,0 @@
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';
import '../../widgets/txt_field.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(context, title: LocaleKeys.changeMobile.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(20),
child: Column(
children: [
LocaleKeys.enterNewPhoneNumber.tr().toText24(),
12.height,
TxtField(
hint: LocaleKeys.enterNewPhoneNumber.tr(),
onChanged: (v) => mobileNo = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterCurrentPassword.tr(),
onChanged: (v) => password = v,
),
20.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: 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 ?? "");
}
}
}

@ -1,97 +0,0 @@
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(context, 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,
TxtField(
hint: LocaleKeys.enterOldPassword.tr(),
onChanged: (v) => currentPasswor = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterNewPassword.tr(),
onChanged: (v) => newPassword = v,
),
20.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: 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);
}
}

@ -1,295 +0,0 @@
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';
import '../../classes/colors.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(
context,
title: LocaleKeys.signUp.tr(),
),
body: Container(
width: double.infinity,
height: double.infinity,
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(20),
child: Column(
children: [
6.height,
LocaleKeys.completeProfile.tr().toText24(),
12.height,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: LocaleKeys.profileMsg.tr().toText14(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
),
),
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: (v) {
password = v;
},
),
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(),
Expanded(
child: Column(
children: [
LocaleKeys.termsOfService.tr().toText12(),
LocaleKeys.terms.tr().toText12(color: MyColors.darkPrimaryColor),
],
),
),
Theme(
data: ThemeData(unselectedWidgetColor: Colors.transparent),
child: Checkbox(
value: false,
onChanged: (_) {},
),
)
],
),
16.height,
ShowFillButton(
title: LocaleKeys.save.tr(),
maxWidth: double.infinity,
onPressed: () {
if (validation()) performCompleteProfile();
},
),
16.height,
],
),
),
),
),
);
}
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!.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(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';
});
}
}
}
}

@ -1,125 +0,0 @@
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(context,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(),
maxWidth: 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);
}
}

@ -1,97 +0,0 @@
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(context, 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.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
forgetPasswordOTPMethod(context);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.svg",
),
),
],
),
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 ?? "");
}
},
));
}
}

@ -1,196 +0,0 @@
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 '../../classes/colors.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.EMAIL;
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(context,title: LocaleKeys.changePassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(20),
child: SingleChildScrollView(
child: Container(
height: MediaQuery.of(context).size.height,
child: Column(
children: [
12.height,
LocaleKeys.forgetPassword.tr().toText20(),
20.height,
LocaleKeys.retrievePassword.tr().toText14(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
),
30.height,
LoginEmailTab(
onSelection: (ClassType type) {
setState(() {
this.type = type;
});
},
),
12.height,
type == ClassType.NUMBER
? Column(
children: [
getCountry(),
6.height,
TxtField(
hint: "5********",
value: userName,
onChanged: (v) {
userName = v;
},
)
],
)
: TxtField(
hint: LocaleKeys.emailAddress.tr(),
value: userName,
onChanged: (v) {
userName = v;
},
),
20.height,
(type == ClassType.NUMBER ? LocaleKeys.retriveOnPhone.tr() : LocaleKeys.retriveOnEmail.tr()).toText14(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
),
30.height,
ShowFillButton(
title: LocaleKeys.send.tr(),
maxWidth: double.infinity,
onPressed: () {
if (userName.isNum() && type == ClassType.NUMBER) {
forgetPasswordPhoneOTP(context);
} else if (!userName.isNum() && 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 ?? "");
}
}
}

@ -1,141 +0,0 @@
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(context, title: LocaleKeys.log_in.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(20),
child: SingleChildScrollView(
child: Column(
children: [
LocaleKeys.loginSelection.tr().toText20(),
30.height,
LocaleKeys.welcomeBack.tr().toText20(),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face.svg",
),
),
],
),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
// navigateWithName(context, AppRoutes.dashboard);
performBasicOtp(context);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.svg",
),
),
],
),
],
),
),
),
);
}
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) {
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 ?? "");
SharedPrefManager.setRefreshToken(user.data!.refreshToken??"");
SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson()));
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,108 @@
import 'dart:async';
import 'package:car_customer_app/api/api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/config/dependencies.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:flutter/cupertino.dart';
abstract class BranchRepo {
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude);
Future<Branch> fetchAllBranches();
Future<Category> fetchBranchCategory();
Future<Services> fetchServicesByCategoryId(String serviceCategoryId);
Future<MResponse> createNewService(List<Map<String, dynamic>> map);
Future<Document> getServiceProviderDocument(dynamic userId);
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
}
class BranchRepoImp implements BranchRepo {
@override
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
var postParams = {
"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 ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
}
@override
Future<Branch> fetchAllBranches() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
}
@override
Future<Category> fetchBranchCategory() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
}
@override
Future<Services> fetchServicesByCategoryId(String serviceCategoryId) async {
var postParams = {"ServiceCategoryID": serviceCategoryId};
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t);
}
@override
Future<MResponse> createNewService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
}
@override
Future<Document> getServiceProviderDocument(dynamic userId) async {
var queryParameters = {
"ServiceProviderID": userId.toString(),
};
String? token = AppState().getUser.data?.accessToken;
debugPrint(token);
return await injector.get<ApiClient>().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
}
@override
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 ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t);
}
}

@ -0,0 +1,291 @@
import 'dart:async';
import 'dart:convert';
import 'package:car_customer_app/api/api_client.dart';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/config/dependencies.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/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/confirm_password.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/image_response.dart';
import 'package:car_customer_app/models/user/login_password.dart';
import 'package:car_customer_app/models/user/refresh_token.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/models/user/user.dart';
import 'package:car_customer_app/models/user/verify_email.dart';
import 'package:car_customer_app/utils/shared_prefrence.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
abstract class UserRepo {
Future<BasicOtpRespModel> basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1});
Future<RegisterUserRespModel> basicVerify(String phoneNo, String otp, String userToken);
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password);
Future<Response> loginV1(String phoneNo, String password);
Future<LoginPasswordRespModel> loginV2OTP(String userToken, String loginType);
Future<Response> loginV2OTPVerify(String userToken, String otp);
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken);
Future<Country> getAllCountries();
Future<Cities> getAllCites(String countryId);
Future<Role> getRoles();
Future<Response> forgetPasswordOTPRequest(String userName, int otpType);
Future<PasswordOTPCompareResModel> forgetPasswordOTPCompare(String userToken, String userOTP);
Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword);
Future<MResponse> changePassword(String currentPassword, String newPassword);
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password);
Future<ConfirmMobileRespModel> changeMobileNo(String userToken, String userOTP);
Future<ChanEmailRespModel> changeEmailOTPRequest(String email, String password);
Future<ConfirmEmailRespModel> changeEmail(String userToken, String userOTP);
Future<VerifyEmailRespModel> emailVerify(String email, String userID);
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP);
Future<ImageResponse> updateUserImage(String image);
Future<ImageResponse> getUserImage(String image);
Future<String> updateUserToken();
}
class UserRepoImp implements UserRepo {
@override
Future<BasicOtpRespModel> 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 injector.get<ApiClient>().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams);
}
@override
Future<RegisterUserRespModel> basicVerify(String phoneNo, String otp, String userToken) async {
var postParams = {
"userMobileNo": phoneNo,
"userOTP": otp,
"userToken": userToken,
};
return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams);
}
@override
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password) async {
Map<String, Object> 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 injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams);
}
@override
Future<Response> loginV1(String phoneNo, String password) async {
var postParams = {
"mobileorEmail": phoneNo,
"password": password,
};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V1, postParams);
//return await injector.get<ApiClient>().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams);
}
@override
Future<LoginPasswordRespModel> loginV2OTP(String userToken, String loginType) async {
var postParams = {
"userToken": userToken,
"loginType": loginType,
};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams);
LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body));
return user;
}
@override
Future<Response> loginV2OTPVerify(String userToken, String otp) async {
var postParams = {"userToken": userToken, "userOTP": otp};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
}
@override
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams);
}
@override
Future<Country> getAllCountries() async {
return await injector.get<ApiClient>().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
}
@override
Future<Cities> getAllCites(String countryId) async {
var postParams = {
"CountryID": countryId,
};
return await injector.get<ApiClient>().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
}
@override
Future<Role> getRoles() async {
return await injector.get<ApiClient>().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
}
@override
Future<Response> forgetPasswordOTPRequest(String userName, int otpType) async {
var postParams = {
"userName": userName,
"otpType": 1,
};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams);
//return await injector.get<ApiClient>().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams);
}
@override
Future<PasswordOTPCompareResModel> forgetPasswordOTPCompare(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams);
PasswordOTPCompareResModel otpCompare = PasswordOTPCompareResModel.fromJson(jsonDecode(response.body));
return otpCompare;
}
@override
Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword) async {
var postParams = {
"userToken": userToken,
"newPassword": newPassword,
};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPassword, postParams);
ConfirmPasswordRespModel data = ConfirmPasswordRespModel.fromJson(jsonDecode(response.body));
return data ;
//return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams);
}
@override
Future<MResponse> changePassword(String currentPassword, String newPassword) async {
var postParams = {
"currentPassword": currentPassword,
"newPassword": newPassword,
};
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
}
@override
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password) async {
var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t);
}
@override
Future<ConfirmMobileRespModel> changeMobileNo(String userToken, String userOTP) async {
var postParams = {
"userToken": userToken,
"userOTP": userOTP,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t);
}
@override
Future<ChanEmailRespModel> changeEmailOTPRequest(String email, String password) async {
var postParams = {"email": email, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t);
}
@override
Future<ConfirmEmailRespModel> changeEmail(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t);
}
@override
Future<VerifyEmailRespModel> 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 injector.get<ApiClient>().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t);
}
@override
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t);
}
@override
Future<ImageResponse> updateUserImage(String image) async {
var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image};
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
@override
Future<ImageResponse> getUserImage(String image) async {
var postParams = {};
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token " + t);
return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
@override
Future<String> updateUserToken() async {
String token = await SharedPrefManager.getUserToken();
String refreshToken = await SharedPrefManager.getRefreshToken();
RefreshToken refresh = await refreshTokenAPI(token, refreshToken);
SharedPrefManager.setUserToken(refresh.data!.accessToken ?? "");
SharedPrefManager.setRefreshToken(refresh.data!.refreshToken ?? "");
String mdata = await SharedPrefManager.getData();
UserInfo info = UserInfo.fromJson(jsonDecode(mdata));
User user = User();
user.data = UserData(accessToken: refresh.data!.accessToken ?? "", refreshToken: refresh.data!.refreshToken ?? "", userInfo: info);
AppState().setUser = user;
return refresh.data!.accessToken ?? "";
}
}

@ -0,0 +1,19 @@
import 'dart:io';
import 'package:image_picker/image_picker.dart';
abstract class CommonServices {
Future<File?> pickImageFromPhone(int sourceFlag);
}
class CommonServicesImp implements CommonServices {
@override
Future<File?> pickImageFromPhone(int sourceFlag) async {
final picker = ImagePicker();
final pickedImage = await picker.pickImage(
source: sourceFlag == 0 ? ImageSource.camera : ImageSource.gallery,
);
final pickedImageFile = File(pickedImage!.path);
return pickedImageFile;
}
}

@ -14,11 +14,9 @@ class AppTheme {
// Notice that the counter didn't reset back to zero; the application // Notice that the counter didn't reset back to zero; the application
// is not restarted. // is not restarted.
primaryColor: primaryColor, primaryColor: primaryColor,
primarySwatch: Colors.orange, primaryTextTheme: const TextTheme(
backgroundColor: Colors.white, titleLarge: TextStyle(color: Colors.white),
primaryTextTheme: TextTheme( ), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange).copyWith(background: Colors.white),
headline6: TextStyle(color: Colors.white),
),
); );
} }

@ -1,13 +1,73 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class MyColors {
static const Color darkPrimaryColor = Color(0xffF47F20);
static const Color primaryColor = Color(0xffF69521);
static const Color accentColor = Colors.blue;
static const Color lightTextColor = Color(0xff969696);
static const Color textColor = Color(0xff777777);
static const Color textFieldColor = Color(0xffF3F5F7);
static const Color darkIconColor = Color(0xff28323A);
static const Color darkTextColor = Color(0xff2B353E);
static const Color normalTextColor = Color(0xff5A5A5A);
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);
static Decoration gradient = BoxDecoration(
gradient: const LinearGradient(colors: [
darkPrimaryColor,
primaryColor,
]),
boxShadow: [
BoxShadow(
color: primaryColor.withOpacity(0.5),
blurRadius: 20.0,
spreadRadius: 1.0,
)
],
);
static Decoration gradientButton = BoxDecoration(
gradient: const LinearGradient(colors: [
darkPrimaryColor,
primaryColor,
]),
borderRadius: BorderRadius.circular(6),
boxShadow: [
BoxShadow(
color: primaryColor.withOpacity(0.2),
blurRadius: 4.0,
spreadRadius: 0.5,
)
],
);
}
const Color primaryColor = Colors.white; const Color primaryColor = Colors.white;
const Color accentColor = Colors.blue; const Color accentColor = Colors.blue;
const Color appBackgroundColor = Colors.white; const Color appBackgroundColor = Colors.white;
Color? accentColorDark = Colors.green[800]; Color? accentColorDark = Colors.green[800];
const Color borderColor = Colors.blueGrey; const Color borderColor = Colors.blueGrey;
Color? borderLightColor = Colors.blueGrey[50]; Color? borderLightColor = Colors.blueGrey[50];
Color backgroudColor =
Colors.blueGrey[50]!.withOpacity(0.5) ;
const Color iconColor = Colors.blueGrey; const Color iconColor = Colors.blueGrey;
Color? headingColor = Colors.blueGrey[800]; Color? headingColor = Colors.blueGrey[800];
Color? txtColor = Colors.blueGrey[500]; Color? txtColor = Colors.blueGrey[500];

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'AppPermissionHandler.dart'; import 'permission_handler.dart';
Future<ConfirmAction?> showConfirmDialogs( Future<ConfirmAction?> showConfirmDialogs(
context, msg, positiveText, negativeText) async { context, msg, positiveText, negativeText) async {

@ -0,0 +1,29 @@
// enum APPSTATUS {
// loading,
// unAuthenticated,
// authenticated,
// unverified,
// }
enum AuthMethodTypes {
sms,
whatsApp,
fingerPrint,
faceID,
moreOptions,
}
enum ViewState {
hide,
idle,
busy,
error,
busyLocal,
errorLocal,
}
enum LoginType {
FROM_LOGIN,
SILENT_LOGIN,
SILENT_WITH_OTP,
}

@ -10,7 +10,7 @@ class SharedPrefManager {
static String REFRESH_TOKEN = "user.refresh.token"; static String REFRESH_TOKEN = "user.refresh.token";
static String DATA = "data"; static String DATA = "data";
static Future<SharedPreferences> _prefs = SharedPreferences.getInstance(); static final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
static setUserId(String cookie) async { static setUserId(String cookie) async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();

@ -1,320 +1,306 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; 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:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:sizer/sizer.dart'; import 'package:car_customer_app/exceptions/api_exception.dart';
import 'package:car_customer_app/widgets/loading_dialog.dart';
import 'package:fluttertoast/fluttertoast.dart';
Color getColorFromHex(String hexColor) { class Utils {
hexColor = hexColor.toUpperCase().replaceAll('#', ''); static bool _isLoadingVisible = false;
if (hexColor.length == 6) { static bool get isLoading => _isLoadingVisible;
hexColor = 'FF' + hexColor;
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);
} }
return Color(int.parse(hexColor, radix: 16)); static dynamic getNotNullValue(List<dynamic> list, int index) {
} try {
return list[index];
} catch (ex) {
return null;
}
}
Widget spacerVertical(double v) { static int stringToHex(String colorCode) {
return Container( try {
height: v, return int.parse(colorCode.replaceAll("#", "0xff"));
width: double.infinity, } catch (ex) {
); return (0xff000000);
} }
}
String convertFileToBase64(File file) { static void showLoading(BuildContext context) {
List<int> imageBytes = file.readAsBytesSync(); WidgetsBinding.instance.addPostFrameCallback((_) {
return base64Encode(imageBytes); _isLoadingVisible = true;
} showDialog(
context: context,
barrierColor: Colors.black.withOpacity(0.5),
builder: (BuildContext context) => LoadingDialog(),
).then((value) {
_isLoadingVisible = false;
});
});
}
// String checkFileExt(String path) { static void hideLoading(BuildContext context) {
// String ex = p.extension(path); if (_isLoadingVisible) {
// var parts = ex.split('.'); _isLoadingVisible = false;
// return parts[1] ?? "png"; // '.dart' Navigator.of(context).pop();
// } }
_isLoadingVisible = false;
}
Future delay(int millis) async { static void handleException(dynamic exception, Function(String)? onErrorMessage) {
return await Future.delayed(Duration(milliseconds: millis)); 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);
}
}
inkWellCorner({double? r}) { static Color getColorFromHex(String hexColor) {
return RoundedRectangleBorder( hexColor = hexColor.toUpperCase().replaceAll('#', '');
borderRadius: BorderRadius.circular(r ?? 4),
);
}
Widget spacerHorizontal(double v) { if (hexColor.length == 6) {
return Container( hexColor = 'FF' + hexColor;
height: v, }
width: v,
);
}
// Widget mHeight(double f) { return Color(int.parse(hexColor, radix: 16));
// 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}) { static Widget spacerVertical(double v) {
return Container( return SizedBox(
width: double.infinity, height: v,
height: h ?? 1, width: double.infinity,
color: borderLightColor!.withOpacity(0.7), );
); }
}
Widget mDivider2(Color color, double w) { static String convertFileToBase64(File file) {
return Container( List<int> imageBytes = file.readAsBytesSync();
width: w, return base64Encode(imageBytes);
height: 1, }
color: color,
);
}
InputDecoration txtField(String label) { static Future delay(int millis) async {
return new InputDecoration( return await Future.delayed(Duration(milliseconds: millis));
border: InputBorder.none, }
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none, static inkWellCorner({double? r}) {
errorBorder: InputBorder.none, return RoundedRectangleBorder(
hintText: label, borderRadius: BorderRadius.circular(r ?? 4),
hintStyle: TextStyle(color: Colors.grey), );
disabledBorder: InputBorder.none, }
isDense: false,
contentPadding: EdgeInsets.only(left: 15, right: 15), static Widget spacerHorizontal(double v) {
); return SizedBox(
} height: v,
width: v,
);
}
// Widget mWidth(double f) { static Widget mDivider(Color color, {double? h}) {
// return Container( return Container(
// width: f,
// height: f,
// );
// }
Widget mFlex(int f) {
return Flexible(
flex: f,
child: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: h ?? 1,
), color: color,
); );
} }
Widget mExp(int f) { static Widget mDivider3({double? h}) {
return Expanded( return Container(
flex: f,
child: Container(
width: double.infinity, width: double.infinity,
), height: h ?? 1,
); color: borderLightColor!.withOpacity(0.7),
} );
}
spacer() { static Widget mDivider2(Color color, double w) {
return SizedBox( return Container(
height: 8, width: w,
); height: 1,
} color: color,
// );
// 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) { static InputDecoration txtField(String label) {
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)))); return InputDecoration(
} border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
hintText: label,
hintStyle: const TextStyle(color: Colors.grey),
disabledBorder: InputBorder.none,
isDense: false,
contentPadding: const EdgeInsets.only(left: 15, right: 15),
);
}
circularImage2(String im, double width, double height) { static Widget mFlex(int f) {
return new Container(width: width, height: height, decoration: new BoxDecoration(shape: BoxShape.circle, image: new DecorationImage(fit: BoxFit.fill, image: new AssetImage(im)))); return Flexible(
} flex: f,
child: const SizedBox(
width: double.infinity,
height: double.infinity,
),
);
}
cardRadius(double radius) { static Widget mExp(int f) {
return RoundedRectangleBorder( return Expanded(
side: BorderSide(color: Colors.transparent, width: 1), flex: f,
borderRadius: BorderRadius.circular(radius), child: Container(
); width: double.infinity,
} ),
);
}
cardRadiusWithoutBorder(double radius) { static spacer() {
return RoundedRectangleBorder( return const SizedBox(
side: BorderSide(color: Colors.transparent, width: 1), height: 8,
borderRadius: BorderRadius.circular(radius), );
); }
}
Image imageFromBase64String(String base64String) { static cardRadius(double radius) {
return Image.memory(base64Decode(base64String)); return RoundedRectangleBorder(
} side: const BorderSide(color: Colors.transparent, width: 1),
borderRadius: BorderRadius.circular(radius),
);
}
Uint8List dataFromBase64String(String base64String) { static cardRadiusWithoutBorder(double radius) {
return base64Decode(base64String); return RoundedRectangleBorder(
} side: const BorderSide(color: Colors.transparent, width: 1),
borderRadius: BorderRadius.circular(radius),
);
}
String base64String(Uint8List data) { static Image imageFromBase64String(String base64String) {
return base64Encode(data); return Image.memory(base64Decode(base64String));
} }
static Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
Widget overLayWidget({double? width, double? height, List<Color>? color}) { static String base64String(Uint8List data) {
return Container( return base64Encode(data);
width: width ?? double.infinity, }
height: height ?? 60,
decoration: BoxDecoration( static Widget overLayWidget({double? width, double? height, List<Color>? color}) {
gradient: LinearGradient( return Container(
colors: color != null width: width ?? double.infinity,
? color height: height ?? 60,
: [ decoration: BoxDecoration(
gradient: LinearGradient(
colors: color ??
[
Colors.black.withOpacity(0.2), Colors.black.withOpacity(0.2),
Colors.black.withOpacity(0.1), Colors.black.withOpacity(0.1),
Colors.black.withOpacity(0.004), Colors.black.withOpacity(0.004),
], ],
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
tileMode: TileMode.clamp, tileMode: TileMode.clamp,
),
), ),
), );
); }
}
Decoration containerRadius(Color color, double r) { static Decoration containerRadius(Color color, double r) {
return BoxDecoration( return BoxDecoration(
color: color, color: color,
borderRadius: BorderRadius.all(Radius.circular(r)), borderRadius: BorderRadius.all(Radius.circular(r)),
); );
} }
Decoration containerRadiusTop({Color? color, double? r}) { static Decoration containerRadiusTop({Color? color, double? r}) {
return BoxDecoration( return BoxDecoration(
color: color ?? Colors.white, color: color ?? Colors.white,
borderRadius: BorderRadius.only(topRight: Radius.circular(r ?? 12), topLeft: Radius.circular(r ?? 12)), borderRadius: BorderRadius.only(topRight: Radius.circular(r ?? 12), topLeft: Radius.circular(r ?? 12)),
); );
} }
Decoration containerRadiusBorder(Color color, double r) { static Decoration containerRadiusBorder(Color color, double r) {
return BoxDecoration( return BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
border: Border.all(color: color, width: 1), border: Border.all(color: color, width: 1),
borderRadius: BorderRadius.all(Radius.circular(r)), borderRadius: BorderRadius.all(Radius.circular(r)),
); );
} }
Decoration containerRadiusBottom(Color color, double r) { static Decoration containerRadiusBottom(Color color, double r) {
return BoxDecoration( return BoxDecoration(
color: color, color: color,
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(r), bottomRight: Radius.circular(r)), borderRadius: BorderRadius.only(bottomLeft: Radius.circular(r), bottomRight: Radius.circular(r)),
); );
} }
ShapeBorder cardRadiusTop(double radius) { static ShapeBorder cardRadiusTop(double radius) {
return RoundedRectangleBorder( return RoundedRectangleBorder(
side: BorderSide(color: Colors.transparent, width: 0), side: const BorderSide(color: Colors.transparent, width: 0),
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)), borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
); );
} }
Decoration containerColorRadiusBorderWidth(Color background, double radius, Color color, double w) { static Decoration containerColorRadiusBorderWidth(Color background, double radius, Color color, double w) {
return BoxDecoration( return BoxDecoration(
color: background, color: background,
border: Border.all( border: Border.all(
width: w, // width: w, //
color: color // <--- border width here color: color // <--- border width here
), ),
borderRadius: BorderRadius.circular(radius), borderRadius: BorderRadius.circular(radius),
); );
} }
ShapeBorder cardRadiusTop2(double radius) { static ShapeBorder cardRadiusTop2(double radius) {
return RoundedRectangleBorder( return RoundedRectangleBorder(
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)), borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
); );
} }
ShapeBorder cardRadiusBottom(double radius) { static ShapeBorder cardRadiusBottom(double radius) {
return RoundedRectangleBorder( return RoundedRectangleBorder(
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(radius), bottomRight: Radius.circular(radius)), borderRadius: BorderRadius.only(bottomLeft: Radius.circular(radius), bottomRight: Radius.circular(radius)),
); );
} }
Decoration containerColorRadiusBorder(Color background, double radius, Color color) { static Decoration containerColorRadiusBorder(Color background, double radius, Color color) {
return BoxDecoration( return BoxDecoration(
color: background, color: background,
border: Border.all( border: Border.all(
width: 1, // width: 1, //
color: color // <--- border width here color: color // <--- border width here
), ),
borderRadius: BorderRadius.circular(radius), borderRadius: BorderRadius.circular(radius),
); );
} }
//Decoration appGradient = BoxDecoration( static bool passwordValidateStructure(String value) {
// gradient: LinearGradient( String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{6,}$';
// colors: [ RegExp regExp = RegExp(pattern);
// Colors.green[200], return regExp.hasMatch(value);
// Colors.green, }
// ],
// begin: Alignment.topCenter, static bool isEmailValid(String email) {
// end: Alignment.bottomCenter, 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 = RegExp(p);
//); return regExp.hasMatch(email);
// launchURL(String url) async { }
// if (await canLaunch(url)) { }
// await launch(url);
// } else {
// throw 'Could not launch $url';
// }
// }

@ -0,0 +1,20 @@
import 'package:car_customer_app/utils/enums.dart';
import 'package:flutter/cupertino.dart';
class BaseVM extends ChangeNotifier {
ViewState _state = ViewState.idle;
bool isInternetConnection = true;
ViewState get state => _state;
String error = "";
void setOnlyState(ViewState viewState) {
_state = viewState;
}
void setState(ViewState viewState) {
_state = viewState;
notifyListeners();
}
}

@ -0,0 +1,48 @@
import 'dart:io';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/image_response.dart';
import 'package:car_customer_app/repositories/user_repo.dart';
import 'package:car_customer_app/services/services.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/view_models/base_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
class DashboardVM extends BaseVM {
final CommonServices commonServices;
final UserRepo userRepo;
DashboardVM({required this.commonServices, required this.userRepo});
String pickedImage = "";
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);
}
}

@ -0,0 +1,477 @@
import 'dart:convert';
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/consts.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/change_email.dart';
import 'package:car_customer_app/models/user/change_mobile.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/confirm_password.dart';
import 'package:car_customer_app/models/user/country.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/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/models/user/verify_email.dart';
import 'package:car_customer_app/repositories/user_repo.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/shared_prefrence.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/view_models/base_view_model.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/tab/login_email_tab.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
class UserVM extends BaseVM {
final UserRepo userRepo;
UserVM({required this.userRepo});
bool completeProfilePageCheckbox = false;
void updateCompleteProfilePageCheckbox(bool newValue) {
completeProfilePageCheckbox = newValue;
notifyListeners();
}
String displayStrengthText = '';
void updateStrengthText(String newValue) {
displayStrengthText = newValue;
notifyListeners();
}
double strengthThreshold = 0.0;
void updateStrengthThreshold(double newValue) {
strengthThreshold = newValue;
notifyListeners();
}
Future<void> changeUserEmail(BuildContext context, String email, String password) async {
Utils.showLoading(context);
ChanEmailRespModel otpRequest = await userRepo.changeEmailOTPRequest(email, password);
Utils.hideLoading(context);
if (otpRequest.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
ConfirmEmailRespModel otpCompare = await userRepo.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 ?? "");
}
}
Future<void> changeUserMobile(BuildContext context, int countryId, String mobileNo, String password) async {
Utils.showLoading(context);
ChangeMobileRespModel otpRequest = await userRepo.changeMobileNoOTPRequest(countryId, mobileNo, password);
Utils.hideLoading(context);
if (otpRequest.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
ConfirmMobileRespModel otpCompare = await userRepo.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 ?? "");
}
}
Future<void> changeUserPassword(BuildContext context, String newPassword, String currentPassword) async {
if (Utils.passwordValidateStructure(newPassword)) {
Utils.showLoading(context);
MResponse res = await userRepo.changePassword(currentPassword, 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");
}
}
Future<void> performCompleteProfile(
BuildContext context, {
required String password,
required String confirmPassword,
required String firstName,
required String lastName,
required String email,
required String? userId,
}) async {
if (Utils.passwordValidateStructure(password)) {
if (password == confirmPassword) {
Utils.showLoading(context);
RegisterUserRespModel user = await userRepo.basicComplete(userId ?? "", firstName, lastName, email, password);
Utils.hideLoading(context);
if (user.messageStatus == 1) {
Utils.showToast(LocaleKeys.successfullyRegistered.tr());
pop(context);
} 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 dataValidation({
required String password,
required String? firstName,
required String? lastName,
required String? email,
}) {
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 (!Utils.isEmailValid(email)) {
Utils.showToast(LocaleKeys.enterValidEmail.tr());
isValid = false;
}
} else if (password.isEmpty) {
Utils.showToast(LocaleKeys.passwordNameMandatory.tr());
//("Password is mandatory");
isValid = false;
} else if (!completeProfilePageCheckbox) {
Utils.showToast(LocaleKeys.pleaseAcceptTerms.tr());
//("Please accept terms");
isValid = false;
}
return isValid;
}
void checkPassword(String password) {
if (password.length <= 6) {
updateStrengthThreshold(1 / 4);
updateStrengthText('Your password is too short');
} else if (password.length < 8) {
updateStrengthThreshold(2 / 4);
updateStrengthText('Your password is acceptable but not strong');
} else {
if (!letterReg.hasMatch(password) || !numReg.hasMatch(password)) {
updateStrengthThreshold(3 / 4);
updateStrengthText('Your password is strong');
} else {
updateStrengthThreshold(1);
updateStrengthText('Your password is very strong');
}
}
notifyListeners();
}
Future<void> confirmPasswordOTP(BuildContext context, {required String userToken, required String newPassword}) async {
if (Utils.passwordValidateStructure(newPassword)) {
Utils.showLoading(context);
ConfirmPasswordRespModel data = await userRepo.forgetPassword(userToken, newPassword);
Utils.hideLoading(context);
if (data.messageStatus == 1) {
Utils.showToast(LocaleKeys.passwordIsUpdated.tr());
navigateWithName(context, AppRoutes.loginWithPassword);
} else {
Utils.showToast(data.message ?? "");
}
} else {
Utils.showToast(LocaleKeys.passwordShouldContains.tr());
}
}
Future<void> verifyEmail(BuildContext context, {required String email, required String userID}) async {
Utils.showLoading(context);
VerifyEmailRespModel otpRequest = await userRepo.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 userRepo.emailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
AppState().getUser.data!.userInfo!.isEmailVerified = true;
Utils.showToast(LocaleKeys.emailVerified.tr());
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
notifyListeners();
}
Future<void> forgetPasswordOTPMethod(BuildContext context, {required String userToken}) async {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
PasswordOTPCompareResModel otpCompare = await userRepo.forgetPasswordOTPCompare(userToken, code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
var userToken = otpCompare.data!.userToken;
navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
}
Future<void> forgetPasswordPhoneOTP(BuildContext context, {required String countryCode, required String userName, required int otpType}) async {
Utils.showLoading(context);
Response response = await userRepo.forgetPasswordOTPRequest(countryCode + userName, otpType);
Utils.hideLoading(context);
PasswordOTPRequestRespModel otpRequest = PasswordOTPRequestRespModel.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, {required String countryCode, required String userName, required int otpType}) async {
Utils.showLoading(context);
Response response = await userRepo.forgetPasswordOTPRequest(userName, otpType);
Utils.hideLoading(context);
PasswordOTPRequestRespModel otpRequest = PasswordOTPRequestRespModel.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);
PasswordOTPCompareResModel otpCompare = await userRepo.forgetPasswordOTPCompare(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) {
var userToken = otpCompare.data!.userToken;
navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken);
} else {
Utils.showToast(otpCompare.message ?? "");
}
},
));
} else {
Utils.showToast(otpRequest.message ?? "");
}
}
Future<void> performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken}) async {
Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code);
Utils.hideLoading(context);
RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
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 ?? "");
SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? "");
SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson()));
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 ?? "");
}
}
Future<String> performApiCallLoginVerificationPage(BuildContext context) async {
String userToken = "";
String userName = await SharedPrefManager.getPhoneOrEmail();
String password = await SharedPrefManager.getUserPassword();
if (userName.isNotEmpty && userName.isNotEmpty) {
Utils.showLoading(context);
Response response = await userRepo.loginV1(userName, password);
Utils.hideLoading(context);
LoginPasswordRespModel user = LoginPasswordRespModel.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 ?? "");
}
}
return userToken;
}
Future<void> performBasicOtpLoginVerificationPage(BuildContext context, {required String userToken}) async {
Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code);
Utils.hideLoading(context);
RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
User user = User.fromJson(jsonDecode(response2.body));
AppState().setUser = user;
navigateReplaceWithName(context, AppRoutes.dashboard);
} else {
Utils.showToast(verifiedUser.message ?? "");
}
},
));
} else {
Utils.showToast(user.message ?? "");
}
}
Future<void> performBasicOtpLoginVerifyAccountPage(BuildContext context, {required String phoneNum, required int otpType}) async {
Utils.showLoading(context);
BasicOtpRespModel basicOtp = await userRepo.basicOtp(phoneNum, otpType: otpType);
Utils.hideLoading(context);
if (basicOtp.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
RegisterUserRespModel user = await userRepo.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 ?? "");
}
}
Future<void> performBasicOtpLoginWithPasswordPage(BuildContext context, {required ClassType type, required String countryCode, required String phoneNum, required String password}) async {
Utils.showLoading(context);
Response response = await userRepo.loginV1(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum, password);
Utils.hideLoading(context);
LoginPasswordRespModel user = LoginPasswordRespModel.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 ?? "");
}
}
Future<Country> getAllCountries() async {
return await userRepo.getAllCountries();
}
Future<void> performBasicOtpRegisterPage(BuildContext context, {required String countryCode, required String phoneNum, required int role}) async {
Utils.showLoading(context);
BasicOtpRespModel basicOtp = await userRepo.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);
RegisterUserRespModel user = await userRepo.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 ?? "");
}
}
}

@ -0,0 +1,219 @@
import 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/classes/consts.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/extensions/widget_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/image_response.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/view_models/dashboard_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
class DashboardPage extends StatefulWidget {
const DashboardPage({Key? key}) : super(key: key);
@override
State<DashboardPage> createState() => _DashboardPageState();
}
class _DashboardPageState extends State<DashboardPage> {
late DashboardVM dashboardVM;
@override
void initState() {
super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false);
fetchUsername();
}
fetchUsername() async {}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context, title: "Logo/Brand", isRemoveBackButton: true),
drawer: showDrawer(context),
body: Center(
child: LocaleKeys.dashboard.tr().toText(
height: 23 / 24,
fontSize: 24,
letterSpacing: -1.44,
),
),
);
}
Widget showDrawer(BuildContext context) {
return Drawer(
child: Column(
children: [
Stack(
children: [
Container(
width: double.infinity,
height: 200,
color: MyColors.darkPrimaryColor.withOpacity(0.01),
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: const Icon(
Icons.edit,
color: MyColors.darkPrimaryColor,
).onPress(() {
_openImagePicker();
// _handleURLButtonPress(context, ImageSourceType.camera);
}),
),
12.height,
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(30),
),
child: const Icon(
Icons.delete,
color: Colors.red,
).onPress(() async {
Utils.showLoading(context);
ImageResponse response = await dashboardVM.updateUserImage("");
if (response.messageStatus == 1) {
Utils.showToast("Image is Deleted");
setState(() {
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
});
}
Utils.hideLoading(context);
}),
),
],
),
],
),
)
],
),
Container(
width: double.infinity,
color: MyColors.darkPrimaryColor.withOpacity(0.1),
padding: const EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"userName".toText(
isBold: true,
fontSize: 20,
letterSpacing: -1.44,
),
AppState().getUser.data!.userInfo!.roleName!.toText(fontSize: 10),
],
),
),
ShowFillButton(
title: LocaleKeys.edit.tr(),
fontSize: 12,
maxHeight: 35,
maxWidth: 70,
onPressed: () {
navigateWithName(context, AppRoutes.editAccountPage);
},
),
],
),
),
ListTile(
leading: const Icon(
Icons.notifications,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.notifications.tr().toText(fontSize: 12),
),
ListTile(
leading: const Icon(
Icons.settings,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.general.tr().toText(fontSize: 12),
),
ListTile(
leading: const Icon(
Icons.person,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.account.tr().toText(fontSize: 12),
),
ListTile(
leading: Image.asset(
"assets/images/ic_world.png",
width: 20,
height: 20,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.english.tr().toText(fontSize: 12),
onTap: () {
if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA") {
context.setLocale(const Locale("en", "US"));
} else {
context.setLocale(const Locale('ar', 'SA'));
}
},
),
ListTile(
leading: const Icon(
Icons.logout,
color: MyColors.darkPrimaryColor,
),
title: LocaleKeys.signOut.tr().toText(fontSize: 12),
onTap: () {
pop(context);
navigateReplaceWithName(context, AppRoutes.registerSelection);
},
),
],
),
);
}
void _openImagePicker() {
showDialog<ImageSource>(
context: context,
builder: (context) => AlertDialog(
content: const Text("Choose image source"),
actions: [
TextButton(child: const Text("Camera"), onPressed: () => dashboardVM.pickImageFromPhone(context, 0)),
TextButton(child: const Text("Gallery"), onPressed: () => dashboardVM.pickImageFromPhone(context, 1)),
],
),
);
}
}

@ -1,12 +1,8 @@
import 'package:car_customer_app/config/routes.dart'; import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/utils/navigator.dart'; import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../classes/colors.dart';
class SplashPage extends StatelessWidget { class SplashPage extends StatelessWidget {
const SplashPage({Key? key}) : super(key: key); const SplashPage({Key? key}) : super(key: key);
@ -20,7 +16,7 @@ class SplashPage extends StatelessWidget {
color: Colors.black, color: Colors.black,
child: Column( child: Column(
children: [ children: [
mExp(1), Utils. mExp(1),
Expanded( Expanded(
child: Image.asset( child: Image.asset(
"assets/images/ic_logo_white.png", "assets/images/ic_logo_white.png",
@ -41,7 +37,7 @@ class SplashPage extends StatelessWidget {
"assets/images/ic_engine.png", "assets/images/ic_engine.png",
), ),
), ),
mExp(1), Utils.mExp(1),
], ],
), ),
), ),
@ -49,7 +45,7 @@ class SplashPage extends StatelessWidget {
} }
performTimer(BuildContext context) { performTimer(BuildContext context) {
delay(3).whenComplete(() { Utils.delay(3).whenComplete(() {
navigateReplaceWithName(context, AppRoutes.registerSelection); navigateReplaceWithName(context, AppRoutes.registerSelection);
}); });
} }

@ -0,0 +1,67 @@
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/view_models/user_view_model.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/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ChangeEmailPage extends StatefulWidget {
const ChangeEmailPage({Key? key}) : super(key: key);
@override
State<ChangeEmailPage> createState() => _ChangeEmailPageState();
}
class _ChangeEmailPageState extends State<ChangeEmailPage> {
String password = "";
String email = '';
late UserVM userVM;
@override
void initState() {
userVM = Provider.of<UserVM>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context, title: LocaleKeys.changeEmail.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: const EdgeInsets.all(20),
child: Column(
children: [
LocaleKeys.enterEmail.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
TxtField(
hint: LocaleKeys.enterNewEmail.tr(),
onChanged: (v) => email = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterCurrentPassword.tr(),
onChanged: (v) => password = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity,
onPressed: () async {
await userVM.changeUserEmail(context, email, password);
},
),
],
),
),
),
);
}
}

@ -0,0 +1,67 @@
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/view_models/user_view_model.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/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ChangeMobilePage extends StatefulWidget {
@override
State<ChangeMobilePage> createState() => _ChangeMobilePageState();
}
class _ChangeMobilePageState extends State<ChangeMobilePage> {
int countryID = 1;
String mobileNo = '';
String password = '';
late UserVM userVM;
@override
void initState() {
userVM = Provider.of<UserVM>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context, title: LocaleKeys.changeMobile.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(20),
child: Column(
children: [
LocaleKeys.enterNewPhoneNumber.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
TxtField(
hint: LocaleKeys.enterNewPhoneNumber.tr(),
onChanged: (v) => mobileNo = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterCurrentPassword.tr(),
onChanged: (v) => password = v,
),
20.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity,
onPressed: () async {
await userVM.changeUserMobile(context, countryID, mobileNo, password);
},
),
],
),
),
),
);
}
}

@ -0,0 +1,67 @@
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/view_models/user_view_model.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/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ChangePasswordPage extends StatefulWidget {
const ChangePasswordPage({Key? key}) : super(key: key);
@override
State<ChangePasswordPage> createState() => _ChangePasswordPageState();
}
class _ChangePasswordPageState extends State<ChangePasswordPage> {
String newPassword = "";
String currentPassword = '';
late UserVM userVM;
@override
void initState() {
userVM = Provider.of<UserVM>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context, title: LocaleKeys.changePassword.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.enterNewPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
TxtField(
hint: LocaleKeys.enterOldPassword.tr(),
onChanged: (v) => currentPassword = v,
),
12.height,
TxtField(
hint: LocaleKeys.enterNewPassword.tr(),
onChanged: (v) => newPassword = v,
),
20.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity,
onPressed: () async {
await userVM.changeUserPassword(context, newPassword, currentPassword);
},
),
],
),
),
),
);
}
}

@ -0,0 +1,164 @@
import 'package:car_customer_app/theme/colors.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/register_user.dart';
import 'package:car_customer_app/view_models/user_view_model.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/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class CompleteProfilePage extends StatefulWidget {
final RegisterUserRespModel user;
const CompleteProfilePage(this.user, {Key? key}) : super(key: key);
@override
State<CompleteProfilePage> createState() => _CompleteProfilePageState();
}
class _CompleteProfilePageState extends State<CompleteProfilePage> {
String? firstName = "", lastName = "", email = "", confirmPassword = "";
late String password = "";
bool isChecked = false;
late UserVM userVM;
@override
void initState() {
userVM = Provider.of<UserVM>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(
context,
title: LocaleKeys.signUp.tr(),
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
children: [
6.height,
LocaleKeys.completeProfile.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: LocaleKeys.profileMsg.tr().toText(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
),
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: (v) {
password = v;
},
),
12.height,
TxtField(
hint: LocaleKeys.confirmPass.tr(),
isPasswordEnabled: true,
maxLines: 1,
value: confirmPassword,
onChanged: (v) {
confirmPassword = v;
},
),
50.height,
Row(
children: [
Consumer(builder: (BuildContext context, UserVM userVM, Widget? child) {
return Checkbox(
value: userVM.completeProfilePageCheckbox,
activeColor: Colors.blue,
onChanged: (value) {
userVM.updateCompleteProfilePageCheckbox(value!);
},
);
}),
Expanded(
child: Column(
children: [
LocaleKeys.termsOfService.tr().toText(fontSize: 12),
LocaleKeys.terms.tr().toText(fontSize: 12, color: MyColors.darkPrimaryColor),
],
),
),
Theme(
data: ThemeData(unselectedWidgetColor: Colors.transparent),
child: Checkbox(
value: false,
onChanged: (_) {},
),
)
],
),
16.height,
ShowFillButton(
title: LocaleKeys.save.tr(),
maxWidth: double.infinity,
onPressed: () {
bool validateStatus = userVM.dataValidation(password: password, firstName: firstName, lastName: lastName, email: email);
if (validateStatus) {
userVM.performCompleteProfile(
context,
password: password,
confirmPassword: confirmPassword!,
firstName: firstName!,
lastName: lastName!,
email: email!,
userId: widget.user.data!.userId ?? "",
);
}
}),
16.height,
],
),
),
),
),
);
}
}

@ -1,47 +1,37 @@
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/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.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/view_models/user_view_model.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/widgets/app_bar.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/show_fill_button.dart';
import 'package:car_customer_app/widgets/txt_field.dart'; import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'dart:convert';
import 'package:http/http.dart';
import '../../api/client/user_api_client.dart';
class ConfirmNewPasswordPage extends StatelessWidget { class ConfirmNewPasswordPage extends StatelessWidget {
String userToken; final String userToken;
ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key); ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key);
String newPassword = ""; String newPassword = "";
// String userToken = "";
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold( return Scaffold(
appBar: appBar(context,title: LocaleKeys.forgetPassword.tr()), appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(40), padding: const EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
LocaleKeys.newPassword.tr().toText24(), LocaleKeys.newPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height, 12.height,
TxtField( TxtField(
// hint: "Enter New Password", // hint: "Enter New Password",
hint: LocaleKeys.enterNewPassword.tr(), hint: LocaleKeys.enterNewPassword.tr(),
value: newPassword, value: newPassword,
onChanged: (v) { onChanged: (v) {
@ -52,8 +42,12 @@ class ConfirmNewPasswordPage extends StatelessWidget {
ShowFillButton( ShowFillButton(
title: LocaleKeys.confirm.tr(), title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () { onPressed: () async {
confirmPasswordOTP(context); await userVM.confirmPasswordOTP(
context,
newPassword: newPassword,
userToken: userToken,
);
}, },
), ),
], ],
@ -61,16 +55,4 @@ class ConfirmNewPasswordPage extends StatelessWidget {
), ),
); );
} }
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,91 @@
import 'package:car_customer_app/utils/utils.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/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ConfirmNewPasswordPage extends StatefulWidget {
final String userToken;
const 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) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()),
body: SingleChildScrollView(
child: Container(
// width: double.infinity,
// height: double.infinity,
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.newPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
TextFormField(
decoration: InputDecoration(
// hintText: "Enter New Password",
hintText: LocaleKeys.enterNewPassword.tr(),
hintStyle: const TextStyle(color: Colors.grey),
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => newPassword = v,
),
12.height,
TextFormField(
decoration: InputDecoration(
// hintText: "Confirm Password",
hintText: LocaleKeys.confirmPassword.tr(),
hintStyle: const TextStyle(color: Colors.grey),
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(5.0),
),
),
),
obscureText: true,
onChanged: (v) => confirmPassword = v,
),
40.height,
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity,
onPressed: () {
if (validation()) userVM.confirmPasswordOTP(context, newPassword: newPassword, userToken: widget.userToken);
},
),
],
),
),
),
);
}
bool validation() {
bool isValid = true;
if (newPassword != confirmPassword) {
Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr());
isValid = false;
}
return isValid;
}
}

@ -1,27 +1,20 @@
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/app_state.dart';
import 'package:car_customer_app/classes/utils.dart';
import 'package:car_customer_app/config/routes.dart'; import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_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/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.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/utils/navigator.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart'; import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart'; import 'package:easy_localization/easy_localization.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/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import '../../classes/colors.dart'; import '../../theme/colors.dart';
class EditAccountPage extends StatefulWidget { class EditAccountPage extends StatefulWidget {
const EditAccountPage({Key? key}) : super(key: key);
@override @override
State<EditAccountPage> createState() => _EditAccountPageState(); State<EditAccountPage> createState() => _EditAccountPageState();
} }
@ -32,12 +25,13 @@ class _EditAccountPageState extends State<EditAccountPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold( return Scaffold(
appBar: appBar(context, title: LocaleKeys.editAccount.tr()), appBar: appBar(context, title: LocaleKeys.editAccount.tr()),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: Column( child: Column(
children: [ children: [
20.height, 20.height,
@ -51,21 +45,22 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16, width: 16,
), ),
20.width, 20.width,
Expanded(child: LocaleKeys.changePassword.tr().toText12(isBold: true)), Expanded(child: LocaleKeys.changePassword.tr().toText(isBold: true, fontSize: 12)),
ElevatedButton( ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white), textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor, backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
), ),
onPressed: () { onPressed: () {
navigateWithName(context, AppRoutes.changePassword); navigateWithName(context, AppRoutes.changePassword);
}, },
child: Text( child: Text(
LocaleKeys.change.tr(), LocaleKeys.change.tr(),
style: TextStyle( style: const TextStyle(
fontSize: 14, fontSize: 14, letterSpacing: -0.48,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
height: 23 / 24,
), ),
), ),
), ),
@ -82,24 +77,21 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16, width: 16,
), ),
20.width, 20.width,
Expanded(child: LocaleKeys.changeMobile.tr().toText12(isBold: true)), Expanded(child: LocaleKeys.changeMobile.tr().toText(isBold: true, fontSize: 12)),
LocaleKeys.verify.tr().toText12(color: Colors.green), LocaleKeys.verify.tr().toText(color: Colors.green, fontSize: 12),
20.width, 20.width,
ElevatedButton( ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white), textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor, backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
), ),
onPressed: () { onPressed: () {
navigateWithName(context, AppRoutes.changeMobilePage); navigateWithName(context, AppRoutes.changeMobilePage);
}, },
child: Text( child: Text(
LocaleKeys.change.tr(), LocaleKeys.change.tr(),
style: TextStyle( style: const TextStyle(fontSize: 14, height: 23 / 24,fontWeight: FontWeight.w600),
fontSize: 14,
fontWeight: FontWeight.w600,
),
), ),
) )
], ],
@ -115,13 +107,16 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16, width: 16,
), ),
20.width, 20.width,
Expanded(child: LocaleKeys.changeEmail.tr().toText12(isBold: true)), Expanded(child: LocaleKeys.changeEmail.tr().toText(isBold: true, fontSize: 12)),
InkWell( InkWell(
child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? LocaleKeys.verified.tr() : LocaleKeys.verify.tr()).toText12(color: Colors.green), child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? LocaleKeys.verified.tr() : LocaleKeys.verify.tr()).toText(
color: Colors.green,
fontSize: 12,
),
onTap: (AppState().getUser.data!.userInfo!.isEmailVerified ?? false) onTap: (AppState().getUser.data!.userInfo!.isEmailVerified ?? false)
? null ? null
: () { : () async {
verifyEmail(context); await userVM.verifyEmail(context, email: email, userID: userID);
}, },
), ),
20.width, 20.width,
@ -129,17 +124,14 @@ class _EditAccountPageState extends State<EditAccountPage> {
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white), textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor, backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
), ),
onPressed: () { onPressed: () {
navigateWithName(context, AppRoutes.changeEmailPage); navigateWithName(context, AppRoutes.changeEmailPage);
}, },
child: Text( child: Text(
LocaleKeys.change.tr(), LocaleKeys.change.tr(),
style: TextStyle( style: const TextStyle(fontSize: 14, height: 23 / 24, fontWeight: FontWeight.w600),
fontSize: 14,
fontWeight: FontWeight.w600,
),
), ),
), ),
], ],
@ -164,40 +156,4 @@ class _EditAccountPageState extends State<EditAccountPage> {
), ),
); );
} }
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,70 @@
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ForgetPasswordMethodPage extends StatefulWidget {
final String userToken;
const ForgetPasswordMethodPage(this.userToken, {Key? key}) : super(key: key);
@override
State<ForgetPasswordMethodPage> createState() => _ForgetPasswordMethodPageState();
}
class _ForgetPasswordMethodPageState extends State<ForgetPasswordMethodPage> {
int otpType = 1;
String userOTP = "";
@override
Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.selectMethod.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () async {
otpType = 1;
await userVM.forgetPasswordOTPMethod(context, userToken: widget.userToken);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () async {
otpType = 1;
await userVM.forgetPasswordOTPMethod(context, userToken: widget.userToken);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.svg",
),
),
],
),
Utils.mFlex(10),
],
),
),
);
}
}

@ -0,0 +1,153 @@
import 'dart:async';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/utils.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/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.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/widgets/tab/login_email_tab.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ForgetPasswordPage extends StatefulWidget {
const ForgetPasswordPage({Key? key}) : super(key: key);
@override
State<ForgetPasswordPage> createState() => _ForgetPasswordPageState();
}
class _ForgetPasswordPageState extends State<ForgetPasswordPage> {
int otpType = 1;
String userName = "";
ClassType type = ClassType.EMAIL;
Country? _country;
String countryCode = "";
late UserVM userVM;
@override
void initState() {
super.initState();
scheduleMicrotask(() {
userVM = Provider.of(context, listen: false);
getCountryList();
});
}
getCountryList() async {
_country = await userVM.getAllCountries();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context, title: LocaleKeys.changePassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: const EdgeInsets.all(20),
child: SingleChildScrollView(
child: SizedBox(
height: MediaQuery.of(context).size.height,
child: Column(
children: [
12.height,
LocaleKeys.forgetPassword.tr().toText(
fontSize: 20,
letterSpacing: -1.44,
),
20.height,
LocaleKeys.retrievePassword.tr().toText(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
30.height,
LoginEmailTab(
onSelection: (ClassType type) {
setState(() {
this.type = type;
});
},
),
12.height,
type == ClassType.NUMBER
? Column(
children: [
getCountry(),
6.height,
TxtField(
hint: "5********",
value: userName,
onChanged: (v) {
userName = v;
},
)
],
)
: TxtField(
hint: LocaleKeys.emailAddress.tr(),
value: userName,
onChanged: (v) {
userName = v;
},
),
20.height,
(type == ClassType.NUMBER ? LocaleKeys.retriveOnPhone.tr() : LocaleKeys.retriveOnEmail.tr()).toText(
color: MyColors.lightTextColor,
textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
30.height,
ShowFillButton(
title: LocaleKeys.send.tr(),
maxWidth: double.infinity,
onPressed: () {
if (userName.isNum() && type == ClassType.NUMBER) {
userVM.forgetPasswordPhoneOTP(context, countryCode: countryCode, userName: userName, otpType: otpType);
} else if (!userName.isNum() && type == ClassType.EMAIL) {
userVM.forgetPasswordEmailOTP(context, countryCode: countryCode, userName: userName, otpType: otpType);
}
},
),
Utils.mFlex(10),
],
),
),
),
),
);
}
Widget getCountry() {
if (_country != null) {
List<DropValue> dropList = [];
_country!.data?.forEach((element) {
dropList.add(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 const Center(
child: CircularProgressIndicator(),
);
}
}
}

@ -0,0 +1,89 @@
import 'package:car_customer_app/classes/consts.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/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class LoginMethodSelectionPage extends StatelessWidget {
final String userToken;
const LoginMethodSelectionPage(this.userToken, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context, title: LocaleKeys.log_in.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: const EdgeInsets.all(20),
child: SingleChildScrollView(
child: Column(
children: [
LocaleKeys.loginSelection.tr().toText(fontSize: 20, letterSpacing: -1.44,),
30.height,
LocaleKeys.welcomeBack.tr().toText(fontSize: 20, letterSpacing: -1.44,),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken);
},
title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken);
},
title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face.svg",
),
),
],
),
40.height,
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.svg",
),
),
20.width,
Expanded(
child: ShowImageButton(
onClick: () {
// navigateWithName(context, AppRoutes.dashboard);
userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken);
},
title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.svg",
),
),
],
),
],
),
),
),
);
}
}

@ -1,31 +1,21 @@
import 'dart:convert'; import 'dart:async';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/api/shared_prefrence.dart'; import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/api/client/user_api_client.dart'; import 'package:car_customer_app/extensions/string_extensions.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/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/utils/utils.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.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/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:easy_localization/easy_localization.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:flutter/material.dart';
import 'package:http/http.dart'; import 'package:provider/provider.dart';
class LoginVerificationPage extends StatefulWidget { class LoginVerificationPage extends StatefulWidget {
const LoginVerificationPage({Key? key}) : super(key: key);
@override @override
State<LoginVerificationPage> createState() => _LoginVerificationPageState(); State<LoginVerificationPage> createState() => _LoginVerificationPageState();
} }
@ -33,76 +23,36 @@ class LoginVerificationPage extends StatefulWidget {
class _LoginVerificationPageState extends State<LoginVerificationPage> { class _LoginVerificationPageState extends State<LoginVerificationPage> {
String userToken = ""; String userToken = "";
late UserVM userVM;
@override @override
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
performApiCall(); scheduleMicrotask(() async {
} userVM = Provider.of<UserVM>(context, listen: false);
userToken = await userVM.performApiCallLoginVerificationPage(context);
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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: appBar(context,title: LocaleKeys.login.tr()), appBar: appBar(context, title: LocaleKeys.login.tr()),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(40), padding: const EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
LocaleKeys.verifyAccount.tr().toText24(), LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
mFlex(2), Utils.mFlex(2),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
performBasicOtp(context, userToken); userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
}, },
title: LocaleKeys.fingerPrint.tr(), title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.png", icon: icons + "ic_fingerprint.png",
@ -112,7 +62,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
performBasicOtp(context, userToken); userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
}, },
title: LocaleKeys.faceRecognition.tr(), title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face_id.png", icon: icons + "ic_face_id.png",
@ -126,7 +76,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
performBasicOtp(context, userToken); userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
}, },
title: LocaleKeys.SMS.tr(), title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png", icon: icons + "ic_sms.png",
@ -136,7 +86,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
performBasicOtp(context, userToken); userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
}, },
title: LocaleKeys.whatsapp.tr(), title: LocaleKeys.whatsapp.tr(),
icon: icons + "ic_whatsapp.png", icon: icons + "ic_whatsapp.png",
@ -144,7 +94,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
), ),
], ],
), ),
mFlex(10), Utils.mFlex(10),
], ],
), ),
), ),

@ -1,40 +1,35 @@
import 'package:car_customer_app/api/client/user_api_client.dart'; import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/classes/utils.dart'; import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/config/constants.dart'; import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/generated/locale_keys.g.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/utils/utils.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.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/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:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class LoginVerifyAccountPage extends StatelessWidget { class LoginVerifyAccountPage extends StatelessWidget {
int otpType = 1; int otpType = 1;
String phoneNum = ""; String phoneNum = "";
LoginVerifyAccountPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold( return Scaffold(
appBar: appBar(context,title: LocaleKeys.login.tr()), appBar: appBar(context,title: LocaleKeys.login.tr()),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(40), padding: const EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
LocaleKeys.verifyAccount.tr().toText24(), LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
mFlex(1), Utils.mFlex(1),
TxtField( TxtField(
hint: "966501234567", hint: "966501234567",
value: phoneNum, value: phoneNum,
@ -42,14 +37,14 @@ class LoginVerifyAccountPage extends StatelessWidget {
phoneNum = v; phoneNum = v;
}, },
), ),
mFlex(2), Utils.mFlex(2),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
otpType = 1; otpType = 1;
performBasicOtp(context); userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType);
// showMDialog(context, child: OtpDialog( // showMDialog(context, child: OtpDialog(
// onClick: (String code) { // onClick: (String code) {
// pop(context); // pop(context);
@ -78,7 +73,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
otpType = 1; otpType = 1;
performBasicOtp(context); userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType);
// showMDialog(context, child: OtpDialog( // showMDialog(context, child: OtpDialog(
// onClick: (String code) { // onClick: (String code) {
// pop(context); // pop(context);
@ -104,44 +99,11 @@ class LoginVerifyAccountPage extends StatelessWidget {
), ),
], ],
), ),
mFlex(10), Utils.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 ?? "");
}
}
} }

@ -1,36 +1,25 @@
import 'dart:convert'; import 'dart:async';
import 'package:car_customer_app/api/shared_prefrence.dart'; import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/api/client/user_api_client.dart'; import 'package:car_customer_app/theme/colors.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/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/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/navigator.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.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/dropdown/dropdow_field.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/show_fill_button.dart';
import 'package:car_customer_app/widgets/tab/login_email_tab.dart'; import 'package:car_customer_app/widgets/tab/login_email_tab.dart';
import 'package:car_customer_app/widgets/txt_field.dart'; import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:provider/provider.dart';
import '../../classes/colors.dart';
import '../../models/user/country.dart';
import '../../widgets/dropdown/dropdow_field.dart';
class LoginWithPassword extends StatefulWidget { class LoginWithPassword extends StatefulWidget {
const LoginWithPassword({Key? key}) : super(key: key);
@override @override
State<LoginWithPassword> createState() => _LoginWithPasswordState(); State<LoginWithPassword> createState() => _LoginWithPasswordState();
} }
@ -44,14 +33,20 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
String countryCode = ""; String countryCode = "";
Country? _country; Country? _country;
late UserVM userVM;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
getCountryList();
scheduleMicrotask(() {
userVM = Provider.of(context, listen: false);
getCountryList();
});
} }
getCountryList() async { getCountryList() async {
_country = await UserApiClent().getAllCountries(); _country = await userVM.getAllCountries();
setState(() {}); setState(() {});
} }
@ -62,12 +57,12 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
12.height, 12.height,
LocaleKeys.login.tr().toText20(), LocaleKeys.login.tr().toText(fontSize: 20, letterSpacing: -1.44,),
// 20.height, // 20.height,
// (type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText14( // (type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText14(
// color: MyColors.lightTextColor, // color: MyColors.lightTextColor,
@ -108,7 +103,12 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
], ],
), ),
20.height, 20.height,
LocaleKeys.forgetPasswordQ.tr().toText14(color: MyColors.textColor), LocaleKeys.forgetPasswordQ.tr().toText(
color: MyColors.textColor,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
ShowFillButton( ShowFillButton(
title: LocaleKeys.recover.tr(), title: LocaleKeys.recover.tr(),
isFlatButton: true, isFlatButton: true,
@ -125,7 +125,7 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
title: LocaleKeys.continu.tr(), title: LocaleKeys.continu.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () { onPressed: () {
performBasicOtp(context); userVM.performBasicOtpLoginWithPasswordPage(context, type: type, countryCode: countryCode, phoneNum: phoneNum, password: password);
}, },
), ),
20.height, 20.height,
@ -140,29 +140,15 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
if (_country != null) { if (_country != null) {
List<DropValue> dropList = []; List<DropValue> dropList = [];
_country!.data?.forEach((element) { _country!.data?.forEach((element) {
dropList.add(new DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? "")); dropList.add(DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? ""));
}); });
return DropdownField((DropValue value) { return DropdownField((DropValue value) {
countryCode = value.subValue; countryCode = value.subValue;
}, list: dropList, hint: LocaleKeys.selectCountryCode.tr()); }, list: dropList, hint: LocaleKeys.selectCountryCode.tr());
} else { } else {
return Center( return const Center(
child: CircularProgressIndicator(), 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 ?? "");
}
}
} }

@ -1,31 +1,20 @@
import 'package:car_customer_app/api/api_client.dart'; import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/api/client/user_api_client.dart'; import 'package:car_customer_app/extensions/string_extensions.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/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/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/utils/utils.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.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/dropdown/dropdow_field.dart';
import 'package:car_customer_app/widgets/show_fill_button.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/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../classes/colors.dart'; import '../../theme/colors.dart';
class RegisterPage extends StatefulWidget { class RegisterPage extends StatefulWidget {
const RegisterPage({Key? key}) : super(key: key);
@override @override
State<RegisterPage> createState() => _RegisterPageState(); State<RegisterPage> createState() => _RegisterPageState();
} }
@ -39,32 +28,36 @@ class _RegisterPageState extends State<RegisterPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final UserVM userVM = context.read<UserVM>();
return Scaffold( return Scaffold(
appBar: appBar(context, title: ""), appBar: appBar(context, title: ""),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Container( child: SizedBox(
height: MediaQuery.of(context).size.height, height: MediaQuery.of(context).size.height,
child: Column( child: Column(
children: [ children: [
12.height, 12.height,
LocaleKeys.signUp.tr().toText20(), LocaleKeys.signUp.tr().toText(fontSize: 20, letterSpacing: -1.44,),
20.height, 20.height,
LocaleKeys.enterPhoneNumber.tr().toText14( LocaleKeys.enterPhoneNumber.tr().toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
textAlign: TextAlign.center, textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
), ),
30.height, 30.height,
FutureBuilder<Country>( FutureBuilder<Country>(
future: UserApiClent().getAllCountries(), future: userVM.getAllCountries(),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
List<DropValue> dropList = []; List<DropValue> dropList = [];
snapshot.data?.data?.forEach((element) { snapshot.data?.data?.forEach((element) {
dropList.add(new DropValue( dropList.add(DropValue(
element.id ?? 0, element.id ?? 0,
EasyLocalization.of(context)?.currentLocale?.countryCode == "SA" EasyLocalization.of(context)?.currentLocale?.countryCode == "SA"
? (element.countryNameN ?? "") + " " + (element.countryCode ?? "") ? (element.countryNameN ?? "") + " " + (element.countryCode ?? "")
@ -73,9 +66,12 @@ class _RegisterPageState extends State<RegisterPage> {
}); });
return Column( return Column(
children: [ children: [
LocaleKeys.selectYourCountry.tr().toText14( LocaleKeys.selectYourCountry.tr().toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
textAlign: TextAlign.center, textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
), ),
10.height, 10.height,
DropdownField( DropdownField(
@ -91,21 +87,24 @@ class _RegisterPageState extends State<RegisterPage> {
], ],
); );
} else { } else {
return CircularProgressIndicator(); return const CircularProgressIndicator();
} }
}, },
), ),
18.height, 18.height,
LocaleKeys.enterPhoneForVerfication.tr().toText14( LocaleKeys.enterPhoneForVerfication.tr().toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
textAlign: TextAlign.center, textAlign: TextAlign.center,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
), ),
10.height, 10.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
mExp(1), Utils.mExp(1),
Expanded( Expanded(
flex: 3, flex: 3,
child: Row( child: Row(
@ -129,8 +128,8 @@ class _RegisterPageState extends State<RegisterPage> {
Flexible( Flexible(
child: TextField( child: TextField(
controller: emailController, controller: emailController,
onChanged: (v){ onChanged: (v) {
phoneNum=v; phoneNum = v;
}, },
style: const TextStyle( style: const TextStyle(
fontSize: 20, fontSize: 20,
@ -147,16 +146,15 @@ class _RegisterPageState extends State<RegisterPage> {
], ],
), ),
), ),
mExp(1), Utils.mExp(1),
], ],
), ),
40.height, 40.height,
ShowFillButton( ShowFillButton(
title: LocaleKeys.continu.tr(), title: LocaleKeys.continu.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () { onPressed: () {
if (validation()) performBasicOtp(context); if (validation()) userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: role);
}, },
), ),
], ],
@ -167,30 +165,6 @@ class _RegisterPageState extends State<RegisterPage> {
); );
} }
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 validation() {
bool isValid = true; bool isValid = true;
if (role == -1) { if (role == -1) {

@ -1,19 +1,19 @@
import 'package:car_customer_app/config/routes.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/generated/locale_keys.g.dart';
import 'package:car_customer_app/utils/navigator.dart'; import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.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/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:easy_localization/easy_localization.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'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import '../../classes/colors.dart'; import '../../theme/colors.dart';
class RegisterSelectionPage extends StatelessWidget { class RegisterSelectionPage extends StatelessWidget {
const RegisterSelectionPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -21,7 +21,7 @@ class RegisterSelectionPage extends StatelessWidget {
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
decoration: BoxDecoration( decoration: const BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/images/bn_Intro.png"), image: AssetImage("assets/images/bn_Intro.png"),
fit: BoxFit.cover, fit: BoxFit.cover,
@ -29,12 +29,20 @@ class RegisterSelectionPage extends StatelessWidget {
), ),
child: Column( child: Column(
children: [ children: [
mFlex(6), Utils.mFlex(6),
SvgPicture.asset("assets/images/logo.svg"), SvgPicture.asset("assets/images/logo.svg"),
mFlex(4), Utils.mFlex(4),
LocaleKeys.welcomeMessage.tr().toText20(), LocaleKeys.welcomeMessage.tr().toText(
LocaleKeys.welcomeDes.tr().toText14(color: MyColors.lightTextColor), fontSize: 20,
mFlex(1), letterSpacing: -1.44,
),
LocaleKeys.welcomeDes.tr().toText(
color: MyColors.lightTextColor,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
Utils.mFlex(1),
ShowFillButton( ShowFillButton(
title: LocaleKeys.login.tr(), title: LocaleKeys.login.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
@ -54,17 +62,7 @@ class RegisterSelectionPage extends StatelessWidget {
}, },
), ),
10.height, 10.height,
// ShowFillButton( Utils.mFlex(3),
// title: LocaleKeys.forgetPassword.tr(),
// maxWidth: double.infinity,
// isFlatButton: true,
// isBold: false,
// txtColor: MyColors.darkPrimaryColor,
// onPressed: () {
// navigateWithName(context, AppRoutes.forgetPassword);
// },
// ),
mFlex(3),
TextButton( TextButton(
onPressed: () {}, onPressed: () {},
child: const Text( child: const Text(
@ -76,7 +74,7 @@ class RegisterSelectionPage extends StatelessWidget {
), ),
), ),
), ),
mFlex(3), Utils.mFlex(3),
], ],
), ),
), ),

@ -1,27 +1,19 @@
import 'package:car_customer_app/classes/consts.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/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/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/navigator.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.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/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/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.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/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/txt_field.dart'; import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class VerifyPasswordPage extends StatelessWidget { class VerifyPasswordPage extends StatelessWidget {
int otpType = 1; int otpType = 1;
String phoneNum = ""; String phoneNum = "";
@ -29,19 +21,20 @@ class VerifyPasswordPage extends StatelessWidget {
String userToken = ""; String userToken = "";
String otp = ""; String otp = "";
VerifyPasswordPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: appBar(context,title: LocaleKeys.changePassword.tr()), appBar: appBar(context, title: LocaleKeys.changePassword.tr()),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(40), padding: const EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
LocaleKeys.verifyNewPassword.tr().toText24(), LocaleKeys.verifyNewPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
mFlex(1), Utils.mFlex(1),
TxtField( TxtField(
hint: "966500000000", hint: "966500000000",
value: phoneNum, value: phoneNum,
@ -49,26 +42,26 @@ class VerifyPasswordPage extends StatelessWidget {
phoneNum = v; phoneNum = v;
}, },
), ),
mFlex(2), Utils.mFlex(2),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
otpType = 1; otpType = 1;
// sendPasswordOTP(context); // sendPasswordOTP(context);
showMDialog(context, child: OtpDialog( showMDialog(context, child: OtpDialog(
onClick: (String code) { onClick: (String code) {
pop(context); pop(context);
delay(300).then( Utils.delay(300).then(
(value) => showMDialog( (value) => showMDialog(
context, context,
child: MessageDialog( child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(), title: LocaleKeys.phoneNumberVerified.tr(),
onClick: () { onClick: () {
otpType=1; otpType = 1;
navigateWithName(context, AppRoutes.confirmNewPasswordPage); navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context); // ForgetPasswordOTP(context);
}, },
), ),
), ),
@ -85,18 +78,18 @@ class VerifyPasswordPage extends StatelessWidget {
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
otpType = 1; otpType = 1;
// sendPasswordOTP(context); // sendPasswordOTP(context);
showMDialog(context, child: OtpDialog( showMDialog(context, child: OtpDialog(
onClick: (String code) { onClick: (String code) {
pop(context); pop(context);
delay(300).then( Utils.delay(300).then(
(value) => showMDialog( (value) => showMDialog(
context, context,
child: MessageDialog( child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(), title: LocaleKeys.phoneNumberVerified.tr(),
//"Phone Number Verified ", //"Phone Number Verified ",
onClick: () { onClick: () {
otpType=2; otpType = 2;
navigateWithName(context, AppRoutes.confirmNewPasswordPage); navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context); // ForgetPasswordOTP(context);
}, },
@ -112,32 +105,31 @@ class VerifyPasswordPage extends StatelessWidget {
), ),
], ],
), ),
mFlex(10), Utils.mFlex(10),
], ],
), ),
), ),
); );
} }
// Future<void> sendPasswordOTP(BuildContext context) async { // Future<void> sendPasswordOTP(BuildContext context) async {
// Utils.showLoading(context); // Utils.showLoading(context);
// PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp); // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context); // Utils.hideLoading(context);
// if (otpCompare.messageStatus == 1) { // if (otpCompare.messageStatus == 1) {
// // navigateWithName(context, AppRoutes.confirmNewPasswordPage); // // navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// showMDialog(context, child: OtpDialog( // showMDialog(context, child: OtpDialog(
// onClick: (String code) async { // onClick: (String code) async {
// pop(context); // pop(context);
// Utils.showLoading(context); // Utils.showLoading(context);
// // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp); // // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context); // Utils.hideLoading(context);
// }, // },
// )); // ));
// } else { // } else {
// Utils.showToast(otpCompare.message ?? ""); // Utils.showToast(otpCompare.message ?? "");
// } // }
// } // }
// User otpRequest = User.fromJson(jsonDecode(res.body)); // User otpRequest = User.fromJson(jsonDecode(res.body));
// SharedPrefManager.setUserToken(otpRequest.data!.accessToken ?? ""); // SharedPrefManager.setUserToken(otpRequest.data!.accessToken ?? "");
@ -160,6 +152,4 @@ class VerifyPasswordPage extends StatelessWidget {
// ); // );
// }, // },
// )); // ));
} }

@ -1,8 +1,6 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart'; import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
AppBar appBar( AppBar appBar(
BuildContext context, { BuildContext context, {

@ -4,13 +4,13 @@ import 'package:flutter/material.dart';
class ShowCircularButton extends StatelessWidget { class ShowCircularButton extends StatelessWidget {
VoidCallback onPressed; VoidCallback onPressed;
IconData? iconData; IconData? iconData;
ShowCircularButton({this.iconData,required this.onPressed}); ShowCircularButton({Key? key, this.iconData,required this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Card( return Card(
shape: cardRadius(1000), shape: Utils.cardRadius(1000),
color: Colors.black.withOpacity(0.2), color: Colors.black.withOpacity(0.2),
margin: EdgeInsets.all(12), margin: const EdgeInsets.all(12),
child: IconButton( child: IconButton(
onPressed: onPressed, onPressed: onPressed,
icon: Icon( icon: Icon(

@ -1,12 +1,10 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter/material.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/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import '../../classes/colors.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import '../../theme/colors.dart';
class ShowImageButton extends StatelessWidget { class ShowImageButton extends StatelessWidget {
String icon, title; String icon, title;
VoidCallback onClick; VoidCallback onClick;

@ -1,9 +1,6 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.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/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class MessageDialog extends StatelessWidget { class MessageDialog extends StatelessWidget {
@ -21,7 +18,7 @@ class MessageDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
(title ?? "message").toText24(), (title ?? "message").toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
40.height, 40.height,
ShowFillButton( ShowFillButton(
title: buttonTitle ?? "Continue", title: buttonTitle ?? "Continue",

@ -1,12 +1,9 @@
import 'package:car_customer_app/classes/colors.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/theme/colors.dart'; import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/navigator.dart'; import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/utils/utils.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/widgets/count_down_timer.dart'; import 'package:car_customer_app/widgets/count_down_timer.dart';
import 'package:car_customer_app/widgets/show_fill_button.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:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,7 +13,7 @@ class OtpDialog extends StatefulWidget {
String? userName; String? userName;
Function(String) onClick; Function(String) onClick;
OtpDialog({required this.onClick, this.userName}); OtpDialog({Key? key, required this.onClick, this.userName}) : super(key: key);
@override @override
State<OtpDialog> createState() => _OtpDialogState(); State<OtpDialog> createState() => _OtpDialogState();
@ -32,17 +29,25 @@ class _OtpDialogState extends State<OtpDialog> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
color: Colors.white, color: Colors.white,
padding: EdgeInsets.all(24), padding: const EdgeInsets.all(24),
width: double.infinity, width: double.infinity,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
LocaleKeys.insert_otp_code.tr().toText24(), LocaleKeys.insert_otp_code.tr().toText(
height: 23 / 24,
fontSize: 24,
letterSpacing: -1.44,
),
8.height, 8.height,
LocaleKeys.type_code.tr().toText12(color: MyColors.textColor), LocaleKeys.type_code.tr().toText(color: MyColors.textColor, fontSize: 12),
if (widget.userName != null) (widget.userName ?? "").toText12(color: MyColors.darkPrimaryColor), if (widget.userName != null)
(widget.userName ?? "").toText(
color: MyColors.darkPrimaryColor,
fontSize: 12,
),
20.height, 20.height,
Center( Center(
child: OTPWidget( child: OTPWidget(
@ -86,7 +91,7 @@ class _OtpDialogState extends State<OtpDialog> {
hasTimerStopped = true; hasTimerStopped = true;
}); });
}, },
countDownTimerStyle: TextStyle( countDownTimerStyle: const TextStyle(
color: Colors.blue, color: Colors.blue,
height: 1.2, height: 1.2,
), ),
@ -106,7 +111,7 @@ class _OtpDialogState extends State<OtpDialog> {
padding: const EdgeInsets.all(12.0), padding: const EdgeInsets.all(12.0),
child: Text( child: Text(
LocaleKeys.resend_code.tr(), LocaleKeys.resend_code.tr(),
style: TextStyle( style: const TextStyle(
decoration: TextDecoration.underline, decoration: TextDecoration.underline,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.blue, color: Colors.blue,
@ -114,7 +119,6 @@ class _OtpDialogState extends State<OtpDialog> {
), ),
), ),
), ),
], ],
), ),
); );

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
showDraggableDialog(BuildContext context, Widget child) { showDraggableDialog(BuildContext context, Widget child) {

@ -3,7 +3,6 @@ import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../classes/colors.dart';
class DropValue { class DropValue {
int id; int id;
@ -21,7 +20,7 @@ class DropdownField extends StatefulWidget {
DropValue? dropdownValue; DropValue? dropdownValue;
Function(DropValue) onSelect; Function(DropValue) onSelect;
DropdownField(this.onSelect, {this.hint, this.list,this.dropdownValue}); DropdownField(this.onSelect, {Key? key, this.hint, this.list,this.dropdownValue}) : super(key: key);
@override @override
State<DropdownField> createState() => _DropdownFieldState(); State<DropdownField> createState() => _DropdownFieldState();
@ -30,8 +29,8 @@ class DropdownField extends StatefulWidget {
class _DropdownFieldState extends State<DropdownField> { class _DropdownFieldState extends State<DropdownField> {
DropValue? dropdownValue; DropValue? dropdownValue;
List<DropValue> defaultV = [ List<DropValue> defaultV = [
new DropValue(1, "One", ""), DropValue(1, "One", ""),
new DropValue(2, "Two", ""), DropValue(2, "Two", ""),
]; ];
@override @override
@ -43,16 +42,16 @@ class _DropdownFieldState extends State<DropdownField> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
decoration: containerColorRadiusBorderWidth( decoration: Utils.containerColorRadiusBorderWidth(
MyColors.white, MyColors.white,
0, 0,
MyColors.darkPrimaryColor, MyColors.darkPrimaryColor,
2, 2,
), ),
margin: EdgeInsets.all(0), margin: const EdgeInsets.all(0),
padding: EdgeInsets.only(left: 8, right: 8), padding: const EdgeInsets.only(left: 8, right: 8),
child: DropdownButton<DropValue>( child: DropdownButton<DropValue>(
value: dropdownValue??null, value: dropdownValue,
icon: const Icon(Icons.keyboard_arrow_down_sharp), icon: const Icon(Icons.keyboard_arrow_down_sharp),
elevation: 16, elevation: 16,
iconSize: 16, iconSize: 16,
@ -60,7 +59,7 @@ class _DropdownFieldState extends State<DropdownField> {
iconDisabledColor: borderColor, iconDisabledColor: borderColor,
isExpanded: true, isExpanded: true,
style: const TextStyle(color: Colors.black, fontWeight: FontWeight.w600), style: const TextStyle(color: Colors.black, fontWeight: FontWeight.w600),
hint: (widget.hint ?? "").toText12(color: borderColor), hint: (widget.hint ?? "").toText(color: borderColor, fontSize: 12),
underline: Container( underline: Container(
height: 0, height: 0,
), ),
@ -74,7 +73,7 @@ class _DropdownFieldState extends State<DropdownField> {
(DropValue value) { (DropValue value) {
return DropdownMenuItem<DropValue>( return DropdownMenuItem<DropValue>(
value: value, value: value,
child: value.value.toText12(), child: value.value.toText(fontSize: 12),
); );
}, },
).toList(), ).toList(),

@ -1,3 +1,4 @@
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/config/constants.dart'; import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/extensions/int_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/extensions/string_extensions.dart';
@ -16,7 +17,7 @@ class DropDownText extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
title.toText16(color: accentColor), title.toText(color: accentColor, fontSize: 16, letterSpacing: -0.64,),
16.height, 16.height,
SvgPicture.asset( SvgPicture.asset(
svgIcons + "ic_arrow_down.svg", svgIcons + "ic_arrow_down.svg",

@ -1,5 +1,3 @@
import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
extension ExtendedText on Widget { extension ExtendedText on Widget {

@ -1,24 +1,24 @@
import 'package:car_customer_app/config/constants.dart'; import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class CircularImage extends StatelessWidget { class CircularImage extends StatelessWidget {
double? w, h, padding; final double? w, h, padding;
String? image; final String? image;
CircularImage({this.w, this.h, this.image, this.padding}); const CircularImage({Key? key, this.w, this.h, this.image, this.padding}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return SizedBox(
width: w ?? 120, width: w ?? 120,
height: h ?? 120, height: h ?? 120,
child: Card( child: Card(
shape: cardRadius(2000), shape: Utils.cardRadius(2000),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
elevation: 4, elevation: 4,
child: Card( child: Card(
shape: cardRadius(2000), shape: Utils.cardRadius(2000),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
elevation: 0, elevation: 0,
margin: EdgeInsets.all(padding ?? 0), margin: EdgeInsets.all(padding ?? 0),

@ -1,7 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class LoadingDialog extends StatefulWidget { class LoadingDialog extends StatefulWidget {
LoadingDialog({Key? key}) : super(key: key); LoadingDialog({Key? key}) : super(key: key);

@ -1,9 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/animation.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
typedef OnDone = void Function(String text); typedef OnDone = void Function(String text);

@ -1,4 +1,3 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart'; import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

@ -1,9 +1,7 @@
import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../classes/colors.dart'; import '../theme/colors.dart';
class ShowFillButton extends StatelessWidget { class ShowFillButton extends StatelessWidget {
String title; String title;

@ -3,7 +3,7 @@ import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../classes/colors.dart'; import '../../theme/colors.dart';
enum ClassType { EMAIL, NUMBER } enum ClassType { EMAIL, NUMBER }

@ -1,14 +1,12 @@
import 'package:car_customer_app/extensions/int_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/theme/colors.dart'; import 'package:car_customer_app/theme/colors.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
import '../classes/colors.dart';
class TxtField extends StatelessWidget { class TxtField extends StatelessWidget {
TextEditingController controller = new TextEditingController(); TextEditingController controller = TextEditingController();
String? value; String? value;
String? hint; String? hint;
String? lable; String? lable;
@ -26,9 +24,10 @@ class TxtField extends StatelessWidget {
bool? isPasswordEnabled; bool? isPasswordEnabled;
Function(String)? onChanged; Function(String)? onChanged;
TextInputType? keyboardType; TextInputType? keyboardType;
bool isBackgroundEnabled=false; bool isBackgroundEnabled = false;
TxtField({ TxtField({
Key? key,
this.value, this.value,
this.lable, this.lable,
this.hint, this.hint,
@ -46,8 +45,8 @@ class TxtField extends StatelessWidget {
this.onChanged, this.onChanged,
this.isPasswordEnabled, this.isPasswordEnabled,
this.keyboardType, this.keyboardType,
this.isBackgroundEnabled=false, this.isBackgroundEnabled = false,
}); }) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -57,16 +56,16 @@ class TxtField extends StatelessWidget {
onTap: isNeedClickAll == false onTap: isNeedClickAll == false
? null ? null
: () { : () {
onTap!(); onTap!();
}, },
customBorder: inkWellCorner(), customBorder: Utils.inkWellCorner(),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: isBackgroundEnabled?MyColors.textFieldColor:Colors.white, color: isBackgroundEnabled ? MyColors.textFieldColor : Colors.white,
borderRadius: BorderRadius.all(Radius.circular(0)), borderRadius: const BorderRadius.all(Radius.circular(0)),
), ),
child: TextField( child: TextField(
keyboardType: keyboardType, keyboardType: keyboardType,
@ -95,22 +94,17 @@ class TxtField extends StatelessWidget {
borderSide: BorderSide(color: MyColors.darkPrimaryColor, width: isNeedBorder ? 2.0 : 0), borderSide: BorderSide(color: MyColors.darkPrimaryColor, width: isNeedBorder ? 2.0 : 0),
borderRadius: BorderRadius.circular(0.0), borderRadius: BorderRadius.circular(0.0),
), ),
prefixIcon: prefixData != null prefixIcon: prefixData != null ? const Icon(Icons.search, color: borderColor) : null,
? Icon(
Icons.search,
color: borderColor,
)
: null,
labelStyle: TextStyle(color: borderColor, fontSize: 13.sp), labelStyle: TextStyle(color: borderColor, fontSize: 13.sp),
hintStyle: TextStyle(color: borderColor, fontSize: 9.sp), hintStyle: TextStyle(color: borderColor, fontSize: 9.sp),
hintText: hint ?? "", hintText: hint ?? "",
contentPadding: prefixData == null contentPadding: prefixData == null
? EdgeInsets.only( ? EdgeInsets.only(
left: 12, left: 12,
right: 12, right: 12,
top: maxLines != null ? 12 : 0, top: maxLines != null ? 12 : 0,
bottom: maxLines != null ? 12 : 0, bottom: maxLines != null ? 12 : 0,
) )
: EdgeInsets.zero, : EdgeInsets.zero,
), ),
), ),
@ -122,9 +116,9 @@ class TxtField extends StatelessWidget {
onTap: isNeedClickAll onTap: isNeedClickAll
? null ? null
: () { : () {
controller.clear(); controller.clear();
}, },
child: Container( child: SizedBox(
width: 55, width: 55,
height: 55, height: 55,
child: Card( child: Card(
@ -142,8 +136,8 @@ class TxtField extends StatelessWidget {
Material( Material(
child: InkWell( child: InkWell(
onTap: onTap, onTap: onTap,
customBorder: inkWellCorner(), customBorder: Utils.inkWellCorner(),
child: Container( child: SizedBox(
height: 55, height: 55,
child: Card( child: Card(
color: accentColor, color: accentColor,
@ -152,7 +146,11 @@ class TxtField extends StatelessWidget {
child: Center( child: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 12, right: 12), padding: const EdgeInsets.only(left: 12, right: 12),
child: (buttonTitle ?? "Search").toText16(color: Colors.white), child: (buttonTitle ?? "Search").toText(
color: Colors.white,
fontSize: 16,
letterSpacing: -0.64,
),
), ),
), ),
), ),

@ -1,19 +1,19 @@
import 'package:car_customer_app/config/constants.dart'; import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/utils/utils.dart'; import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class UserImage extends StatelessWidget { class UserImage extends StatelessWidget {
double? size; final double? size;
String? url; final String? url;
UserImage({this.size, this.url}); const UserImage({Key? key, this.size, this.url}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: size ?? 60, height: size ?? 60,
width: size ?? 60, width: size ?? 60,
decoration: containerRadius(Colors.transparent, 1000), decoration: Utils.containerRadius(Colors.transparent, 1000),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
child: Image.asset( child: Image.asset(
url ?? icons + "Blue Masked.jpg", url ?? icons + "Blue Masked.jpg",

@ -52,12 +52,11 @@ dev_dependencies:
injector: ^2.0.0 injector: ^2.0.0
provider: ^6.0.0 provider: ^6.0.0
http: ^0.13.3 http: ^0.13.3
permission_handler: ^9.2.0 permission_handler: ^10.2.0
flutter_svg: ^1.0.3 flutter_svg: ^1.0.3
sizer: ^2.0.15 sizer: ^2.0.15
fluttertoast: ^8.0.9 fluttertoast: ^8.0.9
shared_preferences: ^2.0.6 shared_preferences: ^2.0.6
image_picker: ^0.8.4+4
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
@ -72,8 +71,8 @@ flutter:
uses-material-design: true uses-material-design: true
assets: assets:
- resources/langs/
- assets/ - assets/
- assets/langs/
- assets/icons/ - assets/icons/
- assets/images/ - assets/images/

Loading…
Cancel
Save