diff --git a/README.md b/README.md index aa2a3c3..45b3264 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/android/app/build.gradle b/android/app/build.gradle index 5942955..09fd0fb 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -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 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 782b7c0..685204c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:icon="@mipmap/ic_launcher"> = 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 postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); + + Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - ApiClient._internal(); + Future getJsonForObject(FactoryConstructor factoryConstructor, String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - factory ApiClient() => _instance; + Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); +} +class ApiClientImp implements ApiClient { + @override Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, {String? token, Map? queryParameters, Map? 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 postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? 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 _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); + @override Future getJsonForObject(FactoryConstructor factoryConstructor, String url, {String? token, Map? queryParameters, Map? 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 getJsonForResponse(String url, {String? token, Map? queryParameters, Map? 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 _get(url, {Map? headers}) => _withClient((client) => client.get(url, headers: headers)); + + Future 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 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??""; + } } diff --git a/lib/api/client/branch_api_client.dart b/lib/api/client/branch_api_client.dart index 973e3bf..f1fc0b3 100644 --- a/lib/api/client/branch_api_client.dart +++ b/lib/api/client/branch_api_client.dart @@ -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 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 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 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 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 createService(List> 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 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().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); +// } +// +// Future fetchAllBranches() async { +// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t); +// } +// +// Future fetchBranchCategory() async { +// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t); +// } +// +// Future fetchServices(String serviceCategoryId) async { +// var postParams = {"ServiceCategoryID": serviceCategoryId}; +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t); +// } +// +// Future createService(List> map) async { +// String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t); +// } +// } diff --git a/lib/api/client/profile_api_client.dart b/lib/api/client/profile_api_client.dart index de796b0..ac65413 100644 --- a/lib/api/client/profile_api_client.dart +++ b/lib/api/client/profile_api_client.dart @@ -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 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 serviceProviderDocumentsUpdate(List? documents) async { - List> 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 getServiceProviderDocument(dynamic userId) async { +// var queryParameters = { +// "ServiceProviderID": userId.toString(), +// }; +// String? token = AppState().getUser.data?.accessToken; +// debugPrint(token); +// return await injector.get().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); +// } +// +// Future serviceProviderDocumentsUpdate(List? documents) async { +// List> 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().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t); +// } +// } diff --git a/lib/api/client/user_api_client.dart b/lib/api/client/user_api_client.dart index 1ac90c5..c3f19f1 100644 --- a/lib/api/client/user_api_client.dart +++ b/lib/api/client/user_api_client.dart @@ -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(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 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 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 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 login_V2_OTP(String userToken, String loginType) async { - var postParams = { - "userToken": userToken, - "loginType": loginType, - }; - return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams); - } - - Future login_V2_OTPVerify(String userToken, String otp) async { - var postParams = {"userToken": userToken, "userOTP": otp}; - return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); - } - - Future 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 getAllCountries() async { - var postParams = {}; - return await ApiClient().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); - } - - Future getAllCites(String countryId) async { - var postParams = { - "CountryID": countryId, - }; - return await ApiClient().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams); - } - - Future getRoles() async { - return await ApiClient().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles); - } - - Future 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 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 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 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 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 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 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 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 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 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 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 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 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 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().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams); +// } +// +// Future basicVerify(String phoneNo, String otp, String userToken) async { +// var postParams = { +// "userMobileNo": phoneNo, +// "userOTP": otp, +// "userToken": userToken, +// }; +// return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams); +// } +// +// Future 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().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams); +// } +// +// Future login_V1(String phoneNo, String password) async { +// var postParams = { +// "mobileorEmail": phoneNo, +// "password": password, +// }; +// return await injector.get().postJsonForResponse(ApiConsts.Login_V1, postParams); +// //return await injector.get().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams); +// } +// +// Future login_V2_OTP(String userToken, String loginType) async { +// var postParams = { +// "userToken": userToken, +// "loginType": loginType, +// }; +// return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams); +// } +// +// Future login_V2_OTPVerify(String userToken, String otp) async { +// var postParams = {"userToken": userToken, "userOTP": otp}; +// return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); +// } +// +// Future RefreshTokenAPI(String token, String refreshToken) async { +// var postParams = {"token": token, "refreshToken": refreshToken}; +// // String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams); +// } +// +// Future getAllCountries() async { +// var postParams = {}; +// return await injector.get().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); +// } +// +// Future getAllCites(String countryId) async { +// var postParams = { +// "CountryID": countryId, +// }; +// return await injector.get().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams); +// } +// +// Future getRoles() async { +// return await injector.get().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles); +// } +// +// Future ForgetPasswordOTPRequest(String userName, int otpType) async { +// var postParams = { +// "userName": userName, +// "otpType": 1, +// }; +// return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams); +// //return await injector.get().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); +// } +// +// Future ForgetPasswordOTPCompare(String userToken, String userOTP) async { +// var postParams = {"userToken": userToken, "userOTP": userOTP}; +// return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); +// // return await injector.get().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams); +// } +// +// Future ForgetPassword(String userToken, String newPassword) async { +// var postParams = { +// "userToken": userToken, +// "newPassword": newPassword, +// }; +// return await injector.get().postJsonForResponse(ApiConsts.ForgetPassword, postParams); +// //return await injector.get().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams); +// } +// +// Future ChangePassword(String currentPasswor, String newPassword) async { +// var postParams = { +// "currentPassword": currentPasswor, +// "newPassword": newPassword, +// }; +// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); +// +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t); +// } +// +// Future 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().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t); +// } +// +// Future ChangeMobileNo(String userToken, String userOTP) async { +// var postParams = { +// "userToken": userToken, +// "userOTP": userOTP, +// }; +// String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t); +// } +// +// Future ChangeEmailOTPRequest(String email, String password) async { +// var postParams = {"email": email, "password": password}; +// String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t); +// } +// +// Future ChangeEmail(String userToken, String userOTP) async { +// var postParams = {"userToken": userToken, "userOTP": userOTP}; +// String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); +// } +// +// Future 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().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t); +// } +// +// Future EmailVerifyOTPVerify(String userToken, String userOTP) async { +// var postParams = {"userToken": userToken, "userOTP": userOTP}; +// +// String t = AppState().getUser.data!.accessToken ?? ""; +// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); +// } +// +// Future UpdateUserImage(String image) async { +// var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image}; +// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); +// +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); +// } +// +// Future GetUserImage(String image) async { +// var postParams = {}; +// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); +// +// String t = AppState().getUser.data!.accessToken ?? ""; +// print("tokeen " + t); +// return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); +// } +// +// Future 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??""; +// } +// } diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart deleted file mode 100644 index 60851a6..0000000 --- a/lib/api/tangheem_user_api_client.dart +++ /dev/null @@ -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 getSurahs() async { - String url = "${ApiConsts.baseUrl}AlSuar_Get"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); - } - - Future getMembers() async { - String url = "${ApiConsts.baseUrl}Committee_Get"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); - } - - Future getContentInfo(int contentId) async { - String url = "${ApiConsts.baseUrl}ContentInfo_Get"; - var postParams = {"contentTypeId": contentId}; - return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); - } -} diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart deleted file mode 100644 index 2aaf5d5..0000000 --- a/lib/classes/colors.dart +++ /dev/null @@ -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, - ) - ], - ); -} diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index d022f00..f853522 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -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].*"); + + diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart deleted file mode 100644 index 3eb5b96..0000000 --- a/lib/classes/utils.dart +++ /dev/null @@ -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 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); - } - } -} diff --git a/lib/config/app_provider.dart b/lib/config/app_provider.dart deleted file mode 100644 index d81c90f..0000000 --- a/lib/config/app_provider.dart +++ /dev/null @@ -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, - // ); - } -} diff --git a/lib/config/constants.dart b/lib/config/constants.dart index 87c2c46..8b13789 100644 --- a/lib/config/constants.dart +++ b/lib/config/constants.dart @@ -1,8 +1 @@ -enum YesOrNo { - no, - yes, -} -const String icons = "assets/icons/"; -const String categorySvgIcons = "assets/category/svg/"; -const String svgIcons = "assets/svg/"; diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart new file mode 100644 index 0000000..ce9c53d --- /dev/null +++ b/lib/config/dependencies.dart @@ -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()); + injector.registerSingleton(() => ApiClientImp()); + injector.registerSingleton(() => CommonServicesImp()); + + //repos + injector.registerSingleton(() => UserRepoImp()); + injector.registerSingleton(() => BranchRepoImp()); + } +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d74fc0b..d9517ba 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -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 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(), diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 41274ca..603d40f 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -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))}"; } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 787894d..474cbee 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -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); diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index c629cb6..85fd4ca 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -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 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 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 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 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 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> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/main.dart b/lib/main.dart index 9368eab..147c191 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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 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: [ + ChangeNotifierProvider( + create: (_) => BaseVM(), + ), + ChangeNotifierProvider( + create: (_) => DashboardVM( + userRepo: injector.get(), + commonServices: injector.get(), + ), + ), + ChangeNotifierProvider( + create: (_) => UserVM(userRepo: injector.get()), + ), + ], + 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, + ); + }, ); } } diff --git a/lib/models/m_response.dart b/lib/models/m_response.dart index bd9d3a1..5926e33 100644 --- a/lib/models/m_response.dart +++ b/lib/models/m_response.dart @@ -20,14 +20,14 @@ class MResponse { String? message; factory MResponse.fromJson(Map 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 toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, + "totalItemsCount": totalItemsCount, + "messageStatus": messageStatus, + "message": message, }; } diff --git a/lib/models/user/basic_otp.dart b/lib/models/user/basic_otp.dart index 647a488..bfa6d23 100644 --- a/lib/models/user/basic_otp.dart +++ b/lib/models/user/basic_otp.dart @@ -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 json) => BasicOtp( + factory BasicOtpRespModel.fromJson(Map json) => BasicOtpRespModel( totalItemsCount: json["totalItemsCount"], data: json["data"] == null ? null : Data.fromJson(json["data"]), messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], diff --git a/lib/models/user/change_email.dart b/lib/models/user/change_email.dart index f7f6af5..3e5d800 100644 --- a/lib/models/user/change_email.dart +++ b/lib/models/user/change_email.dart @@ -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 json) { + ChanEmailRespModel.fromJson(Map json) { messageStatus = json['messageStatus']; totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; diff --git a/lib/models/user/change_mobile.dart b/lib/models/user/change_mobile.dart index fed5923..4a3f7e0 100644 --- a/lib/models/user/change_mobile.dart +++ b/lib/models/user/change_mobile.dart @@ -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 json) { + ChangeMobileRespModel.fromJson(Map json) { messageStatus = json['messageStatus']; totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; diff --git a/lib/models/user/confirm_email.dart b/lib/models/user/confirm_email.dart index e64dc25..0292c8c 100644 --- a/lib/models/user/confirm_email.dart +++ b/lib/models/user/confirm_email.dart @@ -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 json) { + ConfirmEmailRespModel.fromJson(Map json) { messageStatus = json['messageStatus']; totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; diff --git a/lib/models/user/confirm_mobile.dart b/lib/models/user/confirm_mobile.dart index 5ea817b..412e822 100644 --- a/lib/models/user/confirm_mobile.dart +++ b/lib/models/user/confirm_mobile.dart @@ -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 json) { + ConfirmMobileRespModel.fromJson(Map json) { messageStatus = json['messageStatus']; totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; diff --git a/lib/models/user/confirm_password.dart b/lib/models/user/confirm_password.dart index 03891f9..53ab3ea 100644 --- a/lib/models/user/confirm_password.dart +++ b/lib/models/user/confirm_password.dart @@ -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 json) { + ConfirmPasswordRespModel.fromJson(Map json) { totalItemsCount = json['totalItemsCount']; messageStatus = json['messageStatus']; message = json['message']; diff --git a/lib/models/user/forget_password_otp_compare.dart b/lib/models/user/forget_password_otp_compare.dart index 20c260b..d234a79 100644 --- a/lib/models/user/forget_password_otp_compare.dart +++ b/lib/models/user/forget_password_otp_compare.dart @@ -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 json) { + PasswordOTPCompareResModel.fromJson(Map json) { totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; messageStatus = json['messageStatus']; diff --git a/lib/models/user/forget_password_otp_request.dart b/lib/models/user/forget_password_otp_request.dart index 7ab7e5c..2755978 100644 --- a/lib/models/user/forget_password_otp_request.dart +++ b/lib/models/user/forget_password_otp_request.dart @@ -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 json) { + PasswordOTPRequestRespModel.fromJson(Map json) { totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; messageStatus = json['messageStatus']; diff --git a/lib/models/user/login_password.dart b/lib/models/user/login_password.dart index 616e860..d888811 100644 --- a/lib/models/user/login_password.dart +++ b/lib/models/user/login_password.dart @@ -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 json) => LoginPassword( + factory LoginPasswordRespModel.fromJson(Map json) => LoginPasswordRespModel( totalItemsCount: json["totalItemsCount"], data: json["data"] == null ? null : Data.fromJson(json["data"]), messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], diff --git a/lib/models/user/register_user.dart b/lib/models/user/register_user.dart index 71ef970..5f5f79d 100644 --- a/lib/models/user/register_user.dart +++ b/lib/models/user/register_user.dart @@ -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 json) => RegisterUser( + factory RegisterUserRespModel.fromJson(Map json) => RegisterUserRespModel( messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], totalItemsCount: json["totalItemsCount"], data: json["data"] == null ? null : Data.fromJson(json["data"]), diff --git a/lib/models/user/verify_email.dart b/lib/models/user/verify_email.dart index bf0858f..a097073 100644 --- a/lib/models/user/verify_email.dart +++ b/lib/models/user/verify_email.dart @@ -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 json) { + VerifyEmailRespModel.fromJson(Map json) { totalItemsCount = json['totalItemsCount']; data = json['data'] != null ? new Data.fromJson(json['data']) : null; messageStatus = json['messageStatus']; diff --git a/lib/pages/dashboard/dashboard_page.dart b/lib/pages/dashboard/dashboard_page.dart deleted file mode 100644 index 2700aa3..0000000 --- a/lib/pages/dashboard/dashboard_page.dart +++ /dev/null @@ -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 createState() => _DashboardPageState(); -} - -class _DashboardPageState extends State { - 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( - 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; - }); - } - } -} diff --git a/lib/pages/user/change_email_page.dart b/lib/pages/user/change_email_page.dart deleted file mode 100644 index 46de7ab..0000000 --- a/lib/pages/user/change_email_page.dart +++ /dev/null @@ -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 createState() => _ChangeEmailPageState(); -} - -class _ChangeEmailPageState extends State { - 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 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 route) => false); - }, - ), - ); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } -} diff --git a/lib/pages/user/change_mobile_page.dart b/lib/pages/user/change_mobile_page.dart deleted file mode 100644 index 09e2a19..0000000 --- a/lib/pages/user/change_mobile_page.dart +++ /dev/null @@ -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 createState() => _ChangeMobilePageState(); -} - -class _ChangeMobilePageState extends State { - 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 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 route) => false); - }, - ), - ); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } - - - -} diff --git a/lib/pages/user/change_password_page.dart b/lib/pages/user/change_password_page.dart deleted file mode 100644 index b255e0c..0000000 --- a/lib/pages/user/change_password_page.dart +++ /dev/null @@ -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 createState() => _ChangePasswordPageState(); -} - -class _ChangePasswordPageState extends State { - 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 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 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); - } -} diff --git a/lib/pages/user/complete_profile_page.dart b/lib/pages/user/complete_profile_page.dart deleted file mode 100644 index a724ada..0000000 --- a/lib/pages/user/complete_profile_page.dart +++ /dev/null @@ -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 createState() => _CompleteProfilePageState(); -} - -class _CompleteProfilePageState extends State { - 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 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 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'; - }); - } - } - } -} diff --git a/lib/pages/user/confirm_new_password_page.dart b/lib/pages/user/confirm_new_password_page.dart deleted file mode 100644 index 5750b23..0000000 --- a/lib/pages/user/confirm_new_password_page.dart +++ /dev/null @@ -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 createState() => _ConfirmNewPasswordPageState(); -} - -class _ConfirmNewPasswordPageState extends State { - 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 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); - } -} diff --git a/lib/pages/user/forget_password_method_page.dart b/lib/pages/user/forget_password_method_page.dart deleted file mode 100644 index 2b8bd11..0000000 --- a/lib/pages/user/forget_password_method_page.dart +++ /dev/null @@ -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 createState() => _ForgetPasswordMethodPageState(); -} - -class _ForgetPasswordMethodPageState extends State { - 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 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 ?? ""); - } - }, - )); - } -} diff --git a/lib/pages/user/forget_password_page.dart b/lib/pages/user/forget_password_page.dart deleted file mode 100644 index f7900dc..0000000 --- a/lib/pages/user/forget_password_page.dart +++ /dev/null @@ -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 createState() => _ForgetPasswordPageState(); -} - -class _ForgetPasswordPageState extends State { - 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 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 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 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 ?? ""); - } - } -} diff --git a/lib/pages/user/login_method_selection_page.dart b/lib/pages/user/login_method_selection_page.dart deleted file mode 100644 index 3a96350..0000000 --- a/lib/pages/user/login_method_selection_page.dart +++ /dev/null @@ -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 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 ?? ""); - } - } -} diff --git a/lib/repositories/branch_repo.dart b/lib/repositories/branch_repo.dart new file mode 100644 index 0000000..b7b678d --- /dev/null +++ b/lib/repositories/branch_repo.dart @@ -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 createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude); + + Future fetchAllBranches(); + + Future fetchBranchCategory(); + + Future fetchServicesByCategoryId(String serviceCategoryId); + + Future createNewService(List> map); + + Future getServiceProviderDocument(dynamic userId); + + Future serviceProviderDocumentsUpdate(List? documents); +} + +class BranchRepoImp implements BranchRepo { + @override + Future 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().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); + } + + @override + Future fetchAllBranches() async { + var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t); + } + + @override + Future fetchBranchCategory() async { + var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t); + } + + @override + Future fetchServicesByCategoryId(String serviceCategoryId) async { + var postParams = {"ServiceCategoryID": serviceCategoryId}; + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t); + } + + @override + Future createNewService(List> map) async { + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t); + } + + @override + Future getServiceProviderDocument(dynamic userId) async { + var queryParameters = { + "ServiceProviderID": userId.toString(), + }; + String? token = AppState().getUser.data?.accessToken; + debugPrint(token); + return await injector.get().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); + } + + @override + Future serviceProviderDocumentsUpdate(List? documents) async { + List> 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().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t); + } +} diff --git a/lib/repositories/common_repo.dart b/lib/repositories/common_repo.dart new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/repositories/common_repo.dart @@ -0,0 +1 @@ + diff --git a/lib/pages/a.dart b/lib/repositories/dashboard_repo.dart similarity index 100% rename from lib/pages/a.dart rename to lib/repositories/dashboard_repo.dart diff --git a/lib/repositories/user_repo.dart b/lib/repositories/user_repo.dart new file mode 100644 index 0000000..d095cf5 --- /dev/null +++ b/lib/repositories/user_repo.dart @@ -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 basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}); + + Future basicVerify(String phoneNo, String otp, String userToken); + + Future basicComplete(String userId, String firstName, String lastName, String email, String password); + + Future loginV1(String phoneNo, String password); + + Future loginV2OTP(String userToken, String loginType); + + Future loginV2OTPVerify(String userToken, String otp); + + Future refreshTokenAPI(String token, String refreshToken); + + Future getAllCountries(); + + Future getAllCites(String countryId); + + Future getRoles(); + + Future forgetPasswordOTPRequest(String userName, int otpType); + + Future forgetPasswordOTPCompare(String userToken, String userOTP); + + Future forgetPassword(String userToken, String newPassword); + + Future changePassword(String currentPassword, String newPassword); + + Future changeMobileNoOTPRequest(countryID, String mobileNo, String password); + + Future changeMobileNo(String userToken, String userOTP); + + Future changeEmailOTPRequest(String email, String password); + + Future changeEmail(String userToken, String userOTP); + + Future emailVerify(String email, String userID); + + Future emailVerifyOTPVerify(String userToken, String userOTP); + + Future updateUserImage(String image); + + Future getUserImage(String image); + + Future updateUserToken(); +} + +class UserRepoImp implements UserRepo { + @override + Future 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().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams); + } + + @override + Future basicVerify(String phoneNo, String otp, String userToken) async { + var postParams = { + "userMobileNo": phoneNo, + "userOTP": otp, + "userToken": userToken, + }; + return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams); + } + + @override + Future basicComplete(String userId, String firstName, String lastName, String email, String password) async { + Map 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().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams); + } + + @override + Future loginV1(String phoneNo, String password) async { + var postParams = { + "mobileorEmail": phoneNo, + "password": password, + }; + return await injector.get().postJsonForResponse(ApiConsts.Login_V1, postParams); + //return await injector.get().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams); + } + + @override + Future loginV2OTP(String userToken, String loginType) async { + var postParams = { + "userToken": userToken, + "loginType": loginType, + }; + + Response response = await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams); + LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body)); + return user; + } + + @override + Future loginV2OTPVerify(String userToken, String otp) async { + var postParams = {"userToken": userToken, "userOTP": otp}; + return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); + } + + @override + Future refreshTokenAPI(String token, String refreshToken) async { + var postParams = {"token": token, "refreshToken": refreshToken}; + // String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams); + } + + @override + Future getAllCountries() async { + return await injector.get().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); + } + + @override + Future getAllCites(String countryId) async { + var postParams = { + "CountryID": countryId, + }; + return await injector.get().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams); + } + + @override + Future getRoles() async { + return await injector.get().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles); + } + + @override + Future forgetPasswordOTPRequest(String userName, int otpType) async { + var postParams = { + "userName": userName, + "otpType": 1, + }; + return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams); + //return await injector.get().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); + } + + @override + Future forgetPasswordOTPCompare(String userToken, String userOTP) async { + var postParams = {"userToken": userToken, "userOTP": userOTP}; + Response response = await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); + + PasswordOTPCompareResModel otpCompare = PasswordOTPCompareResModel.fromJson(jsonDecode(response.body)); + return otpCompare; + } + + @override + Future forgetPassword(String userToken, String newPassword) async { + var postParams = { + "userToken": userToken, + "newPassword": newPassword, + }; + + Response response = await injector.get().postJsonForResponse(ApiConsts.ForgetPassword, postParams); + ConfirmPasswordRespModel data = ConfirmPasswordRespModel.fromJson(jsonDecode(response.body)); + + return data ; + //return await injector.get().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams); + } + + @override + Future changePassword(String currentPassword, String newPassword) async { + var postParams = { + "currentPassword": currentPassword, + "newPassword": newPassword, + }; + // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); + + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t); + } + + @override + Future 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().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t); + } + + @override + Future changeMobileNo(String userToken, String userOTP) async { + var postParams = { + "userToken": userToken, + "userOTP": userOTP, + }; + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t); + } + + @override + Future changeEmailOTPRequest(String email, String password) async { + var postParams = {"email": email, "password": password}; + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t); + } + + @override + Future changeEmail(String userToken, String userOTP) async { + var postParams = {"userToken": userToken, "userOTP": userOTP}; + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); + } + + @override + Future 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().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t); + } + + @override + Future emailVerifyOTPVerify(String userToken, String userOTP) async { + var postParams = {"userToken": userToken, "userOTP": userOTP}; + + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); + } + + @override + Future updateUserImage(String image) async { + var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image}; + // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); + + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); + } + + @override + Future getUserImage(String image) async { + var postParams = {}; + // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); + + String t = AppState().getUser.data!.accessToken ?? ""; + debugPrint("token " + t); + return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); + } + + @override + Future 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 ?? ""; + } +} diff --git a/lib/services/services.dart b/lib/services/services.dart new file mode 100644 index 0000000..8dd371f --- /dev/null +++ b/lib/services/services.dart @@ -0,0 +1,19 @@ +import 'dart:io'; + +import 'package:image_picker/image_picker.dart'; + +abstract class CommonServices { + Future pickImageFromPhone(int sourceFlag); +} + +class CommonServicesImp implements CommonServices { + @override + Future 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; + } +} \ No newline at end of file diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index b1739c4..8d0252d 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -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), ); } diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 13c9b2f..d65575d 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -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]; + diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index a6bff7e..c0fabd8 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'AppPermissionHandler.dart'; +import 'permission_handler.dart'; Future showConfirmDialogs( context, msg, positiveText, negativeText) async { diff --git a/lib/utils/enums.dart b/lib/utils/enums.dart new file mode 100644 index 0000000..cf27602 --- /dev/null +++ b/lib/utils/enums.dart @@ -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, +} diff --git a/lib/utils/AppPermissionHandler.dart b/lib/utils/permission_handler.dart similarity index 100% rename from lib/utils/AppPermissionHandler.dart rename to lib/utils/permission_handler.dart diff --git a/lib/api/shared_prefrence.dart b/lib/utils/shared_prefrence.dart similarity index 96% rename from lib/api/shared_prefrence.dart rename to lib/utils/shared_prefrence.dart index 30e958e..f629755 100644 --- a/lib/api/shared_prefrence.dart +++ b/lib/utils/shared_prefrence.dart @@ -10,7 +10,7 @@ class SharedPrefManager { static String REFRESH_TOKEN = "user.refresh.token"; static String DATA = "data"; - static Future _prefs = SharedPreferences.getInstance(); + static final Future _prefs = SharedPreferences.getInstance(); static setUserId(String cookie) async { final prefs = await SharedPreferences.getInstance(); diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 10f5655..ab93116 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -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 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 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 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}) { - 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}) { + 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); + } +} diff --git a/lib/view_models/base_view_model.dart b/lib/view_models/base_view_model.dart new file mode 100644 index 0000000..96270d5 --- /dev/null +++ b/lib/view_models/base_view_model.dart @@ -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(); + } +} diff --git a/lib/view_models/dashboard_view_model.dart b/lib/view_models/dashboard_view_model.dart new file mode 100644 index 0000000..2e24c9a --- /dev/null +++ b/lib/view_models/dashboard_view_model.dart @@ -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 updateUserImage(String image) async { + return await userRepo.updateUserImage(image); + } +} diff --git a/lib/view_models/user_view_model.dart b/lib/view_models/user_view_model.dart new file mode 100644 index 0000000..bf37e59 --- /dev/null +++ b/lib/view_models/user_view_model.dart @@ -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 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 route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + + Future 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 route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + + Future 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 route) => false); + } else { + Utils.showToast(res.message ?? ""); + } + } else { + Utils.showToast(LocaleKeys.passwordShouldContains.tr()); + //("Password Should contains Character, Number, Capital and small letters"); + } + } + + Future 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 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 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 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 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 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 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 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 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 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 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 getAllCountries() async { + return await userRepo.getAllCountries(); + } + + Future 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 ?? ""); + } + } +} diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart new file mode 100644 index 0000000..0b4fec2 --- /dev/null +++ b/lib/views/dashboard/dashboard_page.dart @@ -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 createState() => _DashboardPageState(); +} + +class _DashboardPageState extends State { + late DashboardVM dashboardVM; + + @override + void initState() { + super.initState(); + dashboardVM = Provider.of(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( + 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)), + ], + ), + ); + } +} diff --git a/lib/pages/user/splash_page.dart b/lib/views/splash/splash_page.dart similarity index 89% rename from lib/pages/user/splash_page.dart rename to lib/views/splash/splash_page.dart index 334c1cb..f1b9610 100644 --- a/lib/pages/user/splash_page.dart +++ b/lib/views/splash/splash_page.dart @@ -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); }); } diff --git a/lib/views/user/change_email_page.dart b/lib/views/user/change_email_page.dart new file mode 100644 index 0000000..b3531e1 --- /dev/null +++ b/lib/views/user/change_email_page.dart @@ -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 createState() => _ChangeEmailPageState(); +} + +class _ChangeEmailPageState extends State { + String password = ""; + String email = ''; + + late UserVM userVM; + + @override + void initState() { + userVM = Provider.of(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); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/user/change_mobile_page.dart b/lib/views/user/change_mobile_page.dart new file mode 100644 index 0000000..ed62ec6 --- /dev/null +++ b/lib/views/user/change_mobile_page.dart @@ -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 createState() => _ChangeMobilePageState(); +} + +class _ChangeMobilePageState extends State { + int countryID = 1; + + String mobileNo = ''; + String password = ''; + + late UserVM userVM; + + @override + void initState() { + userVM = Provider.of(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); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/user/change_password_page.dart b/lib/views/user/change_password_page.dart new file mode 100644 index 0000000..b0070d1 --- /dev/null +++ b/lib/views/user/change_password_page.dart @@ -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 createState() => _ChangePasswordPageState(); +} + +class _ChangePasswordPageState extends State { + String newPassword = ""; + String currentPassword = ''; + + late UserVM userVM; + + @override + void initState() { + userVM = Provider.of(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); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/user/complete_profile_page.dart b/lib/views/user/complete_profile_page.dart new file mode 100644 index 0000000..97ae2a8 --- /dev/null +++ b/lib/views/user/complete_profile_page.dart @@ -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 createState() => _CompleteProfilePageState(); +} + +class _CompleteProfilePageState extends State { + String? firstName = "", lastName = "", email = "", confirmPassword = ""; + late String password = ""; + bool isChecked = false; + late UserVM userVM; + + @override + void initState() { + userVM = Provider.of(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, + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/user/confirm_new_password.dart b/lib/views/user/confirm_new_password.dart similarity index 51% rename from lib/pages/user/confirm_new_password.dart rename to lib/views/user/confirm_new_password.dart index dcadd20..8576d0d 100644 --- a/lib/pages/user/confirm_new_password.dart +++ b/lib/views/user/confirm_new_password.dart @@ -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(); 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 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 ?? ""); - } - } } diff --git a/lib/views/user/confirm_new_password_page.dart b/lib/views/user/confirm_new_password_page.dart new file mode 100644 index 0000000..c398423 --- /dev/null +++ b/lib/views/user/confirm_new_password_page.dart @@ -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 createState() => _ConfirmNewPasswordPageState(); +} + +class _ConfirmNewPasswordPageState extends State { + String newPassword = ""; + String confirmPassword = ''; + + @override + Widget build(BuildContext context) { + UserVM userVM = context.read(); + 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; + } +} diff --git a/lib/pages/user/edit_account_page.dart b/lib/views/user/edit_account_page.dart similarity index 62% rename from lib/pages/user/edit_account_page.dart rename to lib/views/user/edit_account_page.dart index d2eac6e..8469085 100644 --- a/lib/pages/user/edit_account_page.dart +++ b/lib/views/user/edit_account_page.dart @@ -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 createState() => _EditAccountPageState(); } @@ -32,12 +25,13 @@ class _EditAccountPageState extends State { @override Widget build(BuildContext context) { + UserVM userVM = context.read(); 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 { 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 { 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 { 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 { 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 { ), ); } - - Future 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 route) => false); - // showMDialog( - // context, - // child: MessageDialog( - // title: "Email is Verified", - // onClick: () { - // Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.dashboard, (Route route) => false); - // }, - // ), - // ); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } } diff --git a/lib/views/user/forget_password_method_page.dart b/lib/views/user/forget_password_method_page.dart new file mode 100644 index 0000000..0a127fb --- /dev/null +++ b/lib/views/user/forget_password_method_page.dart @@ -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 createState() => _ForgetPasswordMethodPageState(); +} + +class _ForgetPasswordMethodPageState extends State { + int otpType = 1; + String userOTP = ""; + + @override + Widget build(BuildContext context) { + UserVM userVM = context.read(); + 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), + ], + ), + ), + ); + } +} diff --git a/lib/views/user/forget_password_page.dart b/lib/views/user/forget_password_page.dart new file mode 100644 index 0000000..dcf66a7 --- /dev/null +++ b/lib/views/user/forget_password_page.dart @@ -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 createState() => _ForgetPasswordPageState(); +} + +class _ForgetPasswordPageState extends State { + 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 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(), + ); + } + } +} diff --git a/lib/views/user/login_method_selection_page.dart b/lib/views/user/login_method_selection_page.dart new file mode 100644 index 0000000..5d2f69d --- /dev/null +++ b/lib/views/user/login_method_selection_page.dart @@ -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(); + 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", + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + +} diff --git a/lib/pages/user/login_verification_page.dart b/lib/views/user/login_verification_page.dart similarity index 51% rename from lib/pages/user/login_verification_page.dart rename to lib/views/user/login_verification_page.dart index 717d128..32bd9f7 100644 --- a/lib/pages/user/login_verification_page.dart +++ b/lib/views/user/login_verification_page.dart @@ -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 createState() => _LoginVerificationPageState(); } @@ -33,76 +23,36 @@ class LoginVerificationPage extends StatefulWidget { class _LoginVerificationPageState extends State { 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 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(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 { 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 { 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 { 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 { ), ], ), - mFlex(10), + Utils.mFlex(10), ], ), ), diff --git a/lib/pages/user/login_verify_account_page.dart b/lib/views/user/login_verify_account_page.dart similarity index 61% rename from lib/pages/user/login_verify_account_page.dart rename to lib/views/user/login_verify_account_page.dart index 7115f71..7e89a1d 100644 --- a/lib/pages/user/login_verify_account_page.dart +++ b/lib/views/user/login_verify_account_page.dart @@ -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(); 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 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 ?? ""); - } - } } diff --git a/lib/pages/user/login_with_password_page.dart b/lib/views/user/login_with_password_page.dart similarity index 64% rename from lib/pages/user/login_with_password_page.dart rename to lib/views/user/login_with_password_page.dart index da2f09d..5b365bb 100644 --- a/lib/pages/user/login_with_password_page.dart +++ b/lib/views/user/login_with_password_page.dart @@ -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 createState() => _LoginWithPasswordState(); } @@ -44,14 +33,20 @@ class _LoginWithPasswordState extends State { 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 { 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 { ], ), 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 { 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 { if (_country != null) { List 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 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 ?? ""); - } - } } diff --git a/lib/pages/user/register_page.dart b/lib/views/user/register_page.dart similarity index 71% rename from lib/pages/user/register_page.dart rename to lib/views/user/register_page.dart index e2ea98c..a195e86 100644 --- a/lib/pages/user/register_page.dart +++ b/lib/views/user/register_page.dart @@ -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 createState() => _RegisterPageState(); } @@ -39,32 +28,36 @@ class _RegisterPageState extends State { @override Widget build(BuildContext context) { + final UserVM userVM = context.read(); 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( - future: UserApiClent().getAllCountries(), + future: userVM.getAllCountries(), builder: (context, snapshot) { if (snapshot.hasData) { List 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 { }); 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 { ], ); } 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 { 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 { ], ), ), - 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 { ); } - Future 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) { diff --git a/lib/pages/user/register_selection_page.dart b/lib/views/user/register_selection_page.dart similarity index 69% rename from lib/pages/user/register_selection_page.dart rename to lib/views/user/register_selection_page.dart index db3d46b..7e2d7c4 100644 --- a/lib/pages/user/register_selection_page.dart +++ b/lib/views/user/register_selection_page.dart @@ -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), ], ), ), diff --git a/lib/pages/user/vertify_password_page.dart b/lib/views/user/vertify_password_page.dart similarity index 71% rename from lib/pages/user/vertify_password_page.dart rename to lib/views/user/vertify_password_page.dart index 8d96da0..234fe92 100644 --- a/lib/pages/user/vertify_password_page.dart +++ b/lib/views/user/vertify_password_page.dart @@ -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 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 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 { // ); // }, // )); - - } diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index fef600b..31ba9df 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -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, { diff --git a/lib/widgets/button/show_circular_button.dart b/lib/widgets/button/show_circular_button.dart index 4d568db..9f77304 100644 --- a/lib/widgets/button/show_circular_button.dart +++ b/lib/widgets/button/show_circular_button.dart @@ -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( diff --git a/lib/widgets/button/show_image_button.dart b/lib/widgets/button/show_image_button.dart index 7bfe49d..dfe953e 100644 --- a/lib/widgets/button/show_image_button.dart +++ b/lib/widgets/button/show_image_button.dart @@ -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; diff --git a/lib/widgets/dialog/message_dialog.dart b/lib/widgets/dialog/message_dialog.dart index db39d51..ddf0582 100644 --- a/lib/widgets/dialog/message_dialog.dart +++ b/lib/widgets/dialog/message_dialog.dart @@ -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", diff --git a/lib/widgets/dialog/otp_dialog.dart b/lib/widgets/dialog/otp_dialog.dart index e5bcc0d..d2393be 100644 --- a/lib/widgets/dialog/otp_dialog.dart +++ b/lib/widgets/dialog/otp_dialog.dart @@ -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 createState() => _OtpDialogState(); @@ -32,17 +29,25 @@ class _OtpDialogState extends State { 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 { hasTimerStopped = true; }); }, - countDownTimerStyle: TextStyle( + countDownTimerStyle: const TextStyle( color: Colors.blue, height: 1.2, ), @@ -106,7 +111,7 @@ class _OtpDialogState extends State { 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 { ), ), ), - ], ), ); diff --git a/lib/widgets/dragable_sheet.dart b/lib/widgets/dragable_sheet.dart index 4d91118..86d468a 100644 --- a/lib/widgets/dragable_sheet.dart +++ b/lib/widgets/dragable_sheet.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; showDraggableDialog(BuildContext context, Widget child) { diff --git a/lib/widgets/dropdown/dropdow_field.dart b/lib/widgets/dropdown/dropdow_field.dart index 5803424..d561b2b 100644 --- a/lib/widgets/dropdown/dropdow_field.dart +++ b/lib/widgets/dropdown/dropdow_field.dart @@ -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 createState() => _DropdownFieldState(); @@ -30,8 +29,8 @@ class DropdownField extends StatefulWidget { class _DropdownFieldState extends State { DropValue? dropdownValue; List defaultV = [ - new DropValue(1, "One", ""), - new DropValue(2, "Two", ""), + DropValue(1, "One", ""), + DropValue(2, "Two", ""), ]; @override @@ -43,16 +42,16 @@ class _DropdownFieldState extends State { @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( - 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 { 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 { (DropValue value) { return DropdownMenuItem( value: value, - child: value.value.toText12(), + child: value.value.toText(fontSize: 12), ); }, ).toList(), diff --git a/lib/widgets/dropdown/dropdown_text.dart b/lib/widgets/dropdown/dropdown_text.dart index f560952..0b65bf7 100644 --- a/lib/widgets/dropdown/dropdown_text.dart +++ b/lib/widgets/dropdown/dropdown_text.dart @@ -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", diff --git a/lib/widgets/extensions/extensions_widget.dart b/lib/widgets/extensions/extensions_widget.dart index caaaba9..c046072 100644 --- a/lib/widgets/extensions/extensions_widget.dart +++ b/lib/widgets/extensions/extensions_widget.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; extension ExtendedText on Widget { diff --git a/lib/widgets/images/circular_image.dart b/lib/widgets/images/circular_image.dart index 501fa1f..a2c127d 100644 --- a/lib/widgets/images/circular_image.dart +++ b/lib/widgets/images/circular_image.dart @@ -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), diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart index e4b1cf8..bc2da89 100644 --- a/lib/widgets/loading_dialog.dart +++ b/lib/widgets/loading_dialog.dart @@ -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); diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart index a489e61..c31c8cd 100644 --- a/lib/widgets/otp_widget.dart +++ b/lib/widgets/otp_widget.dart @@ -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); diff --git a/lib/widgets/show_card_buttton.dart b/lib/widgets/show_card_buttton.dart index 02b827f..68a73ee 100644 --- a/lib/widgets/show_card_buttton.dart +++ b/lib/widgets/show_card_buttton.dart @@ -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'; diff --git a/lib/widgets/show_fill_button.dart b/lib/widgets/show_fill_button.dart index acfcbe5..72cf356 100644 --- a/lib/widgets/show_fill_button.dart +++ b/lib/widgets/show_fill_button.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; diff --git a/lib/widgets/tab/login_email_tab.dart b/lib/widgets/tab/login_email_tab.dart index 498c5ce..fa223a3 100644 --- a/lib/widgets/tab/login_email_tab.dart +++ b/lib/widgets/tab/login_email_tab.dart @@ -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 } diff --git a/lib/widgets/txt_field.dart b/lib/widgets/txt_field.dart index 11e111a..c4f16a5 100644 --- a/lib/widgets/txt_field.dart +++ b/lib/widgets/txt_field.dart @@ -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, + ), ), ), ), diff --git a/lib/widgets/user_image.dart b/lib/widgets/user_image.dart index 02fd84c..5f178bb 100644 --- a/lib/widgets/user_image.dart +++ b/lib/widgets/user_image.dart @@ -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", diff --git a/pubspec.yaml b/pubspec.yaml index bc7ce4d..867f61e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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/ diff --git a/resources/s.dart b/resources/s.dart deleted file mode 100644 index e69de29..0000000