diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart new file mode 100644 index 0000000..a06a64e --- /dev/null +++ b/lib/api/api_client.dart @@ -0,0 +1,156 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:car_provider_app/exceptions/api_exception.dart'; +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart'; +import 'package:http/io_client.dart'; + +typedef FactoryConstructor = U Function(dynamic); + +class APIError { + int errorCode; + String errorMessage; + + APIError(this.errorCode, this.errorMessage); + + Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; + + @override + String toString() { + return jsonEncode(this); + } +} + +APIException _throwAPIException(Response response) { + switch (response.statusCode) { + case 400: + APIError? apiError; + if (response.body != null && response.body.isNotEmpty) { + var jsonError = jsonDecode(response.body); + apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']); + } + return APIException(APIException.BAD_REQUEST, error: apiError); + case 401: + return APIException(APIException.UNAUTHORIZED); + case 403: + return APIException(APIException.FORBIDDEN); + case 404: + return APIException(APIException.NOT_FOUND); + case 500: + return APIException(APIException.INTERNAL_SERVER_ERROR); + case 444: + var downloadUrl = response.headers["location"]; + return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); + default: + return APIException(APIException.OTHER); + } +} + +class ApiClient { + static final ApiClient _instance = ApiClient._internal(); + + ApiClient._internal(); + + factory ApiClient() => _instance; + + Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + var _headers = {'Accept': 'application/json'}; + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + if (!kReleaseMode) { + print("Url:$url"); + print("body:$jsonObject"); + } + var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); + try { + var jsonData = jsonDecode(response.body); + return factoryConstructor(jsonData); + } catch (ex) { + print(ex); + throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); + } + } + + Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + String? requestBody; + if (jsonObject != null) { + requestBody = jsonEncode(jsonObject); + if (headers == null) { + headers = {'Content-Type': 'application/json'}; + } else { + headers['Content-Type'] = 'application/json'; + } + } + + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); + } + + Future _postForResponse(String url, requestBody, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + try { + var _headers = {}; + if (token != null) { + _headers['Authorization'] = 'Bearer $token'; + } + + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + + if (queryParameters != null) { + var queryString = new Uri(queryParameters: queryParameters).query; + url = url + '?' + queryString; + } + var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60)); + + if (response.statusCode >= 200 && response.statusCode < 300) { + return response; + } else { + throw _throwAPIException(response); + } + } on SocketException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on HttpException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on TimeoutException catch (e) { + throw APIException(APIException.TIMEOUT, arguments: e); + } on ClientException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } + } + + bool _certificateCheck(X509Certificate cert, String host, int port) => true; + + Future _withClient(Future Function(Client) fn) async { + var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; + var client = IOClient(httpClient); + try { + return await fn(client); + } finally { + client.close(); + } + } + + Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); +} diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart new file mode 100644 index 0000000..6cf0954 --- /dev/null +++ b/lib/api/login_api_client.dart @@ -0,0 +1,27 @@ + +class LoginApiClient { + static final LoginApiClient _instance = LoginApiClient._internal(); + + LoginApiClient._internal(); + + factory LoginApiClient() => _instance; + + // Future checkMobileAppVersion() async { + // String url = "${ApiConsts.utilitiesRest}CheckMobileAppVersion"; + // Map postParams = {}; + // postParams.addAll(AppState().postParamsJson); + // return await ApiClient().postJsonForObject((json) => CheckMobileAppVersionModel.fromJson(json), url, postParams); + // } + // + // Future memberLogin(String username, String password) async { + // String url = "${ApiConsts.erpRest}MemberLogin"; + // Map postParams = {"P_APP_VERSION": "CS", "P_LANGUAGE": "US", "P_PASSWORD": password, "P_USER_NAME": username}; + // postParams.addAll(AppState().postParamsJson); + // return await ApiClient().postJsonForObject((json) { + // GenericResponseModel responseData = GenericResponseModel.fromJson(json); + // AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID; + // return responseData.memberLoginList; + // }, url, postParams); + // } + +} diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart new file mode 100644 index 0000000..1b555f0 --- /dev/null +++ b/lib/api/tangheem_user_api_client.dart @@ -0,0 +1,26 @@ + +class TangheemUserApiClient { + static final TangheemUserApiClient _instance = TangheemUserApiClient._internal(); + + TangheemUserApiClient._internal(); + + factory TangheemUserApiClient() => _instance; + + // Future getSurahs() async { + // String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; + // var postParams = {}; + // return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); + // } + // + // Future getMembers() async { + // String url = "${ApiConsts.tangheemUsers}Committee_Get"; + // var postParams = {}; + // return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); + // } + // + // Future getContentInfo(int contentId) async { + // String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; + // var postParams = {"contentTypeId": contentId}; + // return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); + // } +} diff --git a/lib/config/background_loader.dart b/lib/config/background_loader.dart deleted file mode 100644 index 5d18ec0..0000000 --- a/lib/config/background_loader.dart +++ /dev/null @@ -1,34 +0,0 @@ -//class which loads components "in the background", i.e. ui does not depend on it - -import 'package:car_provider_app/services/shared_preferences.dart'; -import 'package:injector/injector.dart'; -//import 'package:revocheckapp/services/firebase_service.dart'; - - -class BackgroundLoader { - Future loadBackgroundData() async { - //init notification setting - try { - /* - final isPromotionNotificationEnabled = await Injector.appInstance - .getDependency() - .promotionNotificationsEnabled; - if (isPromotionNotificationEnabled == null) { - await Injector.appInstance - .getDependency() - .setPromotionNotificationEnabled(true); - Injector.appInstance - .getDependency() - .subscribeForPromotions(); - } */ - } catch (_) { - //something wend wrong, set it to true - await Injector.appInstance - .getDependency() - .setPromotionNotificationEnabled(true); - /*Injector.appInstance - .getDependency() - .subscribeForPromotions();*/ - } - } -} diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart deleted file mode 100644 index 2780417..0000000 --- a/lib/config/dependencies.dart +++ /dev/null @@ -1,38 +0,0 @@ -// import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -// import 'package:flutter/material.dart'; - -import 'package:car_provider_app/repo/account_repository.dart'; -import 'package:injector/injector.dart'; - -import 'background_loader.dart'; - - -class AppDependencies { - static void addDependencies() { - Injector injector = Injector.appInstance; - - //add dependencies as needed - injector.registerSingleton(() => AcRepository()); - - // injector.registerSingleton((injector) => AcRepository()); - - _addCrashlytics(); - _loadBackgroundTasksNonBlocking(); - } - - static void _addCrashlytics() { - // Set `enableInDevMode` to true to see reports while in debug mode - // This is only to be used for confirming that reports are being - // submitted as expected. It is not intended to be used for everyday - // development. - //Crashlytics.instance.enableInDevMode = true; - - // Pass all uncaught errors from the framework to Crashlytics. - // FlutterError.onError = Crashlytics.instance.recordFlutterError; - } - - static void _loadBackgroundTasksNonBlocking() { - final backgroundLoader = BackgroundLoader(); - backgroundLoader.loadBackgroundData(); - } -} diff --git a/lib/exceptions/api_exception.dart b/lib/exceptions/api_exception.dart new file mode 100644 index 0000000..0dd51e5 --- /dev/null +++ b/lib/exceptions/api_exception.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; + +import 'package:car_provider_app/api/api_client.dart'; + +class APIException implements Exception { + static const String BAD_REQUEST = 'api_common_bad_request'; + static const String UNAUTHORIZED = 'api_common_unauthorized'; + static const String FORBIDDEN = 'api_common_forbidden'; + static const String NOT_FOUND = 'api_common_not_found'; + static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error'; + static const String UPGRADE_REQUIRED = 'api_common_upgrade_required'; + static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format'; + static const String OTHER = 'api_common_http_error'; + static const String TIMEOUT = 'api_common_http_timeout'; + static const String UNKNOWN = 'unexpected_error'; + + final String message; + final APIError? error; + final arguments; + + const APIException(this.message, {this.arguments, this.error}); + + Map toJson() => {'message': message, 'error': error, 'arguments': '$arguments'}; + + @override + String toString() { + return jsonEncode(this); + } +} diff --git a/lib/main.dart b/lib/main.dart index f712e24..43ac8f1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,9 @@ import 'package:car_provider_app/config/app_provider.dart'; -import 'package:car_provider_app/config/dependencies.dart'; import 'package:car_provider_app/theme/app_theme.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:sizer/sizer.dart'; -import 'config/localization.dart'; import 'config/routes.dart'; Future main() async { @@ -25,9 +23,7 @@ Future main() async { class MyApp extends StatelessWidget { // This widget is the root of your application. - MyApp() { - AppDependencies.addDependencies(); - } + MyApp() {} @override Widget build(BuildContext context) { diff --git a/lib/pages/dashboard/dashboard_page.dart b/lib/pages/dashboard/dashboard_page.dart index 3691c3e..b8dbf64 100644 --- a/lib/pages/dashboard/dashboard_page.dart +++ b/lib/pages/dashboard/dashboard_page.dart @@ -1,8 +1,8 @@ import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:flutter/material.dart'; class DashboardPage extends StatelessWidget { @@ -15,10 +15,7 @@ class DashboardPage extends StatelessWidget { drawer: showDrawer(context), body: Container( child: Center( - child: Txt( - "Dashboard/Main Page", - txtType: TxtType.heading3, - ), + child: "Dashboard/Main Page".toText22(), ), ), ); @@ -50,13 +47,8 @@ class DashboardPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Txt( - "User Name", - txtType: TxtType.heading3, - ), - Txt( - "User role or title", - ), + "User Name".toText16(), + "User role or title".toText14(), ], ), ), @@ -69,19 +61,19 @@ class DashboardPage extends StatelessWidget { ), ListTile( leading: Icon(Icons.notifications), - title: Txt("Notifications"), + title: "Notifications".toText14(), ), ListTile( leading: Icon(Icons.settings), - title: Txt("General"), + title: "General".toText14(), ), ListTile( leading: Icon(Icons.person), - title: Txt("Account"), + title: "Account".toText14(), ), ListTile( leading: Icon(Icons.logout), - title: Txt("Sign Out"), + title: "Sign Out".toText14(), onTap: () { pop(context); pop(context); diff --git a/lib/pages/user/complete_profile_page.dart b/lib/pages/user/complete_profile_page.dart index e3e6d5c..a3982dd 100644 --- a/lib/pages/user/complete_profile_page.dart +++ b/lib/pages/user/complete_profile_page.dart @@ -1,7 +1,7 @@ -import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -18,40 +18,34 @@ class CompleteProfilePage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Complete Profile", - txtType: TxtType.heading3, - ), - mHeight(12), + "Complete Profile".toText16(), + 12.height, TxtField( hint: "First Name", ), - mHeight(12), + 12.height, TxtField( hint: "Surname", ), - mHeight(12), + 12.height, TxtField( hint: "Email", ), - mHeight(12), + 12.height, TxtField( hint: "Create Password", ), - mHeight(12), + 12.height, TxtField( hint: "Confirm Password", ), - mHeight(12), + 12.height, TxtField( hint: "Phone Number", ), - mHeight(50), - Txt( - "By creating an account you agree to our Terms of Service and Privacy Policy", - textAlign: TextAlign.center, - ), - mHeight(16), + 50.height, + "By creating an account you agree to our Terms of Service and Privacy Policy".toText14(), + 16.height, ShowFillButton( title: "Continue", width: double.infinity, diff --git a/lib/pages/user/forget_password_page.dart b/lib/pages/user/forget_password_page.dart index 1313322..000b5be 100644 --- a/lib/pages/user/forget_password_page.dart +++ b/lib/pages/user/forget_password_page.dart @@ -1,9 +1,9 @@ -import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; import 'package:car_provider_app/widgets/dialog/dialogs.dart'; import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -18,18 +18,15 @@ class ForgetPasswordPage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Retrieve Password", - txtType: TxtType.heading3, - ), - mHeight(12), + "Retrieve Password".toText16(), + 12.height, TxtField( hint: "Phone Number", ), TxtField( hint: "Email", ), - mHeight(40), + 40.height, ShowFillButton( title: "Continue", width: double.infinity, diff --git a/lib/pages/user/login_verification_page.dart b/lib/pages/user/login_verification_page.dart index 0414f82..729d6b9 100644 --- a/lib/pages/user/login_verification_page.dart +++ b/lib/pages/user/login_verification_page.dart @@ -6,8 +6,8 @@ import 'package:car_provider_app/widgets/app_bar.dart'; import 'package:car_provider_app/widgets/button/show_image_button.dart'; import 'package:car_provider_app/widgets/dialog/dialogs.dart'; import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; -import 'package:car_provider_app/widgets/txt.dart'; -import 'package:car_provider_app/widgets/txt_field.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; class LoginVerificationPage extends StatelessWidget { @@ -21,10 +21,7 @@ class LoginVerificationPage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Verify Account", - txtType: TxtType.heading3, - ), + "Verify Account".toText16(), mFlex(2), Row( children: [ @@ -46,7 +43,7 @@ class LoginVerificationPage extends StatelessWidget { icon: icons + "ic_fingerprint.png", ), ), - mWidth(20), + 20.height, Expanded( child: ShowImageButton( onClick: () { @@ -58,7 +55,7 @@ class LoginVerificationPage extends StatelessWidget { ), ], ), - mHeight(40), + 40.height, Row( children: [ Expanded( @@ -70,7 +67,7 @@ class LoginVerificationPage extends StatelessWidget { icon: icons + "ic_sms.png", ), ), - mWidth(20), + 20.height, Expanded( child: ShowImageButton( onClick: () { diff --git a/lib/pages/user/login_verify_account_page.dart b/lib/pages/user/login_verify_account_page.dart index c09e17b..9df717f 100644 --- a/lib/pages/user/login_verify_account_page.dart +++ b/lib/pages/user/login_verify_account_page.dart @@ -7,7 +7,8 @@ import 'package:car_provider_app/widgets/button/show_image_button.dart'; import 'package:car_provider_app/widgets/dialog/dialogs.dart'; import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; import 'package:car_provider_app/widgets/dialog/otp_dialog.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -22,10 +23,7 @@ class LoginVerifyAccountPage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Verify Account", - txtType: TxtType.heading3, - ), + "Verify Account".toText16(), mFlex(1), TxtField( hint: "Enter Phone number to verify", @@ -40,7 +38,7 @@ class LoginVerifyAccountPage extends StatelessWidget { onClick: () { pop(context); delay(300).then( - (value) => showMDialog( + (value) => showMDialog( context, child: MessageDialog( title: "Phone Number Verified", @@ -57,7 +55,7 @@ class LoginVerifyAccountPage extends StatelessWidget { icon: icons + "ic_sms.png", ), ), - mWidth(20), + 20.height, Expanded( child: ShowImageButton( onClick: () { @@ -70,7 +68,7 @@ class LoginVerifyAccountPage extends StatelessWidget { child: MessageDialog( title: "Phone Number Verified", onClick: () { - navigateWithName(context, AppRoutes.profile1); + navigateWithName(context, AppRoutes.profile1); }, ), ), diff --git a/lib/pages/user/profile/profile_1_page.dart b/lib/pages/user/profile/profile_1_page.dart index e163f49..6e87758 100644 --- a/lib/pages/user/profile/profile_1_page.dart +++ b/lib/pages/user/profile/profile_1_page.dart @@ -1,9 +1,9 @@ import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/utils/navigator.dart'; -import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -20,47 +20,39 @@ class Profile1Page extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Complete Profile 1/3", - txtType: TxtType.heading3, - ), - Txt( - "User Information", - ), - mHeight(12), + "Complete Profile 1/3".toText16(), + "User Information".toText14(), + 12.height, TxtField( hint: "Provider", ), - mHeight(12), + 12.height, TxtField( hint: "First Name", ), - mHeight(12), + 12.height, TxtField( hint: "Surname", ), - mHeight(12), + 12.height, TxtField( hint: "Email", ), - mHeight(12), + 12.height, TxtField( hint: "Create Password", ), - mHeight(12), + 12.height, TxtField( hint: "Confirm Password", ), - mHeight(12), + 12.height, TxtField( hint: "Phone Number", ), - mHeight(50), - Txt( - "By creating an account you agree to our Terms of Service and Privacy Policy", - textAlign: TextAlign.center, - ), - mHeight(16), + 50.height, + "By creating an account you agree to our Terms of Service and Privacy Policy".toText14(), + 16.height, ShowFillButton( title: "Continue", width: double.infinity, diff --git a/lib/pages/user/profile/profile_2_page.dart b/lib/pages/user/profile/profile_2_page.dart index a65c00a..3fd99ee 100644 --- a/lib/pages/user/profile/profile_2_page.dart +++ b/lib/pages/user/profile/profile_2_page.dart @@ -2,8 +2,9 @@ import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -20,33 +21,28 @@ class Profile2Page extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Complete Profile 2/3", - txtType: TxtType.heading3, - ), - Txt( - "licenses & certificatoins", - ), - mHeight(12), + "Complete Profile 2/3".toText16(), + "licenses & certificatoins".toText14(), + 12.height, TxtField( hint: "Commercial Record N.O", // isButtonEnable: true, isNeedFilterButton: true, postfixData: Icons.attach_file, ), - mHeight(12), + 12.height, TxtField( hint: "Chamber of Commerce N.O", isNeedFilterButton: true, postfixData: Icons.attach_file, ), - mHeight(12), + 12.height, TxtField( hint: "VET Certificate N.O", isNeedFilterButton: true, postfixData: Icons.attach_file, ), - mHeight(30), + 30.height, ShowFillButton( title: "Save", width: double.infinity, diff --git a/lib/pages/user/profile/profile_3_page.dart b/lib/pages/user/profile/profile_3_page.dart index 317f15e..a6e9824 100644 --- a/lib/pages/user/profile/profile_3_page.dart +++ b/lib/pages/user/profile/profile_3_page.dart @@ -1,10 +1,10 @@ -import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; import 'package:car_provider_app/widgets/dialog/dialogs.dart'; import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; import 'package:car_provider_app/widgets/dropdown/dropdow_field.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -22,31 +22,26 @@ class Profile3Page extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Txt( - "Complete Profile 3/3", - txtType: TxtType.heading3, - ), - Txt( - "Branch Info and Services", - ), - mHeight(12), + "Complete Profile 3/3".toText16(), + "Branch Info and Services".toText14(), + 12.height, DropdownField( hint: "Country", ), - mHeight(12), + 12.height, DropdownField( hint: "City", ), - mHeight(12), + 12.height, TxtField( hint: "Address", maxLines: 5, ), - mHeight(12), - Txt("Select Location Map"), - mHeight(12), + 12.height, + "Select Location Map".toText14(), + 12.height, Image.asset("assets/images/bn_map.png"), - mHeight(50), + 50.height, ShowFillButton( title: "Save", width: double.infinity, diff --git a/lib/pages/user/register_page.dart b/lib/pages/user/register_page.dart index 6fd8b36..5b83cfb 100644 --- a/lib/pages/user/register_page.dart +++ b/lib/pages/user/register_page.dart @@ -1,7 +1,7 @@ -import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; @@ -16,27 +16,21 @@ class RegisterPage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Enter Phone Number", - txtType: TxtType.heading3, - ), - mHeight(12), + "Enter Phone Number".toText16(), + 12.height, TxtField( hint: "Enter Phone number to Register", ), TxtField( hint: "Enter Phone number to Register", ), - mHeight(40), - Txt( - "Or Enter Email", - txtType: TxtType.heading3, - ), - mHeight(12), + 40.height, + "Or Enter Email".toText16(), + 12.height, TxtField( hint: "Enter Email to Register", ), - mHeight(50), + 50.height, ShowFillButton( title: "Continue", width: double.infinity, diff --git a/lib/pages/user/register_selection_page.dart b/lib/pages/user/register_selection_page.dart index 1717baf..4b78d28 100644 --- a/lib/pages/user/register_selection_page.dart +++ b/lib/pages/user/register_selection_page.dart @@ -2,8 +2,9 @@ import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:flutter/material.dart'; class RegisterSelectionPage extends StatelessWidget { @@ -17,10 +18,7 @@ class RegisterSelectionPage extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ - Txt( - "Welcome Message", - txtType: TxtType.heading3, - ), + "Welcome Message".toText16(), mFlex(1), ShowFillButton( title: "Log In", @@ -29,7 +27,7 @@ class RegisterSelectionPage extends StatelessWidget { navigateWithName(context, AppRoutes.loginVerifyAccount); }, ), - mHeight(20), + 20.height, ShowFillButton( title: "Sign Up", width: double.infinity, @@ -37,7 +35,7 @@ class RegisterSelectionPage extends StatelessWidget { navigateWithName(context, AppRoutes.register); }, ), - mHeight(20), + 20.height, ShowFillButton( title: "Forget Password", width: double.infinity, diff --git a/lib/pages/user/splash_page.dart b/lib/pages/user/splash_page.dart index 145c30b..02708ce 100644 --- a/lib/pages/user/splash_page.dart +++ b/lib/pages/user/splash_page.dart @@ -1,9 +1,8 @@ -import 'dart:async'; - import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/utils/utils.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/widget_extensions.dart'; import 'package:flutter/material.dart'; class SplashPage extends StatelessWidget { @@ -16,29 +15,15 @@ class SplashPage extends StatelessWidget { child: Column( children: [ mFlex(5), - Txt( - "Logo", - fontSize: 45, - bold: true, - ), + "Logo".toText32(isBold: true), mFlex(3), - Txt( - "First Time Log In", - txtType: TxtType.heading1, - isFlatButton: true, - onTap: () { - navigateWithName(context, AppRoutes.registerSelection); - }, - ), + "First Time Log In".toText24().onPress(() { + navigateWithName(context, AppRoutes.registerSelection); + }), mFlex(1), - Txt( - "Already Signed Up and Logged In", - txtType: TxtType.heading1, - isFlatButton: true, - onTap: () { - navigateWithName(context, AppRoutes.loginVerification); - }, - ), + "Already Signed Up and Logged In".toText24().onPress(() { + navigateWithName(context, AppRoutes.loginVerification); + }), mFlex(5), ], ), diff --git a/lib/repo/account_repository.dart b/lib/repo/account_repository.dart deleted file mode 100644 index e645063..0000000 --- a/lib/repo/account_repository.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:car_provider_app/models/account.dart'; -import 'package:car_provider_app/models/response_models.dart'; -import 'package:car_provider_app/services/backend_service.dart'; -import 'package:injector/injector.dart'; - -abstract class IAcRepository { - Future getAccountList(); - - Future updateAccount(String dataAsJson); -} - -class AcRepository implements IAcRepository { - static const String ACCOUNT_API_CONTROLLER_MOBILE = - "AccountApiControllerMobile/"; - - static const String ACCOUNT_LIST = ACCOUNT_API_CONTROLLER_MOBILE + "list"; - static const String UPDATE_LIST = - ACCOUNT_API_CONTROLLER_MOBILE + "saveaccountselected"; - - @override - Future getAccountList() async { - BackendResponse response = await Injector.appInstance - .getDependency() - .getAuthenticatedAPI(ACCOUNT_LIST); - - if (response != null && response.isOk) { - return Account.fromJson(response.result); - } else { - throw Exception(); - } - } - - @override - Future updateAccount(String dataAsJson) async { - BackendResponse response = await Injector.appInstance - .getDependency() - .postAuthenticatedAPI(UPDATE_LIST, dataAsJson); - - if (response != null && response.isOk) { - //if parsing failed, throw exception - return response; - } else { - throw Exception(); - } - } -} diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index a00ee95..4b07a10 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -1,14 +1,13 @@ import 'dart:convert'; -import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; import 'package:car_provider_app/config/constants.dart'; import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; - import 'package:sizer/sizer.dart'; Color getColorFromHex(String hexColor) { @@ -27,6 +26,7 @@ Widget spacerVertical(double v) { width: double.infinity, ); } + Future delay(int millis) async { return await Future.delayed(Duration(milliseconds: millis)); } @@ -44,13 +44,6 @@ Widget spacerHorizontal(double v) { ); } -Widget mHeight(double f) { - return Container( - width: f, - height: f, - ); -} - Widget mDivider(Color color, {double? h}) { return Container( width: double.infinity, @@ -89,13 +82,6 @@ InputDecoration txtField(String label) { ); } -Widget mWidth(double f) { - return Container( - width: f, - height: f, - ); -} - Widget mFlex(int f) { return Flexible( flex: f, @@ -105,6 +91,7 @@ Widget mFlex(int f) { ), ); } + Widget mExp(int f) { return Expanded( flex: f, @@ -147,14 +134,8 @@ Widget floatButton(String icon, {Color? color, required Function onClick, String margin: EdgeInsets.all(1), ), ), - if (title != null) mHeight(2.w), - if (title != null) - Txt( - title, - fontSize: 12.sp, - bold: true, - color: headingColor, - ) + if (title != null) 2.w.toInt().height, + if (title != null) title.toText12(color: headingColor, isBold: true), ], ), ); @@ -198,17 +179,19 @@ String base64String(Uint8List data) { return base64Encode(data); } -Widget overLayWidget({double? width, double? height,List? color}) { +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:[ - Colors.black.withOpacity(0.2), - Colors.black.withOpacity(0.1), - Colors.black.withOpacity(0.004), - ], + colors: color != null + ? color + : [ + Colors.black.withOpacity(0.2), + Colors.black.withOpacity(0.1), + Colors.black.withOpacity(0.004), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter, tileMode: TileMode.clamp, @@ -287,11 +270,6 @@ Decoration containerColorRadiusBorder(Color background, double radius, Color col ); } - - - - - //Decoration appGradient = BoxDecoration( // gradient: LinearGradient( // colors: [ diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index b16637f..a9227a6 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -1,7 +1,6 @@ import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; -import 'package:sizer/sizer.dart'; AppBar appBar({ Color? backgroundColor, @@ -20,9 +19,6 @@ AppBar appBar({ color: backIconColor ?? Colors.black, //change your color here ), actions: actions, - title: Txt( - title ?? "", - txtType: TxtType.appBar, - ), + title: (title ?? "").toText16(), ); } diff --git a/lib/widgets/button/show_image_button.dart b/lib/widgets/button/show_image_button.dart index cac9a55..3067ba0 100644 --- a/lib/widgets/button/show_image_button.dart +++ b/lib/widgets/button/show_image_button.dart @@ -1,15 +1,13 @@ import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/utils.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; -import '../txt.dart'; - class ShowImageButton extends StatelessWidget { String icon, title; VoidCallback onClick; - ShowImageButton( - {required this.icon, required this.title, required this.onClick}); + ShowImageButton({required this.icon, required this.title, required this.onClick}); @override Widget build(BuildContext context) { @@ -29,12 +27,8 @@ class ShowImageButton extends StatelessWidget { color: Colors.white, ), ), - mHeight(12), - Txt( - title, - txtType: TxtType.heading2, - color: Colors.blue, - ) + 12.height, + title.toText22(color: Colors.blue) ], ), ), diff --git a/lib/widgets/dialog/message_dialog.dart b/lib/widgets/dialog/message_dialog.dart index 871b2e9..b96226c 100644 --- a/lib/widgets/dialog/message_dialog.dart +++ b/lib/widgets/dialog/message_dialog.dart @@ -1,14 +1,13 @@ -import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/navigator.dart'; -import 'package:car_provider_app/utils/utils.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:flutter/material.dart'; class MessageDialog extends StatelessWidget { String? title, buttonTitle; VoidCallback? onClick; - MessageDialog({this.title, this.buttonTitle,this.onClick}); + + MessageDialog({this.title, this.buttonTitle, this.onClick}); @override Widget build(BuildContext context) { @@ -19,11 +18,8 @@ class MessageDialog extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Txt( - title ?? "message", - txtType: TxtType.heading3, - ), - mHeight(40), + (title ?? "message").toText16(), + 40.height, ShowFillButton( title: buttonTitle ?? "Continue", width: double.infinity, diff --git a/lib/widgets/dialog/otp_dialog.dart b/lib/widgets/dialog/otp_dialog.dart index eae0664..d08a3c2 100644 --- a/lib/widgets/dialog/otp_dialog.dart +++ b/lib/widgets/dialog/otp_dialog.dart @@ -1,8 +1,7 @@ import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/navigator.dart'; -import 'package:car_provider_app/utils/utils.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart'; -import 'package:car_provider_app/widgets/txt.dart'; import 'package:flutter/material.dart'; class OtpDialog extends StatelessWidget { @@ -19,11 +18,8 @@ class OtpDialog extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Txt( - "Please insert OTP Code", - txtType: TxtType.heading3, - ), - mHeight(20), + "Please insert OTP Code".toText16(), + 20.height, Row( children: [ Expanded( @@ -33,7 +29,7 @@ class OtpDialog extends StatelessWidget { color: accentColor.withOpacity(0.3), ), ), - mWidth(12), + 12.height, Expanded( child: Container( width: double.infinity, @@ -41,7 +37,7 @@ class OtpDialog extends StatelessWidget { color: accentColor.withOpacity(0.3), ), ), - mWidth(12), + 12.height, Expanded( child: Container( width: double.infinity, @@ -49,7 +45,7 @@ class OtpDialog extends StatelessWidget { color: accentColor.withOpacity(0.3), ), ), - mWidth(12), + 12.height, Expanded( child: Container( width: double.infinity, @@ -59,7 +55,7 @@ class OtpDialog extends StatelessWidget { ), ], ), - mHeight(40), + 40.height, ShowFillButton( title: "Check Code", width: double.infinity, diff --git a/lib/widgets/dropdown/dropdow_field.dart b/lib/widgets/dropdown/dropdow_field.dart index b3a2c09..3edb326 100644 --- a/lib/widgets/dropdown/dropdow_field.dart +++ b/lib/widgets/dropdown/dropdow_field.dart @@ -1,10 +1,7 @@ import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/utils/utils.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; -import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/utils.dart'; - -import '../txt.dart'; class DropdownField extends StatefulWidget { String? hint; @@ -39,12 +36,7 @@ class _DropdownFieldState extends State { iconDisabledColor: borderColor, isExpanded: true, style: const TextStyle(color: Colors.black), - hint: Txt( - widget.hint ?? "", - txtType: TxtType.heading1, - bold: false, - color: borderColor, - ), + hint: (widget.hint ?? "").toText24(color: borderColor), underline: Container( height: 0, ), @@ -64,11 +56,7 @@ class _DropdownFieldState extends State { (String value) { return DropdownMenuItem( value: value, - child: Txt( - value, - txtType: TxtType.heading1, - bold: false, - ), + child: value.toText24(), ); }, ).toList(), diff --git a/lib/widgets/dropdown/dropdown_text.dart b/lib/widgets/dropdown/dropdown_text.dart index 769b1e5..01d1c1a 100644 --- a/lib/widgets/dropdown/dropdown_text.dart +++ b/lib/widgets/dropdown/dropdown_text.dart @@ -1,9 +1,9 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:car_provider_app/config/constants.dart'; import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/utils.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; class DropDownText extends StatelessWidget { String title; @@ -16,12 +16,8 @@ class DropDownText extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ - Txt( - title, - txtType: TxtType.heading3, - color: accentColor, - ), - mWidth(16), + title.toText16(color: accentColor), + 16.height, SvgPicture.asset( svgIcons + "ic_arrow_down.svg", width: 10, diff --git a/lib/widgets/extensions/int_extensions.dart b/lib/widgets/extensions/int_extensions.dart new file mode 100644 index 0000000..9b90b2f --- /dev/null +++ b/lib/widgets/extensions/int_extensions.dart @@ -0,0 +1,7 @@ +import 'package:flutter/cupertino.dart'; + +extension IntExtensions on int { + Widget get height => SizedBox(height: toDouble()); + + Widget get width => SizedBox(width: toDouble()); +} diff --git a/lib/widgets/extensions/string_extensions.dart b/lib/widgets/extensions/string_extensions.dart new file mode 100644 index 0000000..d10fe0b --- /dev/null +++ b/lib/widgets/extensions/string_extensions.dart @@ -0,0 +1,109 @@ +import 'package:car_provider_app/theme/colors.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:intl/intl.dart'; + +extension EmailValidator on String { + Widget get toWidget => Text(this); + + Widget toText10({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? headingColor, 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 ?? headingColor, + 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 ?? headingColor, + 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 ?? headingColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null), + ); + + Widget toText14({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(color: color ?? headingColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); + + Widget toText16({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(color: color ?? headingColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); + + Widget toText17({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(color: color ?? headingColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); + + Widget toText22({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(height: 1, color: color ?? headingColor, 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 ?? headingColor, fontSize: 24, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); + + Widget toText32({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(height: 32 / 32, color: color ?? headingColor, 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); + } + + String toFormattedDate() { + String date = this.split("T")[0]; + String time = this.split("T")[1]; + var dates = date.split("-"); + return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; + } + + getMonth(int month) { + switch (month) { + case 1: + return "January"; + case 2: + return "February"; + case 3: + return "March"; + case 4: + return "April"; + case 5: + return "May"; + case 6: + return "June"; + case 7: + return "July"; + case 8: + return "August"; + case 9: + return "September"; + case 10: + return "October"; + case 11: + return "November"; + case 12: + return "December"; + } + } +} diff --git a/lib/widgets/extensions/widget_extensions.dart b/lib/widgets/extensions/widget_extensions.dart new file mode 100644 index 0000000..787894d --- /dev/null +++ b/lib/widgets/extensions/widget_extensions.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +extension WidgetExtensions on Widget { + Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); + + Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this); + + Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => + Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this); +} diff --git a/lib/widgets/show_fill_button.dart b/lib/widgets/show_fill_button.dart index b98eec7..6712800 100644 --- a/lib/widgets/show_fill_button.dart +++ b/lib/widgets/show_fill_button.dart @@ -1,12 +1,12 @@ import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; class ShowFillButton extends StatelessWidget { String title; VoidCallback onPressed; Color txtColor; - double elevation, radius,width; + double elevation, radius, width; ShowFillButton({ required this.title, @@ -14,28 +14,23 @@ class ShowFillButton extends StatelessWidget { this.txtColor = Colors.white, this.elevation = 4, this.radius = 6, - this.width=88, + this.width = 88, }); @override Widget build(BuildContext context) { return ElevatedButton( - style: ElevatedButton.styleFrom( - onPrimary: Colors.black87, - primary: accentColor, - minimumSize: Size(width, 45), - padding: EdgeInsets.symmetric(horizontal: 16), - elevation: elevation, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(radius)), + style: ElevatedButton.styleFrom( + onPrimary: Colors.black87, + primary: accentColor, + minimumSize: Size(width, 45), + padding: EdgeInsets.symmetric(horizontal: 16), + elevation: elevation, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(radius)), + ), ), - ), - onPressed: onPressed, - child: Txt( - title.toUpperCase(), - color: txtColor, - txtType: TxtType.heading1, - ), - ); + onPressed: onPressed, + child: title.toUpperCase().toText22(color: txtColor)); } } diff --git a/lib/widgets/txt.dart b/lib/widgets/txt.dart deleted file mode 100644 index bb4b816..0000000 --- a/lib/widgets/txt.dart +++ /dev/null @@ -1,170 +0,0 @@ -// import 'package:auto_size_text/auto_size_text.dart'; -import 'package:car_provider_app/theme/colors.dart'; -import 'package:car_provider_app/utils/utils.dart'; -import 'package:flutter/material.dart'; -import 'package:sizer/sizer.dart'; - -enum TxtType { - small, - normal, - heading1, - heading2, - heading3, - appBar, -} - -class Txt extends StatelessWidget { - String text; - int? maxLines; - double? fontSize; - Color? color; - bool? bold; - bool? isUnderline; - bool? isFlatButton; - double? pedding; - TextAlign? textAlign; - FontWeight? fontWeight; - Function? onTap; - TxtType txtType; - - Txt(this.text, {this.maxLines, this.color, this.bold, this.fontSize, this.isUnderline, this.isFlatButton, this.pedding, this.textAlign, this.fontWeight, this.onTap, this.txtType = TxtType.normal}); - - @override - Widget build(BuildContext context) { - if (isFlatButton != null) - return Padding( - padding: EdgeInsets.only(right: pedding ?? 0, left: pedding ?? 0), - child: InkWell( - onTap: () { - onTap!(); - }, - customBorder: inkWellCorner(r: 4), - child: Padding( - padding: const EdgeInsets.only( - left: 14, - right: 14, - top: 6, - bottom: 6, - ), - child: getText(), - ), - ), - ); - else - return getText(); - } - - Widget getText() { - return Material( - type: MaterialType.transparency, - child: Text( - text, - maxLines: maxLines, - textAlign: textAlign, - overflow: maxLines != null ? TextOverflow.ellipsis : null, - style: TextStyle( - fontSize: fontSize ?? - (txtType == TxtType.small - ? 8.sp - : txtType == TxtType.normal - ? 10.sp - : txtType == TxtType.heading1 - ? 11.sp - : txtType == TxtType.heading2 - ? 12.sp - : txtType == TxtType.heading3 - ? 13.sp - : txtType == TxtType.appBar - ? 14.sp - : 8.sp), - color: color ?? - (txtType == TxtType.appBar - ? Colors.black - : txtType == TxtType.heading1 - ? headingColor - : txtType == TxtType.heading2 - ? headingColor - : txtType == TxtType.heading3 - ? headingColor - : null), - fontWeight: (fontWeight != null) - ? fontWeight - : ((bold != null) - ? FontWeight.bold - : (txtType == TxtType.appBar - ? FontWeight.bold - : txtType == TxtType.heading1 - ? FontWeight.bold - : txtType == TxtType.heading2 - ? FontWeight.bold - : txtType == TxtType.heading3 - ? FontWeight.bold - : null)), - decoration: (isUnderline != null) ? TextDecoration.underline : null, - ), - ), - ); - } -} - -// class TxtAuto extends StatelessWidget { -// String text; -// int? maxLines; -// double? fontSize; -// Color? color; -// bool? bold; -// bool? isUnderline; -// bool? isFlatButton; -// double? pedding; -// TextAlign? textAlign; -// -// TxtAuto( -// this.text, { -// this.maxLines, -// this.color, -// this.bold, -// this.fontSize, -// this.isUnderline, -// this.isFlatButton, -// this.pedding, -// this.textAlign, -// }); -// -// @override -// Widget build(BuildContext context) { -// if (isFlatButton != null) -// return Padding( -// padding: EdgeInsets.only(right: pedding ?? 0, left: pedding ?? 0), -// child: InkWell( -// onTap: () {}, -// customBorder: inkWellCorner(r: 4), -// child: Padding( -// padding: const EdgeInsets.only( -// left: 14, -// right: 14, -// top: 6, -// bottom: 6, -// ), -// child: getText(), -// ), -// ), -// ); -// else -// return getText(); -// } -// -// Widget getText() { -// return AutoSizeText( -// text, -// maxLines: maxLines, -// textAlign: textAlign, -// overflow: maxLines != null ? TextOverflow.ellipsis : null, -// style: TextStyle( -// fontSize: fontSize, -// color: color, -// fontWeight: (bold != null) ? FontWeight.bold : null, -// decoration: (isUnderline != null) ? TextDecoration.underline : null, -// ), -// ); -// } -// } diff --git a/lib/widgets/txt_field.dart b/lib/widgets/txt_field.dart index 0271a19..4baaaf2 100644 --- a/lib/widgets/txt_field.dart +++ b/lib/widgets/txt_field.dart @@ -1,6 +1,7 @@ import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/utils/utils.dart'; -import 'package:car_provider_app/widgets/txt.dart'; +import 'package:car_provider_app/widgets/extensions/int_extensions.dart'; +import 'package:car_provider_app/widgets/extensions/string_extensions.dart'; import 'package:flutter/material.dart'; import 'package:sizer/sizer.dart'; @@ -65,18 +66,15 @@ class TxtField extends StatelessWidget { alignLabelWithHint: true, fillColor: Colors.white, focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: accentColor, width: isNeedBorder ? 1.0 : 0), + borderSide: BorderSide(color: accentColor, width: isNeedBorder ? 1.0 : 0), borderRadius: BorderRadius.circular(4.0), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: borderColor, width: isNeedBorder ? 1.0 : 0), + borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0), borderRadius: BorderRadius.circular(4.0), ), disabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: borderColor, width: isNeedBorder ? 1.0 : 0), + borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0), borderRadius: BorderRadius.circular(4.0), ), prefixIcon: prefixData != null @@ -100,7 +98,7 @@ class TxtField extends StatelessWidget { ), ), ), - if (isNeedFilterButton) mWidth(8), + if (isNeedFilterButton) 8.width, if (isNeedFilterButton) InkWell( onTap: isNeedClickAll @@ -136,12 +134,7 @@ class TxtField extends StatelessWidget { child: Center( child: Padding( padding: const EdgeInsets.only(left: 12, right: 12), - child: Txt( - buttonTitle ?? "Search", - color: Colors.white, - fontSize: 18, - bold: true, - ), + child: (buttonTitle ?? "Search").toText17(isBold: true, color: Colors.white), ), ), ), diff --git a/pubspec.lock b/pubspec.lock index 7579b66..c66b7ec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -28,7 +28,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -181,7 +181,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -424,7 +424,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" typed_data: dependency: transitive description: @@ -445,7 +445,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" win32: dependency: transitive description: