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

@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 31
compileSdkVersion 33
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8

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

@ -2,13 +2,16 @@ import 'dart:async';
import 'dart:convert';
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/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:http/http.dart';
import 'package:http/io_client.dart';
import 'client/user_api_client.dart';
typedef FactoryConstructor<U> = U Function(dynamic);
class APIError {
@ -23,40 +26,48 @@ class APIError {
String toString() {
return jsonEncode(this);
}
}
APIException _throwAPIException(Response response) {
switch (response.statusCode) {
case 400:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']);
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 401:
return APIException(APIException.UNAUTHORIZED);
case 403:
return APIException(APIException.FORBIDDEN);
case 404:
return APIException(APIException.NOT_FOUND);
case 500:
return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
default:
return APIException(APIException.OTHER);
static APIException throwAPIException(Response response) {
switch (response.statusCode) {
case 400:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']);
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 401:
return const APIException(APIException.UNAUTHORIZED);
case 403:
return const APIException(APIException.FORBIDDEN);
case 404:
return const APIException(APIException.NOT_FOUND);
case 500:
return const APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
default:
return const APIException(APIException.OTHER);
}
}
}
class ApiClient {
static final ApiClient _instance = ApiClient._internal();
abstract class ApiClient {
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,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
@ -64,24 +75,25 @@ class ApiClient {
_headers.addAll(headers);
}
if (!kReleaseMode) {
print("Url:$url");
print("body:$jsonObject");
debugPrint("Url:$url");
debugPrint("body:$jsonObject");
}
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
print("res121:" + response.body);
print("res121:" + response.statusCode.toString());
debugPrint("res121:" + response.body);
debugPrint("res121:" + response.statusCode.toString());
}
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
print(ex);
print("exception:" + ex.toString());
debugPrint(ex.toString());
debugPrint("exception:" + ex.toString());
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 {
String? requestBody;
if (jsonObject != null) {
@ -115,41 +127,41 @@ class ApiClient {
}
if (queryParameters != null) {
var queryString = new Uri(queryParameters: queryParameters).query;
var queryString = Uri(queryParameters: queryParameters).query;
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) {
print("Url:$url");
print("body:$requestBody");
print("res: " + response.body);
debugPrint("Url:$url");
debugPrint("body:$requestBody");
debugPrint("res: " + response.body);
}
if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body);
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 response;
} else {
throw _throwAPIException(response);
throw APIError.throwAPIException(response);
}
} on SocketException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
debugPrint('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on HttpException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
debugPrint('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
@ -158,14 +170,14 @@ class ApiClient {
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
debugPrint('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} catch (ex) {
print("exception1:" + ex.toString());
debugPrint("exception1:" + ex.toString());
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));
@override
Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
@ -193,16 +206,17 @@ class ApiClient {
var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
print("res:" + response.body);
debugPrint("res:" + response.body);
}
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
print("exception:" + response.body);
debugPrint("exception:" + response.body);
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 {
if (headers == null) {
headers = {'Content-Type': 'application/json'};
@ -225,42 +239,42 @@ class ApiClient {
_headers.addAll(headers);
}
if (queryParameters != null) {
String queryString = new Uri(queryParameters: queryParameters).query;
String queryString = Uri(queryParameters: queryParameters).query;
if (isFirstCall) url = url + '?' + queryString.toString();
}
if (!kReleaseMode) {
print("Url:$url");
print("queryParameters:$queryParameters");
debugPrint("Url:$url");
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) {
print("res: " + response.body.toString());
debugPrint("res: " + response.body.toString());
}
if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body);
if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") {
String mToken = await UserApiClent().UpdateUserToken();
String mToken = await updateUserToken();
isFirstCall = false;
return await _getForResponse(url, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
}
return response;
} else {
throw _throwAPIException(response);
throw APIError.throwAPIException(response);
}
} on SocketException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
debugPrint('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on HttpException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
debugPrint('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
@ -269,7 +283,7 @@ class ApiClient {
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
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);
} else {
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<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 'package:car_customer_app/classes/app_state.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/profile/branch.dart';
import 'package:car_customer_app/models/profile/categroy.dart';
import 'package:car_customer_app/models/profile/document.dart';
import 'package:car_customer_app/models/profile/services.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:http/http.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import '../api_client.dart';
class BranchApiClent {
static final BranchApiClent _instance = BranchApiClent._internal();
BranchApiClent._internal();
factory BranchApiClent() => _instance;
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
var postParams = {
// "id": 0,
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName,
"branchDescription": branchDescription,
"cityID": cityId,
"address": address,
"latitude": latitude,
"longitude": longitude,
"isActive": true
};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
}
Future<Branch> fetchAllBranches() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
}
Future<Category> fetchBranchCategory() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
}
Future<Services> fetchServices(String serviceCategoryId) async {
var postParams = {"ServiceCategoryID": serviceCategoryId};
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t);
}
Future<MResponse> createService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
}
}
// import 'dart:async';
//
// 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/services.dart';
//
// import '../api_client.dart';
//
// class BranchApiClient {
//
// Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
// var postParams = {
// // "id": 0,
// "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
// "branchName": branchName,
// "branchDescription": branchDescription,
// "cityID": cityId,
// "address": address,
// "latitude": latitude,
// "longitude": longitude,
// "isActive": true
// };
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
// }
//
// Future<Branch> fetchAllBranches() async {
// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<ApiClient>().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
// }
//
// Future<Category> fetchBranchCategory() async {
// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<ApiClient>().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
// }
//
// Future<Services> fetchServices(String serviceCategoryId) async {
// var postParams = {"ServiceCategoryID": serviceCategoryId};
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<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 injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
// }
// }

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

@ -1,226 +1,214 @@
import 'dart:async';
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/models/user/cities.dart';
import 'package:car_customer_app/models/user/confirm_email.dart';
import 'package:car_customer_app/models/user/confirm_mobile.dart';
import 'package:car_customer_app/models/user/country.dart';
import 'package:car_customer_app/models/user/image_response.dart';
import 'package:car_customer_app/models/user/refresh_token.dart';
import 'package:car_customer_app/models/user/refresh_token.dart';
import 'package:car_customer_app/models/user/role.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/forget_password_otp_request.dart';
import 'package:car_customer_app/models/user/verify_email.dart';
import 'package:car_customer_app/models/user/verify_email_otp.dart';
import 'package:http/http.dart';
import 'package:car_customer_app/classes/consts.dart';
import 'package:car_customer_app/models/content_info_model.dart';
import 'package:car_customer_app/models/member_model.dart';
import 'package:car_customer_app/models/surah_model.dart';
import 'package:car_customer_app/models/user/basic_otp.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import '../../classes/app_state.dart';
import '../../models/m_response.dart';
import '../../models/user/user.dart';
import '../api_client.dart';
import '../shared_prefrence.dart';
class UserApiClent {
static final UserApiClent _instance = UserApiClent._internal();
UserApiClent._internal();
factory UserApiClent() => _instance;
Future<BasicOtp> basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}) async {
var postParams = {"countryID": countryId, "userMobileNo": phoneNo, "otpType": otpType, "userRole": roleId};
return await ApiClient().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.BasicOTP, postParams);
}
Future<RegisterUser> basicVerify(String phoneNo, String otp, String userToken) async {
var postParams = {
"userMobileNo": phoneNo,
"userOTP": otp,
"userToken": userToken,
};
return await ApiClient().postJsonForObject((json) => RegisterUser.fromJson(json), ApiConsts.BasicVerify, postParams);
}
Future<RegisterUser> basicComplete(String userId, String firstName, String lastName, String email, String password) async {
var postParams;
if (email.isEmpty) {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password};
} else {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password};
}
return await ApiClient().postJsonForObject((json) => RegisterUser.fromJson(json), ApiConsts.BasicComplete, postParams);
}
Future<Response> login_V1(String phoneNo, String password) async {
var postParams = {
"mobileorEmail": phoneNo,
"password": password,
};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V1, postParams);
//return await ApiClient().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams);
}
Future<Response> login_V2_OTP(String userToken, String loginType) async {
var postParams = {
"userToken": userToken,
"loginType": loginType,
};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams);
}
Future<Response> login_V2_OTPVerify(String userToken, String otp) async {
var postParams = {"userToken": userToken, "userOTP": otp};
return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
}
Future<RefreshToken> RefreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams);
}
Future<Country> getAllCountries() async {
var postParams = {};
return await ApiClient().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
}
Future<Cities> getAllCites(String countryId) async {
var postParams = {
"CountryID": countryId,
};
return await ApiClient().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
}
Future<Role> getRoles() async {
return await ApiClient().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
}
Future<Response> ForgetPasswordOTPRequest(String userName, int otpType) async {
var postParams = {
"userName": userName,
"otpType": 1,
};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams);
//return await ApiClient().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams);
}
Future<Response> ForgetPasswordOTPCompare(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams);
// return await ApiClient().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams);
}
Future<Response> ForgetPassword(String userToken, String newPassword) async {
var postParams = {
"userToken": userToken,
"newPassword": newPassword,
};
return await ApiClient().postJsonForResponse(ApiConsts.ForgetPassword, postParams);
//return await ApiClient().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams);
}
Future<MResponse> ChangePassword(String currentPasswor, String newPassword) async {
var postParams = {
"currentPassword": currentPasswor,
"newPassword": newPassword,
};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
}
Future<ChangeMobile> ChangeMobileNoOTPRequest(
countryID,
String mobileNo,
String password,
) async {
var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ChangeMobile.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t);
}
Future<ConfirmMobile> ChangeMobileNo(String userToken, String userOTP) async {
var postParams = {
"userToken": userToken,
"userOTP": userOTP,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ConfirmMobile.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t);
}
Future<ChanEmail> ChangeEmailOTPRequest(String email, String password) async {
var postParams = {"email": email, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ChanEmail.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t);
}
Future<ConfirmEmail> ChangeEmail(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => ConfirmEmail.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t);
}
Future<VerifyEmail> EmailVerify(String email, String userID) async {
var postParams = {
// "email": email,
// "userID": userID,
"email": AppState().getUser.data!.userInfo!.email ?? "",
"userID": AppState().getUser.data!.userInfo!.userId ?? "",
};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => VerifyEmail.fromJson(json), ApiConsts.EmailVerify, postParams, token: t);
}
Future<MResponse> EmailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await ApiClient().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t);
}
Future<ImageResponse> UpdateUserImage(String image) async {
var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
Future<ImageResponse> GetUserImage(String image) async {
var postParams = {};
// return await ApiClient().postJsonForResponse(ApiConsts.ChangePassword, postParams);
String t = AppState().getUser.data!.accessToken ?? "";
print("tokeen " + t);
return await ApiClient().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
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??"";
}
}
// import 'dart:async';
// import 'dart:convert';
//
// import 'package:car_customer_app/classes/consts.dart';
// import 'package:car_customer_app/config/dependencies.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/country.dart';
// import 'package:car_customer_app/models/user/image_response.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/verify_email.dart';
// import 'package:http/http.dart';
//
// import '../../classes/app_state.dart';
// import '../../models/m_response.dart';
// import '../../models/user/user.dart';
// import '../api_client.dart';
// import '../../utils/shared_prefrence.dart';
//
// class UserApiClient {
//
// 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);
// }
//
// 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);
// }
//
// Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password) async {
// var postParams;
// if (email.isEmpty) {
// postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password};
// } else {
// postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password};
// }
//
// return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams);
// }
//
// Future<Response> login_V1(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);
// }
//
// Future<Response> login_V2_OTP(String userToken, String loginType) async {
// var postParams = {
// "userToken": userToken,
// "loginType": loginType,
// };
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams);
// }
//
// Future<Response> login_V2_OTPVerify(String userToken, String otp) async {
// var postParams = {"userToken": userToken, "userOTP": otp};
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
// }
//
// 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);
// }
//
// Future<Country> getAllCountries() async {
// var postParams = {};
// return await injector.get<ApiClient>().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
// }
//
// Future<Cities> getAllCites(String countryId) async {
// var postParams = {
// "CountryID": countryId,
// };
// return await injector.get<ApiClient>().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
// }
//
// Future<Role> getRoles() async {
// return await injector.get<ApiClient>().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
// }
//
// 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);
// }
//
// Future<Response> ForgetPasswordOTPCompare(String userToken, String userOTP) async {
// var postParams = {"userToken": userToken, "userOTP": userOTP};
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams);
// // return await injector.get<ApiClient>().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams);
// }
//
// Future<Response> ForgetPassword(String userToken, String newPassword) async {
// var postParams = {
// "userToken": userToken,
// "newPassword": newPassword,
// };
// return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPassword, postParams);
// //return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams);
// }
//
// Future<MResponse> ChangePassword(String currentPasswor, String newPassword) async {
// var postParams = {
// "currentPassword": currentPasswor,
// "newPassword": newPassword,
// };
// // return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ChangePassword, postParams);
//
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
// }
//
// 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);
// }
//
// 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);
// }
//
// 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);
// }
//
// 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);
// }
//
// 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);
// }
//
// 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);
// }
//
// 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 ?? "";
// print("tokeen " + t);
// return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
// }
//
// Future<ImageResponse> GetUserImage(String image) async {
// var postParams = {};
// // return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ChangePassword, postParams);
//
// String t = AppState().getUser.data!.accessToken ?? "";
// print("tokeen " + t);
// return await injector.get<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();
// 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 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/pages/dashboard/dashboard_page.dart';
// import 'package:car_customer_app/pages/settings/create_services_page.dart';
// import 'package:car_customer_app/pages/settings/dealership_page.dart';
// import 'package:car_customer_app/pages/settings/define_branch_page.dart';
// import 'package:car_customer_app/pages/settings/define_license_page.dart';
import 'package:car_customer_app/pages/user/change_email_page.dart';
import 'package:car_customer_app/pages/user/change_mobile_page.dart';
import 'package:car_customer_app/pages/user/change_password_page.dart';
import 'package:car_customer_app/pages/user/complete_profile_page.dart';
import 'package:car_customer_app/pages/user/confirm_new_password_page.dart';
import 'package:car_customer_app/pages/user/edit_account_page.dart';
import 'package:car_customer_app/pages/user/forget_password_method_page.dart';
import 'package:car_customer_app/pages/user/forget_password_page.dart';
import 'package:car_customer_app/pages/user/login_method_selection_page.dart';
import 'package:car_customer_app/pages/user/login_verification_page.dart';
import 'package:car_customer_app/pages/user/login_verify_account_page.dart';
import 'package:car_customer_app/pages/user/login_with_password_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_1_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_2_page.dart';
// import 'package:car_customer_app/pages/user/profile/profile_3_page.dart';
import 'package:car_customer_app/pages/user/register_page.dart';
import 'package:car_customer_app/pages/user/register_selection_page.dart';
import 'package:car_customer_app/pages/user/splash_page.dart';
import 'package:car_customer_app/pages/user/vertify_password_page.dart';
import 'package:car_customer_app/views/dashboard/dashboard_page.dart';
// import 'package:car_customer_app/views/settings/create_services_page.dart';
// import 'package:car_customer_app/views/settings/dealership_page.dart';
// import 'package:car_customer_app/views/settings/define_branch_page.dart';
// import 'package:car_customer_app/views/settings/define_license_page.dart';
import 'package:car_customer_app/views/user/change_email_page.dart';
import 'package:car_customer_app/views/user/change_mobile_page.dart';
import 'package:car_customer_app/views/user/change_password_page.dart';
import 'package:car_customer_app/views/user/complete_profile_page.dart';
import 'package:car_customer_app/views/user/confirm_new_password_page.dart';
import 'package:car_customer_app/views/user/edit_account_page.dart';
import 'package:car_customer_app/views/user/forget_password_method_page.dart';
import 'package:car_customer_app/views/user/forget_password_page.dart';
import 'package:car_customer_app/views/user/login_method_selection_page.dart';
import 'package:car_customer_app/views/user/login_verification_page.dart';
import 'package:car_customer_app/views/user/login_verify_account_page.dart';
import 'package:car_customer_app/views/user/login_with_password_page.dart';
// import 'package:car_customer_app/views/user/profile/profile_1_page.dart';
// import 'package:car_customer_app/views/user/profile/profile_2_page.dart';
// import 'package:car_customer_app/views/user/profile/profile_3_page.dart';
import 'package:car_customer_app/views/user/register_page.dart';
import 'package:car_customer_app/views/user/register_selection_page.dart';
import 'package:car_customer_app/views/splash/splash_page.dart';
import 'package:car_customer_app/views/user/vertify_password_page.dart';
import 'package:flutter/material.dart';
class AppRoutes {
//User
static final String splash = "/splash";
static final String registerSelection = "/registerSelection";
static final String loginVerifyAccount = "/loginVerifyAccount";
static final String register = "/register";
static final String forgetPassword = "/forgetPassword";
static final String loginVerification = "/loginVerification";
static final String loginWithPassword = "/loginWithPassword";
static final String loginMethodSelection = "/loginMethodSelection";
static final String completeProfile = "/completeProfile";
static final String profile1 = "/profile1";
static final String profile2 = "/profile2";
static final String profile3 = "/profile3";
static final String vertifyPassword = "/vertifyPassword";
static final String confirmNewPasswordPage = "/confirmNewPasswordPage";
static final String defineLicense = "/defineLicese";
static final String changePassword = "/changePassword";
static final String forgetPasswordMethodPage = "/forgetPasswordMethodPage";
static final String changeMobilePage = "/changeMobilePage";
static final String changeEmailPage = "/changeEmailPage";
static final String editAccoundPage = "/editAccoundPage";
static const String splash = "/splash";
static const String registerSelection = "/registerSelection";
static const String loginVerifyAccount = "/loginVerifyAccount";
static const String register = "/register";
static const String forgetPassword = "/forgetPassword";
static const String loginVerification = "/loginVerification";
static const String loginWithPassword = "/loginWithPassword";
static const String loginMethodSelection = "/loginMethodSelection";
static const String completeProfile = "/completeProfile";
static const String profile1 = "/profile1";
static const String profile2 = "/profile2";
static const String profile3 = "/profile3";
static const String verifyPassword = "/vertifyPassword";
static const String confirmNewPasswordPage = "/confirmNewPasswordPage";
static const String defineLicense = "/defineLicese";
static const String changePassword = "/changePassword";
static const String forgetPasswordMethodPage = "/forgetPasswordMethodPage";
static const String changeMobilePage = "/changeMobilePage";
static const String changeEmailPage = "/changeEmailPage";
static const String editAccountPage = "/editAccoundPage";
static final String dashboard = "/dashboard";
static const String dashboard = "/dashboard";
//settings
static final String dealershipSetting = "/dealershipSetting";
static final String defineBranch = "/defineBranch";
static final String createServices = "/createServices";
static const String dealershipSetting = "/dealershipSetting";
static const String defineBranch = "/defineBranch";
static const String createServices = "/createServices";
static final String initialRoute = splash;
static const String initialRoute = splash;
static final Map<String, WidgetBuilder> routes = {
//User
splash: (context) => SplashPage(),
splash: (context) => const SplashPage(),
registerSelection: (context) => RegisterSelectionPage(),
loginVerifyAccount: (context) => LoginVerifyAccountPage(),
register: (context) => RegisterPage(),
forgetPassword: (context) => ForgetPasswordPage(),
loginVerification: (context) => LoginVerificationPage(),
loginVerification: (context) => const LoginVerificationPage(),
loginWithPassword: (context) => LoginWithPassword(),
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(),
// profile2: (context) => Profile2Page(),
// profile3: (context) => Profile3Page(),
// defineLicense: (context) => DefineLicensePage(),
vertifyPassword: (context) => VerifyPasswordPage(),
verifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String),
changePassword: (context) => ChangePasswordPage(),
forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String),
changeMobilePage: (context) => ChangeMobilePage(),
changeEmailPage : (context) => ChangeEmailPage(),
editAccoundPage : (context) => EditAccountPage(),
changeEmailPage : (context) => const ChangeEmailPage(),
editAccountPage : (context) => EditAccountPage(),
//Home page
dashboard: (context) => DashboardPage(),
dashboard: (context) => const DashboardPage(),
//setting
// dealershipSetting: (context) => DealershipPage(),

@ -1,82 +1,79 @@
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart';
import 'package:car_customer_app/classes/colors.dart';
extension EmailValidator on String {
Widget get toWidget => Text(this);
Widget toText({Color? color, bool isBold = false, double? fontSize}) => Text(
this,
style: TextStyle(fontSize: fontSize ?? 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
);
Widget toText10({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
);
Widget toText11({Color? color, bool isUnderLine = false, bool isBold = false}) => Text(
this,
style: TextStyle(
fontSize: 11,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.33,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text(
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
style: TextStyle(
fontSize: 12,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.72,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText13({Color? color, bool isUnderLine = false}) => Text(
this,
style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText14({Color? color, bool isBold = false,TextAlign? textAlign,}) => Text(
Widget toText({Color? color, bool isBold = false, double? fontSize, bool isUnderLine = false, TextDecoration? textDecoration, double letterSpacing = -0.4, TextAlign? textAlign, double? height}) =>
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, color: color ?? MyColors.darkTextColor, fontSize: 24, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
style: TextStyle(
height: height,
decoration: textDecoration ?? TextDecoration.none,
fontSize: fontSize ?? 10,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: letterSpacing,
),
);
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),
);
// 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,
// 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() {
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 date = this.split("T")[0];
String time = this.split("T")[1];
String date = split("T")[0];
String time = split("T")[1];
var dates = date.split("-");
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
}

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

@ -46,6 +46,7 @@ class CodegenLoader extends AssetLoader{
"createPass": "انشاء كلمة مرور جديده *",
"newPassword": " كلمة مرور جديده",
"forgetPassword": "نسيت كلمة المرور",
"forgetPasswordRecover": "نسيت كلمة المرور؟ استعادة",
"editAccount": "تعديل الحساب",
"change": "تغيير",
"verifyAccount": "التحقق من الحساب",
@ -81,7 +82,7 @@ class CodegenLoader extends AssetLoader{
"edit": "تعديل",
"imageDeleted": "تم حذف الصوره",
"dashboard": "الصفحه الرئيسيه",
"termsOfService": "من خلال إنشاء حساب فإنك توافق على شروط الخدمة و\n سياسة الخصوصية",
"termsOfService": "من خلال إنشاء حساب فإنك توافق على",
"userInformation": "معلومات المتسخدم",
"faceRecognition": "تحقق مع بصمة الوجه",
"fingerPrint": "تحقق مع بصمة الاصبع",
@ -91,7 +92,6 @@ class CodegenLoader extends AssetLoader{
"userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل",
"arabic": "عربي",
"english": "English",
"title": "Hello",
"msg": "Hello {} in the {} world ",
@ -128,11 +128,33 @@ class CodegenLoader extends AssetLoader{
"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 = {
"firstTimeLogIn": "First Time Log In",
"signUp": "Sing Up",
"signUp": "Sign Up",
"changeMobile": "Change Mobile",
"notifications": "Notifications",
"general": "General",
@ -163,6 +185,7 @@ static const Map<String,dynamic> en_US = {
"createPass": "Create Password *",
"newPassword": "New Password",
"forgetPassword": "Forget Password",
"forgetPasswordRecover": "Forget Password? Recover",
"editAccount": "Edit Account",
"change": "Change",
"verifyAccount": "Verify Account",
@ -197,7 +220,7 @@ static const Map<String,dynamic> en_US = {
"edit": "EDIT",
"imageDeleted": "Image is Deleted",
"dashboard": "Dashboard/Main Page",
"termsOfService": "By creating an account you agree to our Terms of Service and\n Privacy Policy",
"termsOfService": "By creating an account you agree to our",
"userInformation": "User Information",
"faceRecognition": "Face Recognition",
"fingerPrint": "Finger Print",
@ -207,7 +230,7 @@ static const Map<String,dynamic> en_US = {
"userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email",
"number": "Number",
"english": "English",
"english": "عربي",
"title": "Hello",
"msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language",
@ -243,7 +266,29 @@ static const Map<String,dynamic> en_US = {
"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};
}

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

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

@ -4,12 +4,12 @@
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 {
BasicOtp({
class BasicOtpRespModel {
BasicOtpRespModel({
this.totalItemsCount,
this.data,
this.messageStatus,
@ -21,7 +21,7 @@ class BasicOtp {
int? messageStatus;
String? message;
factory BasicOtp.fromJson(Map<String, dynamic> json) => BasicOtp(
factory BasicOtpRespModel.fromJson(Map<String, dynamic> json) => BasicOtpRespModel(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],

@ -2,20 +2,20 @@
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;
Null? totalItemsCount;
Data? data;
String? message;
ChanEmail(
ChanEmailRespModel(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ChanEmail.fromJson(Map<String, dynamic> json) {
ChanEmailRespModel.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;

@ -2,20 +2,20 @@
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;
Null? totalItemsCount;
Data? data;
String? message;
ChangeMobile(
ChangeMobileRespModel(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ChangeMobile.fromJson(Map<String, dynamic> json) {
ChangeMobileRespModel.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;

@ -2,20 +2,20 @@
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;
Null? totalItemsCount;
Data? data;
String? message;
ConfirmEmail(
ConfirmEmailRespModel(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ConfirmEmail.fromJson(Map<String, dynamic> json) {
ConfirmEmailRespModel.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;

@ -3,21 +3,21 @@
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;
Null? totalItemsCount;
Data? data;
String? message;
ConfirmMobile(
ConfirmMobileRespModel(
{this.messageStatus, this.totalItemsCount, this.data, this.message});
ConfirmMobile.fromJson(Map<String, dynamic> json) {
ConfirmMobileRespModel.fromJson(Map<String, dynamic> json) {
messageStatus = json['messageStatus'];
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;

@ -1,19 +1,19 @@
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;
int? messageStatus;
String? message;
ConfirmPassword(
ConfirmPasswordRespModel(
{this.totalItemsCount, this.messageStatus, this.message});
ConfirmPassword.fromJson(Map<String, dynamic> json) {
ConfirmPasswordRespModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
messageStatus = json['messageStatus'];
message = json['message'];

@ -1,18 +1,18 @@
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;
Data? data;
int? messageStatus;
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'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];

@ -1,20 +1,20 @@
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;
Data? data;
int? messageStatus;
String? message;
PasswordOTPRequest(
PasswordOTPRequestRespModel(
{this.totalItemsCount, this.data, this.messageStatus, this.message});
PasswordOTPRequest.fromJson(Map<String, dynamic> json) {
PasswordOTPRequestRespModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
messageStatus = json['messageStatus'];

@ -4,12 +4,12 @@
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 {
LoginPassword({
class LoginPasswordRespModel {
LoginPasswordRespModel({
this.totalItemsCount,
this.data,
this.messageStatus,
@ -21,7 +21,7 @@ class LoginPassword {
int? messageStatus;
String? message;
factory LoginPassword.fromJson(Map<String, dynamic> json) => LoginPassword(
factory LoginPasswordRespModel.fromJson(Map<String, dynamic> json) => LoginPasswordRespModel(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],

@ -4,12 +4,12 @@
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 {
RegisterUser({
class RegisterUserRespModel {
RegisterUserRespModel({
this.messageStatus,
this.totalItemsCount,
this.data,
@ -21,7 +21,7 @@ class RegisterUser {
final Data? data;
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"],
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : Data.fromJson(json["data"]),

@ -3,21 +3,21 @@
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;
Data? data;
int? messageStatus;
String? message;
VerifyEmail(
VerifyEmailRespModel(
{this.totalItemsCount, this.data, this.messageStatus, this.message});
VerifyEmail.fromJson(Map<String, dynamic> json) {
VerifyEmailRespModel.fromJson(Map<String, dynamic> json) {
totalItemsCount = json['totalItemsCount'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
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
// is not restarted.
primaryColor: primaryColor,
primarySwatch: Colors.orange,
backgroundColor: Colors.white,
primaryTextTheme: TextTheme(
headline6: TextStyle(color: Colors.white),
),
primaryTextTheme: const TextTheme(
titleLarge: TextStyle(color: Colors.white),
), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange).copyWith(background: Colors.white),
);
}

@ -1,13 +1,73 @@
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 accentColor = Colors.blue;
const Color appBackgroundColor = Colors.white;
Color? accentColorDark = Colors.green[800];
const Color borderColor = Colors.blueGrey;
Color? borderLightColor = Colors.blueGrey[50];
Color backgroudColor =
Colors.blueGrey[50]!.withOpacity(0.5) ;
const Color iconColor = Colors.blueGrey;
Color? headingColor = Colors.blueGrey[800];
Color? txtColor = Colors.blueGrey[500];

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'AppPermissionHandler.dart';
import 'permission_handler.dart';
Future<ConfirmAction?> showConfirmDialogs(
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 DATA = "data";
static Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
static final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
static setUserId(String cookie) async {
final prefs = await SharedPreferences.getInstance();

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

@ -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/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter/material.dart';
import '../../classes/colors.dart';
class SplashPage extends StatelessWidget {
const SplashPage({Key? key}) : super(key: key);
@ -20,7 +16,7 @@ class SplashPage extends StatelessWidget {
color: Colors.black,
child: Column(
children: [
mExp(1),
Utils. mExp(1),
Expanded(
child: Image.asset(
"assets/images/ic_logo_white.png",
@ -41,7 +37,7 @@ class SplashPage extends StatelessWidget {
"assets/images/ic_engine.png",
),
),
mExp(1),
Utils.mExp(1),
],
),
),
@ -49,7 +45,7 @@ class SplashPage extends StatelessWidget {
}
performTimer(BuildContext context) {
delay(3).whenComplete(() {
Utils.delay(3).whenComplete(() {
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/int_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/confirm_password.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/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/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart';
import '../../api/client/user_api_client.dart';
import 'package:provider/provider.dart';
class ConfirmNewPasswordPage extends StatelessWidget {
String userToken;
final String userToken;
ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key);
String newPassword = "";
// String userToken = "";
@override
Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context,title: LocaleKeys.forgetPassword.tr()),
appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.newPassword.tr().toText24(),
LocaleKeys.newPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
12.height,
TxtField(
// hint: "Enter New Password",
// hint: "Enter New Password",
hint: LocaleKeys.enterNewPassword.tr(),
value: newPassword,
onChanged: (v) {
@ -52,8 +42,12 @@ class ConfirmNewPasswordPage extends StatelessWidget {
ShowFillButton(
title: LocaleKeys.confirm.tr(),
maxWidth: double.infinity,
onPressed: () {
confirmPasswordOTP(context);
onPressed: () async {
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/utils.dart';
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/m_response.dart';
import 'package:car_customer_app/models/user/verify_email.dart';
import 'package:car_customer_app/models/user/verify_email_otp.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/view_models/user_view_model.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../classes/colors.dart';
import 'package:provider/provider.dart';
import '../../theme/colors.dart';
class EditAccountPage extends StatefulWidget {
const EditAccountPage({Key? key}) : super(key: key);
@override
State<EditAccountPage> createState() => _EditAccountPageState();
}
@ -32,12 +25,13 @@ class _EditAccountPageState extends State<EditAccountPage> {
@override
Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context, title: LocaleKeys.editAccount.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(20),
padding: const EdgeInsets.all(20),
child: Column(
children: [
20.height,
@ -51,21 +45,22 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16,
),
20.width,
Expanded(child: LocaleKeys.changePassword.tr().toText12(isBold: true)),
Expanded(child: LocaleKeys.changePassword.tr().toText(isBold: true, fontSize: 12)),
ElevatedButton(
style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
),
onPressed: () {
navigateWithName(context, AppRoutes.changePassword);
},
child: Text(
LocaleKeys.change.tr(),
style: TextStyle(
fontSize: 14,
style: const TextStyle(
fontSize: 14, letterSpacing: -0.48,
fontWeight: FontWeight.w600,
height: 23 / 24,
),
),
),
@ -82,24 +77,21 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16,
),
20.width,
Expanded(child: LocaleKeys.changeMobile.tr().toText12(isBold: true)),
LocaleKeys.verify.tr().toText12(color: Colors.green),
Expanded(child: LocaleKeys.changeMobile.tr().toText(isBold: true, fontSize: 12)),
LocaleKeys.verify.tr().toText(color: Colors.green, fontSize: 12),
20.width,
ElevatedButton(
style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
),
onPressed: () {
navigateWithName(context, AppRoutes.changeMobilePage);
},
child: Text(
LocaleKeys.change.tr(),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
style: const TextStyle(fontSize: 14, height: 23 / 24,fontWeight: FontWeight.w600),
),
)
],
@ -115,13 +107,16 @@ class _EditAccountPageState extends State<EditAccountPage> {
width: 16,
),
20.width,
Expanded(child: LocaleKeys.changeEmail.tr().toText12(isBold: true)),
Expanded(child: LocaleKeys.changeEmail.tr().toText(isBold: true, fontSize: 12)),
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)
? null
: () {
verifyEmail(context);
: () async {
await userVM.verifyEmail(context, email: email, userID: userID);
},
),
20.width,
@ -129,17 +124,14 @@ class _EditAccountPageState extends State<EditAccountPage> {
style: ElevatedButton.styleFrom(
textStyle: const TextStyle(color: Colors.white),
backgroundColor: MyColors.darkPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
),
onPressed: () {
navigateWithName(context, AppRoutes.changeEmailPage);
},
child: Text(
LocaleKeys.change.tr(),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
style: const TextStyle(fontSize: 14, height: 23 / 24, 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 '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 'dart:async';
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/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/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: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:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:provider/provider.dart';
class LoginVerificationPage extends StatefulWidget {
const LoginVerificationPage({Key? key}) : super(key: key);
@override
State<LoginVerificationPage> createState() => _LoginVerificationPageState();
}
@ -33,76 +23,36 @@ class LoginVerificationPage extends StatefulWidget {
class _LoginVerificationPageState extends State<LoginVerificationPage> {
String userToken = "";
late UserVM userVM;
@override
void initState() {
// TODO: implement initState
super.initState();
performApiCall();
}
performApiCall() async {
String userName = await SharedPrefManager.getPhoneOrEmail();
String password = await SharedPrefManager.getUserPassword();
if (userName.isNotEmpty && userName.isNotEmpty) {
Utils.showLoading(context);
Response response = await UserApiClent().login_V1(userName, password);
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
userToken = user.data!.userToken ?? "";
// navigateWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken);
} else {
Utils.showToast(user.message ?? "");
}
}
}
Future<void> performBasicOtp(BuildContext context, String userToken) async {
Utils.showLoading(context);
Response response = await UserApiClent().login_V2_OTP(userToken, "1");
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await UserApiClent().login_V2_OTPVerify(user.data!.userToken ?? "", code);
Utils.hideLoading(context);
RegisterUser verifiedUser = RegisterUser.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
User user = User.fromJson(jsonDecode(response2.body));
AppState().setUser = user;
print(user.data!.userInfo!.providerId.toString());
navigateReplaceWithName(context, AppRoutes.dashboard);
} else {
Utils.showToast(verifiedUser.message ?? "");
}
},
));
} else {
Utils.showToast(user.message ?? "");
}
scheduleMicrotask(() async {
userVM = Provider.of<UserVM>(context, listen: false);
userToken = await userVM.performApiCallLoginVerificationPage(context);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context,title: LocaleKeys.login.tr()),
appBar: appBar(context, title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyAccount.tr().toText24(),
mFlex(2),
LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
Utils.mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
},
title: LocaleKeys.fingerPrint.tr(),
icon: icons + "ic_fingerprint.png",
@ -112,7 +62,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
},
title: LocaleKeys.faceRecognition.tr(),
icon: icons + "ic_face_id.png",
@ -126,7 +76,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
},
title: LocaleKeys.SMS.tr(),
icon: icons + "ic_sms.png",
@ -136,7 +86,7 @@ class _LoginVerificationPageState extends State<LoginVerificationPage> {
Expanded(
child: ShowImageButton(
onClick: () {
performBasicOtp(context, userToken);
userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken);
},
title: LocaleKeys.whatsapp.tr(),
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/utils.dart';
import 'package:car_customer_app/config/constants.dart';
import 'package:car_customer_app/config/routes.dart';
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/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/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:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class LoginVerifyAccountPage extends StatelessWidget {
int otpType = 1;
String phoneNum = "";
LoginVerifyAccountPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
UserVM userVM = context.read<UserVM>();
return Scaffold(
appBar: appBar(context,title: LocaleKeys.login.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyAccount.tr().toText24(),
mFlex(1),
LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
Utils.mFlex(1),
TxtField(
hint: "966501234567",
value: phoneNum,
@ -42,14 +37,14 @@ class LoginVerifyAccountPage extends StatelessWidget {
phoneNum = v;
},
),
mFlex(2),
Utils.mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
performBasicOtp(context);
userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) {
// pop(context);
@ -78,7 +73,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
child: ShowImageButton(
onClick: () {
otpType = 1;
performBasicOtp(context);
userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) {
// 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/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/models/user/country.dart';
import 'package:car_customer_app/theme/colors.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/basic_otp.dart';
import 'package:car_customer_app/models/user/login_password.dart';
import 'package:car_customer_app/models/user/register_user.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/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: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/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/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import '../../classes/colors.dart';
import '../../models/user/country.dart';
import '../../widgets/dropdown/dropdow_field.dart';
import 'package:provider/provider.dart';
class LoginWithPassword extends StatefulWidget {
const LoginWithPassword({Key? key}) : super(key: key);
@override
State<LoginWithPassword> createState() => _LoginWithPasswordState();
}
@ -44,14 +33,20 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
String countryCode = "";
Country? _country;
late UserVM userVM;
@override
void initState() {
super.initState();
getCountryList();
scheduleMicrotask(() {
userVM = Provider.of(context, listen: false);
getCountryList();
});
}
getCountryList() async {
_country = await UserApiClent().getAllCountries();
_country = await userVM.getAllCountries();
setState(() {});
}
@ -62,12 +57,12 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(20),
padding: const EdgeInsets.all(20),
child: SingleChildScrollView(
child: Column(
children: [
12.height,
LocaleKeys.login.tr().toText20(),
LocaleKeys.login.tr().toText(fontSize: 20, letterSpacing: -1.44,),
// 20.height,
// (type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText14(
// color: MyColors.lightTextColor,
@ -108,7 +103,12 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
],
),
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(
title: LocaleKeys.recover.tr(),
isFlatButton: true,
@ -125,7 +125,7 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
title: LocaleKeys.continu.tr(),
maxWidth: double.infinity,
onPressed: () {
performBasicOtp(context);
userVM.performBasicOtpLoginWithPasswordPage(context, type: type, countryCode: countryCode, phoneNum: phoneNum, password: password);
},
),
20.height,
@ -140,29 +140,15 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
if (_country != null) {
List<DropValue> dropList = [];
_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) {
countryCode = value.subValue;
}, list: dropList, hint: LocaleKeys.selectCountryCode.tr());
} else {
return Center(
return const Center(
child: CircularProgressIndicator(),
);
}
}
Future<void> performBasicOtp(BuildContext context) async {
Utils.showLoading(context);
Response response = await UserApiClent().login_V1(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum, password);
Utils.hideLoading(context);
LoginPassword user = LoginPassword.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) {
SharedPrefManager.setPhoneOrEmail(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum);
SharedPrefManager.setUserPassword(password);
navigateReplaceWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken);
} else {
Utils.showToast(user.message ?? "");
}
}
}

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

@ -1,19 +1,19 @@
import 'package:car_customer_app/config/routes.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/generated/locale_keys.g.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../classes/colors.dart';
import '../../theme/colors.dart';
class RegisterSelectionPage extends StatelessWidget {
const RegisterSelectionPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
@ -21,7 +21,7 @@ class RegisterSelectionPage extends StatelessWidget {
body: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/bn_Intro.png"),
fit: BoxFit.cover,
@ -29,12 +29,20 @@ class RegisterSelectionPage extends StatelessWidget {
),
child: Column(
children: [
mFlex(6),
Utils.mFlex(6),
SvgPicture.asset("assets/images/logo.svg"),
mFlex(4),
LocaleKeys.welcomeMessage.tr().toText20(),
LocaleKeys.welcomeDes.tr().toText14(color: MyColors.lightTextColor),
mFlex(1),
Utils.mFlex(4),
LocaleKeys.welcomeMessage.tr().toText(
fontSize: 20,
letterSpacing: -1.44,
),
LocaleKeys.welcomeDes.tr().toText(
color: MyColors.lightTextColor,
fontSize: 14,
height: 23 / 24,
letterSpacing: -0.48,
),
Utils.mFlex(1),
ShowFillButton(
title: LocaleKeys.login.tr(),
maxWidth: double.infinity,
@ -54,17 +62,7 @@ class RegisterSelectionPage extends StatelessWidget {
},
),
10.height,
// ShowFillButton(
// title: LocaleKeys.forgetPassword.tr(),
// maxWidth: double.infinity,
// isFlatButton: true,
// isBold: false,
// txtColor: MyColors.darkPrimaryColor,
// onPressed: () {
// navigateWithName(context, AppRoutes.forgetPassword);
// },
// ),
mFlex(3),
Utils.mFlex(3),
TextButton(
onPressed: () {},
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/utils.dart';
import 'package:car_customer_app/config/constants.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/generated/locale_keys.g.dart';
import 'package:car_customer_app/models/user/forget_password_otp_compare.dart';
import 'package:car_customer_app/models/user/forget_password_otp_request.dart';
import 'package:car_customer_app/utils/navigator.dart';
import 'package:car_customer_app/utils/utils.dart';
import 'package:car_customer_app/widgets/app_bar.dart';
import 'package:car_customer_app/widgets/button/show_image_button.dart';
import 'package:car_customer_app/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/extensions/widget_extensions.dart';
import 'package:car_customer_app/widgets/dialog/dialogs.dart';
import 'package:car_customer_app/widgets/dialog/message_dialog.dart';
import 'package:car_customer_app/widgets/dialog/otp_dialog.dart';
import 'package:car_customer_app/widgets/txt_field.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class VerifyPasswordPage extends StatelessWidget {
int otpType = 1;
String phoneNum = "";
@ -29,19 +21,20 @@ class VerifyPasswordPage extends StatelessWidget {
String userToken = "";
String otp = "";
VerifyPasswordPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appBar(context,title: LocaleKeys.changePassword.tr()),
appBar: appBar(context, title: LocaleKeys.changePassword.tr()),
body: Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(40),
padding: const EdgeInsets.all(40),
child: Column(
children: [
LocaleKeys.verifyNewPassword.tr().toText24(),
mFlex(1),
LocaleKeys.verifyNewPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
Utils.mFlex(1),
TxtField(
hint: "966500000000",
value: phoneNum,
@ -49,26 +42,26 @@ class VerifyPasswordPage extends StatelessWidget {
phoneNum = v;
},
),
mFlex(2),
Utils.mFlex(2),
Row(
children: [
Expanded(
child: ShowImageButton(
onClick: () {
otpType = 1;
// sendPasswordOTP(context);
// sendPasswordOTP(context);
showMDialog(context, child: OtpDialog(
onClick: (String code) {
pop(context);
delay(300).then(
Utils.delay(300).then(
(value) => showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(),
onClick: () {
otpType=1;
otpType = 1;
navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context);
// ForgetPasswordOTP(context);
},
),
),
@ -85,18 +78,18 @@ class VerifyPasswordPage extends StatelessWidget {
child: ShowImageButton(
onClick: () {
otpType = 1;
// sendPasswordOTP(context);
// sendPasswordOTP(context);
showMDialog(context, child: OtpDialog(
onClick: (String code) {
pop(context);
delay(300).then(
Utils.delay(300).then(
(value) => showMDialog(
context,
child: MessageDialog(
title: LocaleKeys.phoneNumberVerified.tr(),
//"Phone Number Verified ",
onClick: () {
otpType=2;
otpType = 2;
navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// ForgetPasswordOTP(context);
},
@ -112,32 +105,31 @@ class VerifyPasswordPage extends StatelessWidget {
),
],
),
mFlex(10),
Utils.mFlex(10),
],
),
),
);
}
// Future<void> sendPasswordOTP(BuildContext context) async {
// Utils.showLoading(context);
// PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// if (otpCompare.messageStatus == 1) {
// // navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) async {
// pop(context);
// Utils.showLoading(context);
// // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// },
// ));
// } else {
// Utils.showToast(otpCompare.message ?? "");
// }
// }
// Future<void> sendPasswordOTP(BuildContext context) async {
// Utils.showLoading(context);
// PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// if (otpCompare.messageStatus == 1) {
// // navigateWithName(context, AppRoutes.confirmNewPasswordPage);
// showMDialog(context, child: OtpDialog(
// onClick: (String code) async {
// pop(context);
// Utils.showLoading(context);
// // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp);
// Utils.hideLoading(context);
// },
// ));
// } else {
// Utils.showToast(otpCompare.message ?? "");
// }
// }
// User otpRequest = User.fromJson(jsonDecode(res.body));
// SharedPrefManager.setUserToken(otpRequest.data!.accessToken ?? "");
@ -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/int_extensions.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
AppBar appBar(
BuildContext context, {

@ -4,13 +4,13 @@ import 'package:flutter/material.dart';
class ShowCircularButton extends StatelessWidget {
VoidCallback onPressed;
IconData? iconData;
ShowCircularButton({this.iconData,required this.onPressed});
ShowCircularButton({Key? key, this.iconData,required this.onPressed}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
shape: cardRadius(1000),
shape: Utils.cardRadius(1000),
color: Colors.black.withOpacity(0.2),
margin: EdgeInsets.all(12),
margin: const EdgeInsets.all(12),
child: IconButton(
onPressed: onPressed,
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 '../../classes/colors.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../theme/colors.dart';
class ShowImageButton extends StatelessWidget {
String icon, title;
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/string_extensions.dart';
import 'package:car_customer_app/widgets/show_fill_button.dart';
import 'package:flutter/material.dart';
class MessageDialog extends StatelessWidget {
@ -21,7 +18,7 @@ class MessageDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
(title ?? "message").toText24(),
(title ?? "message").toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,),
40.height,
ShowFillButton(
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/utils/navigator.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/widgets/count_down_timer.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:flutter/material.dart';
@ -16,7 +13,7 @@ class OtpDialog extends StatefulWidget {
String? userName;
Function(String) onClick;
OtpDialog({required this.onClick, this.userName});
OtpDialog({Key? key, required this.onClick, this.userName}) : super(key: key);
@override
State<OtpDialog> createState() => _OtpDialogState();
@ -32,17 +29,25 @@ class _OtpDialogState extends State<OtpDialog> {
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: EdgeInsets.all(24),
padding: const EdgeInsets.all(24),
width: double.infinity,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
LocaleKeys.insert_otp_code.tr().toText24(),
LocaleKeys.insert_otp_code.tr().toText(
height: 23 / 24,
fontSize: 24,
letterSpacing: -1.44,
),
8.height,
LocaleKeys.type_code.tr().toText12(color: MyColors.textColor),
if (widget.userName != null) (widget.userName ?? "").toText12(color: MyColors.darkPrimaryColor),
LocaleKeys.type_code.tr().toText(color: MyColors.textColor, fontSize: 12),
if (widget.userName != null)
(widget.userName ?? "").toText(
color: MyColors.darkPrimaryColor,
fontSize: 12,
),
20.height,
Center(
child: OTPWidget(
@ -86,7 +91,7 @@ class _OtpDialogState extends State<OtpDialog> {
hasTimerStopped = true;
});
},
countDownTimerStyle: TextStyle(
countDownTimerStyle: const TextStyle(
color: Colors.blue,
height: 1.2,
),
@ -106,7 +111,7 @@ class _OtpDialogState extends State<OtpDialog> {
padding: const EdgeInsets.all(12.0),
child: Text(
LocaleKeys.resend_code.tr(),
style: TextStyle(
style: const TextStyle(
decoration: TextDecoration.underline,
fontWeight: FontWeight.bold,
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';
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:flutter/material.dart';
import '../../classes/colors.dart';
class DropValue {
int id;
@ -21,7 +20,7 @@ class DropdownField extends StatefulWidget {
DropValue? dropdownValue;
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
State<DropdownField> createState() => _DropdownFieldState();
@ -30,8 +29,8 @@ class DropdownField extends StatefulWidget {
class _DropdownFieldState extends State<DropdownField> {
DropValue? dropdownValue;
List<DropValue> defaultV = [
new DropValue(1, "One", ""),
new DropValue(2, "Two", ""),
DropValue(1, "One", ""),
DropValue(2, "Two", ""),
];
@override
@ -43,16 +42,16 @@ class _DropdownFieldState extends State<DropdownField> {
@override
Widget build(BuildContext context) {
return Container(
decoration: containerColorRadiusBorderWidth(
decoration: Utils.containerColorRadiusBorderWidth(
MyColors.white,
0,
MyColors.darkPrimaryColor,
2,
),
margin: EdgeInsets.all(0),
padding: EdgeInsets.only(left: 8, right: 8),
margin: const EdgeInsets.all(0),
padding: const EdgeInsets.only(left: 8, right: 8),
child: DropdownButton<DropValue>(
value: dropdownValue??null,
value: dropdownValue,
icon: const Icon(Icons.keyboard_arrow_down_sharp),
elevation: 16,
iconSize: 16,
@ -60,7 +59,7 @@ class _DropdownFieldState extends State<DropdownField> {
iconDisabledColor: borderColor,
isExpanded: true,
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(
height: 0,
),
@ -74,7 +73,7 @@ class _DropdownFieldState extends State<DropdownField> {
(DropValue value) {
return DropdownMenuItem<DropValue>(
value: value,
child: value.value.toText12(),
child: value.value.toText(fontSize: 12),
);
},
).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/extensions/int_extensions.dart';
import 'package:car_customer_app/extensions/string_extensions.dart';
@ -16,7 +17,7 @@ class DropDownText extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
title.toText16(color: accentColor),
title.toText(color: accentColor, fontSize: 16, letterSpacing: -0.64,),
16.height,
SvgPicture.asset(
svgIcons + "ic_arrow_down.svg",

@ -1,5 +1,3 @@
import 'dart:math';
import 'package:flutter/material.dart';
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:flutter/material.dart';
class CircularImage extends StatelessWidget {
double? w, h, padding;
String? image;
final double? w, h, padding;
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
Widget build(BuildContext context) {
return Container(
return SizedBox(
width: w ?? 120,
height: h ?? 120,
child: Card(
shape: cardRadius(2000),
shape: Utils.cardRadius(2000),
clipBehavior: Clip.antiAlias,
elevation: 4,
child: Card(
shape: cardRadius(2000),
shape: Utils.cardRadius(2000),
clipBehavior: Clip.antiAlias,
elevation: 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/rendering.dart';
class LoadingDialog extends StatefulWidget {
LoadingDialog({Key? key}) : super(key: key);

@ -1,9 +1,7 @@
import 'dart:async';
import 'package:flutter/animation.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
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:flutter/material.dart';

@ -1,9 +1,7 @@
import 'package:car_customer_app/extensions/string_extensions.dart';
import 'package:car_customer_app/theme/colors.dart';
import 'package:flutter/material.dart';
import '../classes/colors.dart';
import '../theme/colors.dart';
class ShowFillButton extends StatelessWidget {
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:flutter/material.dart';
import '../../classes/colors.dart';
import '../../theme/colors.dart';
enum ClassType { EMAIL, NUMBER }

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

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

Loading…
Cancel
Save