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