Merge branch 'sikander_work' into 'master'

model change

See merge request mirza.shafique/car_provider_app!1
fatima
Mirza Shafique 4 years ago
commit cb87d022fe

@ -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> = U Function(dynamic);
class APIError {
int errorCode;
String errorMessage;
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> 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<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
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<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
String? requestBody;
if (jsonObject != null) {
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<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
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<T> _withClient<T>(Future<T> Function(Client) fn) async {
var httpClient = HttpClient()..badCertificateCallback = _certificateCheck;
var client = IOClient(httpClient);
try {
return await fn(client);
} finally {
client.close();
}
}
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
}

@ -0,0 +1,27 @@
class LoginApiClient {
static final LoginApiClient _instance = LoginApiClient._internal();
LoginApiClient._internal();
factory LoginApiClient() => _instance;
// Future<CheckMobileAppVersionModel> checkMobileAppVersion() async {
// String url = "${ApiConsts.utilitiesRest}CheckMobileAppVersion";
// Map<String, dynamic> postParams = {};
// postParams.addAll(AppState().postParamsJson);
// return await ApiClient().postJsonForObject((json) => CheckMobileAppVersionModel.fromJson(json), url, postParams);
// }
//
// Future<MemberLoginListModel?> memberLogin(String username, String password) async {
// String url = "${ApiConsts.erpRest}MemberLogin";
// Map<String, dynamic> 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);
// }
}

@ -0,0 +1,26 @@
class TangheemUserApiClient {
static final TangheemUserApiClient _instance = TangheemUserApiClient._internal();
TangheemUserApiClient._internal();
factory TangheemUserApiClient() => _instance;
// Future<SurahModel> getSurahs() async {
// String url = "${ApiConsts.tangheemUsers}AlSuar_Get";
// var postParams = {};
// return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams);
// }
//
// Future<MemberModel> getMembers() async {
// String url = "${ApiConsts.tangheemUsers}Committee_Get";
// var postParams = {};
// return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams);
// }
//
// Future<ContentInfoModel> getContentInfo(int contentId) async {
// String url = "${ApiConsts.tangheemUsers}ContentInfo_Get";
// var postParams = {"contentTypeId": contentId};
// return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams);
// }
}

@ -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<ISharedPreferences>()
.promotionNotificationsEnabled;
if (isPromotionNotificationEnabled == null) {
await Injector.appInstance
.getDependency<ISharedPreferences>()
.setPromotionNotificationEnabled(true);
Injector.appInstance
.getDependency<IFirebaseService>()
.subscribeForPromotions();
} */
} catch (_) {
//something wend wrong, set it to true
await Injector.appInstance
.getDependency<ISharedPreferences>()
.setPromotionNotificationEnabled(true);
/*Injector.appInstance
.getDependency<IFirebaseService>()
.subscribeForPromotions();*/
}
}
}

@ -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<IAcRepository>(() => AcRepository());
// injector.registerSingleton<IAcRepository>((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();
}
}

@ -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<String, dynamic> toJson() => {'message': message, 'error': error, 'arguments': '$arguments'};
@override
String toString() {
return jsonEncode(this);
}
}

@ -1,11 +1,9 @@
import 'package:car_provider_app/config/app_provider.dart'; 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:car_provider_app/theme/app_theme.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
import 'config/localization.dart';
import 'config/routes.dart'; import 'config/routes.dart';
Future<void> main() async { Future<void> main() async {
@ -25,9 +23,7 @@ Future<void> main() async {
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
// This widget is the root of your application. // This widget is the root of your application.
MyApp() { MyApp() {}
AppDependencies.addDependencies();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -1,8 +1,8 @@
import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/widgets/app_bar.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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DashboardPage extends StatelessWidget { class DashboardPage extends StatelessWidget {
@ -15,10 +15,7 @@ class DashboardPage extends StatelessWidget {
drawer: showDrawer(context), drawer: showDrawer(context),
body: Container( body: Container(
child: Center( child: Center(
child: Txt( child: "Dashboard/Main Page".toText22(),
"Dashboard/Main Page",
txtType: TxtType.heading3,
),
), ),
), ),
); );
@ -50,13 +47,8 @@ class DashboardPage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Txt( "User Name".toText16(),
"User Name", "User role or title".toText14(),
txtType: TxtType.heading3,
),
Txt(
"User role or title",
),
], ],
), ),
), ),
@ -69,19 +61,19 @@ class DashboardPage extends StatelessWidget {
), ),
ListTile( ListTile(
leading: Icon(Icons.notifications), leading: Icon(Icons.notifications),
title: Txt("Notifications"), title: "Notifications".toText14(),
), ),
ListTile( ListTile(
leading: Icon(Icons.settings), leading: Icon(Icons.settings),
title: Txt("General"), title: "General".toText14(),
), ),
ListTile( ListTile(
leading: Icon(Icons.person), leading: Icon(Icons.person),
title: Txt("Account"), title: "Account".toText14(),
), ),
ListTile( ListTile(
leading: Icon(Icons.logout), leading: Icon(Icons.logout),
title: Txt("Sign Out"), title: "Sign Out".toText14(),
onTap: () { onTap: () {
pop(context); pop(context);
pop(context); pop(context);

@ -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/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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -18,40 +18,34 @@ class CompleteProfilePage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Complete Profile".toText16(),
"Complete Profile", 12.height,
txtType: TxtType.heading3,
),
mHeight(12),
TxtField( TxtField(
hint: "First Name", hint: "First Name",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Surname", hint: "Surname",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Email", hint: "Email",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Create Password", hint: "Create Password",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Confirm Password", hint: "Confirm Password",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Phone Number", hint: "Phone Number",
), ),
mHeight(50), 50.height,
Txt( "By creating an account you agree to our Terms of Service and Privacy Policy".toText14(),
"By creating an account you agree to our Terms of Service and Privacy Policy", 16.height,
textAlign: TextAlign.center,
),
mHeight(16),
ShowFillButton( ShowFillButton(
title: "Continue", title: "Continue",
width: double.infinity, width: double.infinity,

@ -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/app_bar.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.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/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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -18,18 +18,15 @@ class ForgetPasswordPage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Retrieve Password".toText16(),
"Retrieve Password", 12.height,
txtType: TxtType.heading3,
),
mHeight(12),
TxtField( TxtField(
hint: "Phone Number", hint: "Phone Number",
), ),
TxtField( TxtField(
hint: "Email", hint: "Email",
), ),
mHeight(40), 40.height,
ShowFillButton( ShowFillButton(
title: "Continue", title: "Continue",
width: double.infinity, width: double.infinity,

@ -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/button/show_image_button.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.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/message_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/txt_field.dart'; import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class LoginVerificationPage extends StatelessWidget { class LoginVerificationPage extends StatelessWidget {
@ -21,10 +21,7 @@ class LoginVerificationPage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Verify Account".toText16(),
"Verify Account",
txtType: TxtType.heading3,
),
mFlex(2), mFlex(2),
Row( Row(
children: [ children: [
@ -46,7 +43,7 @@ class LoginVerificationPage extends StatelessWidget {
icon: icons + "ic_fingerprint.png", icon: icons + "ic_fingerprint.png",
), ),
), ),
mWidth(20), 20.height,
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
@ -58,7 +55,7 @@ class LoginVerificationPage extends StatelessWidget {
), ),
], ],
), ),
mHeight(40), 40.height,
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -70,7 +67,7 @@ class LoginVerificationPage extends StatelessWidget {
icon: icons + "ic_sms.png", icon: icons + "ic_sms.png",
), ),
), ),
mWidth(20), 20.height,
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {

@ -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/dialogs.dart';
import 'package:car_provider_app/widgets/dialog/message_dialog.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/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:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -22,10 +23,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Verify Account".toText16(),
"Verify Account",
txtType: TxtType.heading3,
),
mFlex(1), mFlex(1),
TxtField( TxtField(
hint: "Enter Phone number to verify", hint: "Enter Phone number to verify",
@ -40,7 +38,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
onClick: () { onClick: () {
pop(context); pop(context);
delay(300).then( delay(300).then(
(value) => showMDialog( (value) => showMDialog(
context, context,
child: MessageDialog( child: MessageDialog(
title: "Phone Number Verified", title: "Phone Number Verified",
@ -57,7 +55,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
icon: icons + "ic_sms.png", icon: icons + "ic_sms.png",
), ),
), ),
mWidth(20), 20.height,
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
@ -70,7 +68,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
child: MessageDialog( child: MessageDialog(
title: "Phone Number Verified", title: "Phone Number Verified",
onClick: () { onClick: () {
navigateWithName(context, AppRoutes.profile1); navigateWithName(context, AppRoutes.profile1);
}, },
), ),
), ),

@ -1,9 +1,9 @@
import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.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/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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -20,47 +20,39 @@ class Profile1Page extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Complete Profile 1/3".toText16(),
"Complete Profile 1/3", "User Information".toText14(),
txtType: TxtType.heading3, 12.height,
),
Txt(
"User Information",
),
mHeight(12),
TxtField( TxtField(
hint: "Provider", hint: "Provider",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "First Name", hint: "First Name",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Surname", hint: "Surname",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Email", hint: "Email",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Create Password", hint: "Create Password",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Confirm Password", hint: "Confirm Password",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Phone Number", hint: "Phone Number",
), ),
mHeight(50), 50.height,
Txt( "By creating an account you agree to our Terms of Service and Privacy Policy".toText14(),
"By creating an account you agree to our Terms of Service and Privacy Policy", 16.height,
textAlign: TextAlign.center,
),
mHeight(16),
ShowFillButton( ShowFillButton(
title: "Continue", title: "Continue",
width: double.infinity, width: double.infinity,

@ -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/navigator.dart';
import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -20,33 +21,28 @@ class Profile2Page extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Complete Profile 2/3".toText16(),
"Complete Profile 2/3", "licenses & certificatoins".toText14(),
txtType: TxtType.heading3, 12.height,
),
Txt(
"licenses & certificatoins",
),
mHeight(12),
TxtField( TxtField(
hint: "Commercial Record N.O", hint: "Commercial Record N.O",
// isButtonEnable: true, // isButtonEnable: true,
isNeedFilterButton: true, isNeedFilterButton: true,
postfixData: Icons.attach_file, postfixData: Icons.attach_file,
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Chamber of Commerce N.O", hint: "Chamber of Commerce N.O",
isNeedFilterButton: true, isNeedFilterButton: true,
postfixData: Icons.attach_file, postfixData: Icons.attach_file,
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "VET Certificate N.O", hint: "VET Certificate N.O",
isNeedFilterButton: true, isNeedFilterButton: true,
postfixData: Icons.attach_file, postfixData: Icons.attach_file,
), ),
mHeight(30), 30.height,
ShowFillButton( ShowFillButton(
title: "Save", title: "Save",
width: double.infinity, width: double.infinity,

@ -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/app_bar.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.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/message_dialog.dart';
import 'package:car_provider_app/widgets/dropdown/dropdow_field.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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -22,31 +22,26 @@ class Profile3Page extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Txt( "Complete Profile 3/3".toText16(),
"Complete Profile 3/3", "Branch Info and Services".toText14(),
txtType: TxtType.heading3, 12.height,
),
Txt(
"Branch Info and Services",
),
mHeight(12),
DropdownField( DropdownField(
hint: "Country", hint: "Country",
), ),
mHeight(12), 12.height,
DropdownField( DropdownField(
hint: "City", hint: "City",
), ),
mHeight(12), 12.height,
TxtField( TxtField(
hint: "Address", hint: "Address",
maxLines: 5, maxLines: 5,
), ),
mHeight(12), 12.height,
Txt("Select Location Map"), "Select Location Map".toText14(),
mHeight(12), 12.height,
Image.asset("assets/images/bn_map.png"), Image.asset("assets/images/bn_map.png"),
mHeight(50), 50.height,
ShowFillButton( ShowFillButton(
title: "Save", title: "Save",
width: double.infinity, width: double.infinity,

@ -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/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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,27 +16,21 @@ class RegisterPage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Enter Phone Number".toText16(),
"Enter Phone Number", 12.height,
txtType: TxtType.heading3,
),
mHeight(12),
TxtField( TxtField(
hint: "Enter Phone number to Register", hint: "Enter Phone number to Register",
), ),
TxtField( TxtField(
hint: "Enter Phone number to Register", hint: "Enter Phone number to Register",
), ),
mHeight(40), 40.height,
Txt( "Or Enter Email".toText16(),
"Or Enter Email", 12.height,
txtType: TxtType.heading3,
),
mHeight(12),
TxtField( TxtField(
hint: "Enter Email to Register", hint: "Enter Email to Register",
), ),
mHeight(50), 50.height,
ShowFillButton( ShowFillButton(
title: "Continue", title: "Continue",
width: double.infinity, width: double.infinity,

@ -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/navigator.dart';
import 'package:car_provider_app/utils/utils.dart'; import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class RegisterSelectionPage extends StatelessWidget { class RegisterSelectionPage extends StatelessWidget {
@ -17,10 +18,7 @@ class RegisterSelectionPage extends StatelessWidget {
padding: EdgeInsets.all(40), padding: EdgeInsets.all(40),
child: Column( child: Column(
children: [ children: [
Txt( "Welcome Message".toText16(),
"Welcome Message",
txtType: TxtType.heading3,
),
mFlex(1), mFlex(1),
ShowFillButton( ShowFillButton(
title: "Log In", title: "Log In",
@ -29,7 +27,7 @@ class RegisterSelectionPage extends StatelessWidget {
navigateWithName(context, AppRoutes.loginVerifyAccount); navigateWithName(context, AppRoutes.loginVerifyAccount);
}, },
), ),
mHeight(20), 20.height,
ShowFillButton( ShowFillButton(
title: "Sign Up", title: "Sign Up",
width: double.infinity, width: double.infinity,
@ -37,7 +35,7 @@ class RegisterSelectionPage extends StatelessWidget {
navigateWithName(context, AppRoutes.register); navigateWithName(context, AppRoutes.register);
}, },
), ),
mHeight(20), 20.height,
ShowFillButton( ShowFillButton(
title: "Forget Password", title: "Forget Password",
width: double.infinity, width: double.infinity,

@ -1,9 +1,8 @@
import 'dart:async';
import 'package:car_provider_app/config/routes.dart'; import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.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'; import 'package:flutter/material.dart';
class SplashPage extends StatelessWidget { class SplashPage extends StatelessWidget {
@ -16,29 +15,15 @@ class SplashPage extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
mFlex(5), mFlex(5),
Txt( "Logo".toText32(isBold: true),
"Logo",
fontSize: 45,
bold: true,
),
mFlex(3), mFlex(3),
Txt( "First Time Log In".toText24().onPress(() {
"First Time Log In", navigateWithName(context, AppRoutes.registerSelection);
txtType: TxtType.heading1, }),
isFlatButton: true,
onTap: () {
navigateWithName(context, AppRoutes.registerSelection);
},
),
mFlex(1), mFlex(1),
Txt( "Already Signed Up and Logged In".toText24().onPress(() {
"Already Signed Up and Logged In", navigateWithName(context, AppRoutes.loginVerification);
txtType: TxtType.heading1, }),
isFlatButton: true,
onTap: () {
navigateWithName(context, AppRoutes.loginVerification);
},
),
mFlex(5), mFlex(5),
], ],
), ),

@ -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<Account> getAccountList();
Future<BackendResponse> 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<Account> getAccountList() async {
BackendResponse response = await Injector.appInstance
.getDependency<IBackendApiService>()
.getAuthenticatedAPI(ACCOUNT_LIST);
if (response != null && response.isOk) {
return Account.fromJson(response.result);
} else {
throw Exception();
}
}
@override
Future<BackendResponse> updateAccount(String dataAsJson) async {
BackendResponse response = await Injector.appInstance
.getDependency<IBackendApiService>()
.postAuthenticatedAPI(UPDATE_LIST, dataAsJson);
if (response != null && response.isOk) {
//if parsing failed, throw exception
return response;
} else {
throw Exception();
}
}
}

@ -1,14 +1,13 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui'; import 'dart:ui';
import 'package:car_provider_app/config/constants.dart'; import 'package:car_provider_app/config/constants.dart';
import 'package:car_provider_app/theme/colors.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/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
Color getColorFromHex(String hexColor) { Color getColorFromHex(String hexColor) {
@ -27,6 +26,7 @@ Widget spacerVertical(double v) {
width: double.infinity, width: double.infinity,
); );
} }
Future delay(int millis) async { Future delay(int millis) async {
return await Future.delayed(Duration(milliseconds: millis)); 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}) { Widget mDivider(Color color, {double? h}) {
return Container( return Container(
width: double.infinity, 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) { Widget mFlex(int f) {
return Flexible( return Flexible(
flex: f, flex: f,
@ -105,6 +91,7 @@ Widget mFlex(int f) {
), ),
); );
} }
Widget mExp(int f) { Widget mExp(int f) {
return Expanded( return Expanded(
flex: f, flex: f,
@ -147,14 +134,8 @@ Widget floatButton(String icon, {Color? color, required Function onClick, String
margin: EdgeInsets.all(1), margin: EdgeInsets.all(1),
), ),
), ),
if (title != null) mHeight(2.w), if (title != null) 2.w.toInt().height,
if (title != null) if (title != null) title.toText12(color: headingColor, isBold: true),
Txt(
title,
fontSize: 12.sp,
bold: true,
color: headingColor,
)
], ],
), ),
); );
@ -198,17 +179,19 @@ String base64String(Uint8List data) {
return base64Encode(data); return base64Encode(data);
} }
Widget overLayWidget({double? width, double? height,List<Color>? color}) { Widget overLayWidget({double? width, double? height, List<Color>? color}) {
return Container( return Container(
width: width ?? double.infinity, width: width ?? double.infinity,
height: height ?? 60, height: height ?? 60,
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
colors: color!=null?color:[ colors: color != null
Colors.black.withOpacity(0.2), ? color
Colors.black.withOpacity(0.1), : [
Colors.black.withOpacity(0.004), Colors.black.withOpacity(0.2),
], Colors.black.withOpacity(0.1),
Colors.black.withOpacity(0.004),
],
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
tileMode: TileMode.clamp, tileMode: TileMode.clamp,
@ -287,11 +270,6 @@ Decoration containerColorRadiusBorder(Color background, double radius, Color col
); );
} }
//Decoration appGradient = BoxDecoration( //Decoration appGradient = BoxDecoration(
// gradient: LinearGradient( // gradient: LinearGradient(
// colors: [ // colors: [

@ -1,7 +1,6 @@
import 'package:car_provider_app/theme/colors.dart'; 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:flutter/material.dart';
import 'package:sizer/sizer.dart';
AppBar appBar({ AppBar appBar({
Color? backgroundColor, Color? backgroundColor,
@ -20,9 +19,6 @@ AppBar appBar({
color: backIconColor ?? Colors.black, //change your color here color: backIconColor ?? Colors.black, //change your color here
), ),
actions: actions, actions: actions,
title: Txt( title: (title ?? "").toText16(),
title ?? "",
txtType: TxtType.appBar,
),
); );
} }

@ -1,15 +1,13 @@
import 'package:car_provider_app/theme/colors.dart'; 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 'package:flutter/material.dart';
import '../txt.dart';
class ShowImageButton extends StatelessWidget { class ShowImageButton extends StatelessWidget {
String icon, title; String icon, title;
VoidCallback onClick; VoidCallback onClick;
ShowImageButton( ShowImageButton({required this.icon, required this.title, required this.onClick});
{required this.icon, required this.title, required this.onClick});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -29,12 +27,8 @@ class ShowImageButton extends StatelessWidget {
color: Colors.white, color: Colors.white,
), ),
), ),
mHeight(12), 12.height,
Txt( title.toText22(color: Colors.blue)
title,
txtType: TxtType.heading2,
color: Colors.blue,
)
], ],
), ),
), ),

@ -1,14 +1,13 @@
import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart'; import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class MessageDialog extends StatelessWidget { class MessageDialog extends StatelessWidget {
String? title, buttonTitle; String? title, buttonTitle;
VoidCallback? onClick; VoidCallback? onClick;
MessageDialog({this.title, this.buttonTitle,this.onClick});
MessageDialog({this.title, this.buttonTitle, this.onClick});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -19,11 +18,8 @@ class MessageDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Txt( (title ?? "message").toText16(),
title ?? "message", 40.height,
txtType: TxtType.heading3,
),
mHeight(40),
ShowFillButton( ShowFillButton(
title: buttonTitle ?? "Continue", title: buttonTitle ?? "Continue",
width: double.infinity, width: double.infinity,

@ -1,8 +1,7 @@
import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/navigator.dart'; import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/utils/utils.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/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class OtpDialog extends StatelessWidget { class OtpDialog extends StatelessWidget {
@ -19,11 +18,8 @@ class OtpDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Txt( "Please insert OTP Code".toText16(),
"Please insert OTP Code", 20.height,
txtType: TxtType.heading3,
),
mHeight(20),
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -33,7 +29,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3), color: accentColor.withOpacity(0.3),
), ),
), ),
mWidth(12), 12.height,
Expanded( Expanded(
child: Container( child: Container(
width: double.infinity, width: double.infinity,
@ -41,7 +37,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3), color: accentColor.withOpacity(0.3),
), ),
), ),
mWidth(12), 12.height,
Expanded( Expanded(
child: Container( child: Container(
width: double.infinity, width: double.infinity,
@ -49,7 +45,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3), color: accentColor.withOpacity(0.3),
), ),
), ),
mWidth(12), 12.height,
Expanded( Expanded(
child: Container( child: Container(
width: double.infinity, width: double.infinity,
@ -59,7 +55,7 @@ class OtpDialog extends StatelessWidget {
), ),
], ],
), ),
mHeight(40), 40.height,
ShowFillButton( ShowFillButton(
title: "Check Code", title: "Check Code",
width: double.infinity, width: double.infinity,

@ -1,10 +1,7 @@
import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.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: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 { class DropdownField extends StatefulWidget {
String? hint; String? hint;
@ -39,12 +36,7 @@ class _DropdownFieldState extends State<DropdownField> {
iconDisabledColor: borderColor, iconDisabledColor: borderColor,
isExpanded: true, isExpanded: true,
style: const TextStyle(color: Colors.black), style: const TextStyle(color: Colors.black),
hint: Txt( hint: (widget.hint ?? "").toText24(color: borderColor),
widget.hint ?? "",
txtType: TxtType.heading1,
bold: false,
color: borderColor,
),
underline: Container( underline: Container(
height: 0, height: 0,
), ),
@ -64,11 +56,7 @@ class _DropdownFieldState extends State<DropdownField> {
(String value) { (String value) {
return DropdownMenuItem<String>( return DropdownMenuItem<String>(
value: value, value: value,
child: Txt( child: value.toText24(),
value,
txtType: TxtType.heading1,
bold: false,
),
); );
}, },
).toList(), ).toList(),

@ -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/config/constants.dart';
import 'package:car_provider_app/theme/colors.dart'; 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/txt.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 { class DropDownText extends StatelessWidget {
String title; String title;
@ -16,12 +16,8 @@ class DropDownText extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Txt( title.toText16(color: accentColor),
title, 16.height,
txtType: TxtType.heading3,
color: accentColor,
),
mWidth(16),
SvgPicture.asset( SvgPicture.asset(
svgIcons + "ic_arrow_down.svg", svgIcons + "ic_arrow_down.svg",
width: 10, width: 10,

@ -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());
}

@ -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";
}
}
}

@ -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);
}

@ -1,12 +1,12 @@
import 'package:car_provider_app/theme/colors.dart'; 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:flutter/material.dart';
class ShowFillButton extends StatelessWidget { class ShowFillButton extends StatelessWidget {
String title; String title;
VoidCallback onPressed; VoidCallback onPressed;
Color txtColor; Color txtColor;
double elevation, radius,width; double elevation, radius, width;
ShowFillButton({ ShowFillButton({
required this.title, required this.title,
@ -14,28 +14,23 @@ class ShowFillButton extends StatelessWidget {
this.txtColor = Colors.white, this.txtColor = Colors.white,
this.elevation = 4, this.elevation = 4,
this.radius = 6, this.radius = 6,
this.width=88, this.width = 88,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ElevatedButton( return ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
onPrimary: Colors.black87, onPrimary: Colors.black87,
primary: accentColor, primary: accentColor,
minimumSize: Size(width, 45), minimumSize: Size(width, 45),
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
elevation: elevation, elevation: elevation,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(radius)), borderRadius: BorderRadius.all(Radius.circular(radius)),
),
), ),
), onPressed: onPressed,
onPressed: onPressed, child: title.toUpperCase().toText22(color: txtColor));
child: Txt(
title.toUpperCase(),
color: txtColor,
txtType: TxtType.heading1,
),
);
} }
} }

@ -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,
// ),
// );
// }
// }

@ -1,6 +1,7 @@
import 'package:car_provider_app/theme/colors.dart'; import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.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/material.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
@ -65,18 +66,15 @@ class TxtField extends StatelessWidget {
alignLabelWithHint: true, alignLabelWithHint: true,
fillColor: Colors.white, fillColor: Colors.white,
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(color: accentColor, width: isNeedBorder ? 1.0 : 0),
color: accentColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0), borderRadius: BorderRadius.circular(4.0),
), ),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0),
color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0), borderRadius: BorderRadius.circular(4.0),
), ),
disabledBorder: OutlineInputBorder( disabledBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0),
color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0), borderRadius: BorderRadius.circular(4.0),
), ),
prefixIcon: prefixData != null prefixIcon: prefixData != null
@ -100,7 +98,7 @@ class TxtField extends StatelessWidget {
), ),
), ),
), ),
if (isNeedFilterButton) mWidth(8), if (isNeedFilterButton) 8.width,
if (isNeedFilterButton) if (isNeedFilterButton)
InkWell( InkWell(
onTap: isNeedClickAll onTap: isNeedClickAll
@ -136,12 +134,7 @@ class TxtField extends StatelessWidget {
child: Center( child: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 12, right: 12), padding: const EdgeInsets.only(left: 12, right: 12),
child: Txt( child: (buttonTitle ?? "Search").toText17(isBold: true, color: Colors.white),
buttonTitle ?? "Search",
color: Colors.white,
fontSize: 18,
bold: true,
),
), ),
), ),
), ),

@ -14,7 +14,7 @@ packages:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.1" version: "2.8.2"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -28,7 +28,7 @@ packages:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.2.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@ -181,7 +181,7 @@ packages:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.11"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -424,7 +424,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.2" version: "0.4.3"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@ -445,7 +445,7 @@ packages:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
win32: win32:
dependency: transitive dependency: transitive
description: description:

Loading…
Cancel
Save