diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 15cf7448..695cf105 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -26,6 +26,8 @@ LaunchScreen UIMainStoryboardFile Main + NSFaceIDUsageDescription + Why is my app authenticating using face id? UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/lib/config/size_config.dart b/lib/config/size_config.dart new file mode 100644 index 00000000..b029c89c --- /dev/null +++ b/lib/config/size_config.dart @@ -0,0 +1,54 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:flutter/cupertino.dart'; + +class SizeConfig { + static double _blockWidth = 0; + static double _blockHeight = 0; + + static double screenWidth; + static double screenHeight; + static double textMultiplier; + static double imageSizeMultiplier; + static double heightMultiplier; + static double widthMultiplier; + + static bool isPortrait = true; + static bool isMobilePortrait = false; + static bool isMobile = false; + + void init(BoxConstraints constraints, Orientation orientation) { + + screenHeight = constraints.maxHeight; + screenWidth = constraints.maxWidth; + + _blockWidth = screenWidth / 100; + _blockHeight = screenHeight / 100; + if(constraints.maxWidth<= MAX_SMALL_SCREEN){ + isMobile = true; + } + if (orientation == Orientation.portrait) { + isPortrait = true; + if (screenWidth < 450) { + isMobilePortrait = true; + } + textMultiplier = _blockHeight; + imageSizeMultiplier = _blockWidth; + } else { + isPortrait = false; + isMobilePortrait = false; + textMultiplier = _blockWidth; + imageSizeMultiplier = _blockHeight; + } + heightMultiplier = _blockHeight; + widthMultiplier = _blockWidth; + + print('screenWidth $screenWidth'); + print('screenHeight $screenHeight'); + print('textMultiplier $textMultiplier'); + print('imageSizeMultiplier $imageSizeMultiplier'); + print('heightMultiplier$heightMultiplier'); + print('widthMultiplier $widthMultiplier'); + print('isPortrait $isPortrait'); + print('isMobilePortrait $isMobilePortrait'); + } +} diff --git a/lib/interceptor/http_interceptor.dart b/lib/interceptor/http_interceptor.dart index 02e76ea1..1ad980c7 100644 --- a/lib/interceptor/http_interceptor.dart +++ b/lib/interceptor/http_interceptor.dart @@ -1,14 +1,39 @@ +import 'package:doctor_app_flutter/providers/auth_provider.dart'; +import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import 'package:http_interceptor/http_interceptor.dart'; +DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); +List publicUrls = [LOGIN_URL,SELECT_DEVICE_IMEI,]; + class HttpInterceptor extends InterceptorContract { Future interceptRequest({RequestData data}) async { - print('RequestData ${data.body}'); + // print('RequestData ${data.body}'); try { - // data.params['appid'] = OPEN_WEATHER_API_KEY; - // data.params['units'] = 'metric'; data.headers["Content-Type"] = "application/json"; data.headers["Accept"] = "application/json"; + if (!publicUrls.contains(data.url)) { + var loggedUserInfo = await sharedPref.getObj('loggedUser'); + print('loggedUserInfo$loggedUserInfo'); + // the sevices handel the token in differat name so I ask to be change + // we must change the implementaion once the name are changed + if(data.body['LogInTokenID']){ + data.body['LogInTokenID'] = loggedUserInfo['LogInTokenID']; + } + if(data.body['TokenID']){ + data.body['TokenID'] = loggedUserInfo['LogInTokenID']; + } + + print('data.body${data.body}'); + } + else { + if(data.body['LogInTokenID']){ + data.body['LogInTokenID'] = ''; + } + if(data.body['TokenID']){ + data.body['TokenID'] = ''; + } + } } catch (e) { print(e); } @@ -17,7 +42,7 @@ class HttpInterceptor extends InterceptorContract { @override Future interceptResponse({ResponseData data}) async { - print('${data.body}'); + // print('ResponseData ${data.body}'); return data; - } -} \ No newline at end of file + } +} diff --git a/lib/lookups/auth_lookup.dart b/lib/lookups/auth_lookup.dart index f3e3e3fc..bc4d3821 100644 --- a/lib/lookups/auth_lookup.dart +++ b/lib/lookups/auth_lookup.dart @@ -1 +1 @@ -enum loginType { knownUser, unknownUser } \ No newline at end of file +enum loginType { knownUser, unknownUser, changePassword, verifyPassword } diff --git a/lib/main.dart b/lib/main.dart index 119c7816..e752234a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,11 @@ -import 'package:doctor_app_flutter/providers/auth_provider.dart'; -import 'package:doctor_app_flutter/providers/patients_provider.dart'; -import 'package:doctor_app_flutter/providers/projects_provider.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; + +import './config/size_config.dart'; +import './providers/auth_provider.dart'; +import './providers/patients_provider.dart'; +import './providers/projects_provider.dart'; import './routes.dart'; void main() => runApp(MyApp()); @@ -12,22 +14,29 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: PatientsProvider()), - ChangeNotifierProvider.value(value: AuthProvider()), - ChangeNotifierProvider.value(value: ProjectsProvider()), - ], - child: MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - primaryColor: Hexcolor('#B8382C'), - buttonColor: Hexcolor('#B8382C'), - fontFamily: 'WorkSans'), - initialRoute: INIT_ROUTE, - routes: routes, - ), + return LayoutBuilder( + builder: (context, constraints) { + return OrientationBuilder(builder: (context, orientation) { + SizeConfig().init(constraints, orientation); + return MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: PatientsProvider()), + ChangeNotifierProvider.value(value: AuthProvider()), + ChangeNotifierProvider.value(value: ProjectsProvider()), + ], + child: MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + primaryColor: Hexcolor('#B8382C'), + buttonColor: Hexcolor('#B8382C'), + fontFamily: 'WorkSans'), + initialRoute: INIT_ROUTE, + routes: routes, + ), + ); + }); + }, ); } } diff --git a/lib/routes.dart b/lib/routes.dart index 85f26ad4..45b45945 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -9,32 +9,34 @@ import './screens/medicine/medicine_search_screen.dart'; import './screens/my_schedule_screen.dart'; import './screens/patients/patient_search_screen.dart'; import './screens/patients/patients_list_screen.dart'; +import './screens/auth/change_password_screen.dart'; +import './screens/auth/verify_account_screen.dart'; +const String INIT_ROUTE = LOGIN; const String HOME = '/'; const String LOGIN = 'login'; -const String INIT_ROUTE = LOGIN; +const String CHANGE_PASSWORD = 'change-password'; +const String VERIFY_ACCOUNT = 'verify-account'; const String MY_SCHEDULE = 'my-schedule'; -const String QR_READER = 'qr_reader'; +const String QR_READER = 'qr-reader'; const String PATIENT_SEARCH = 'patients/patient-search'; const String PATIENTS = 'patients/patients'; -const String BLOOD_BANK = 'blood_bank'; -const String DOCTOR_REPLY = 'doctor_reply'; -const String MEDICINE_SEARCH='medicine_search'; -const String SETTINGS ='settings'; - +const String BLOOD_BANK = 'blood-bank'; +const String DOCTOR_REPLY = 'doctor-reply'; +const String MEDICINE_SEARCH = 'medicine-search'; +const String SETTINGS = 'settings'; var routes = { - HOME:(_)=>DashboardPage(title: 'Home',), - INIT_ROUTE:(_)=>Loginsreen(), - MY_SCHEDULE:(_)=>MyScheduleScreen(), - PATIENT_SEARCH:(_)=>PatientSearchScreen(), - PATIENTS:(_)=>PatientsListScreen(), - QR_READER:(_)=>QrReaderScreen(), - BLOOD_BANK:(_)=>BloodBankScreen(), - DOCTOR_REPLY:(_)=>DoctorReplyScreen(), - MEDICINE_SEARCH:(_)=>MedicineSearchScreen(), - SETTINGS:(_)=>SettingsScreen() - - - + HOME: (_) => DashboardPage(title: 'Home',), + INIT_ROUTE: (_) => Loginsreen(), + MY_SCHEDULE: (_) => MyScheduleScreen(), + PATIENT_SEARCH: (_) => PatientSearchScreen(), + PATIENTS: (_) => PatientsListScreen(), + QR_READER: (_) => QrReaderScreen(), + BLOOD_BANK: (_) => BloodBankScreen(), + DOCTOR_REPLY: (_) => DoctorReplyScreen(), + MEDICINE_SEARCH: (_) => MedicineSearchScreen(), + SETTINGS: (_) => SettingsScreen(), + CHANGE_PASSWORD: (_) => ChangePasswordScreen(), + VERIFY_ACCOUNT: (_) => VerifyAccountScreen(), }; diff --git a/lib/screens/auth/change_password_screen.dart b/lib/screens/auth/change_password_screen.dart new file mode 100644 index 00000000..507c6afc --- /dev/null +++ b/lib/screens/auth/change_password_screen.dart @@ -0,0 +1,24 @@ +import 'package:doctor_app_flutter/lookups/auth_lookup.dart'; +import 'package:doctor_app_flutter/widgets/auth/auth_header.dart'; +import 'package:flutter/material.dart'; +import '../../widgets/auth/change_password.dart'; +class ChangePasswordScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + // return Container()]; + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsetsDirectional.fromSTEB(30, 0, 0, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AuthHeader(loginType.changePassword), + ChangePassword(), + ], + ), + ), + )); + } +} diff --git a/lib/screens/auth/login_screen.dart b/lib/screens/auth/login_screen.dart index 22bf76fd..ce0ce6ff 100644 --- a/lib/screens/auth/login_screen.dart +++ b/lib/screens/auth/login_screen.dart @@ -1,14 +1,14 @@ import 'dart:async'; -import 'package:doctor_app_flutter/lookups/auth_lookup.dart'; -import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; -import 'package:doctor_app_flutter/widgets/auth/known_user_login.dart'; -import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../../lookups/auth_lookup.dart'; +import '../../util/dr_app_shared_pref.dart'; import '../../widgets/auth/auth_header.dart'; +import '../../widgets/auth/known_user_login.dart'; import '../../widgets/auth/login_form.dart'; +import '../../widgets/shared/dr_app_circular_progress_Indeicator.dart'; DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); class Loginsreen extends StatefulWidget { diff --git a/lib/screens/auth/verify_account_screen.dart b/lib/screens/auth/verify_account_screen.dart new file mode 100644 index 00000000..77327292 --- /dev/null +++ b/lib/screens/auth/verify_account_screen.dart @@ -0,0 +1,24 @@ +import 'package:doctor_app_flutter/lookups/auth_lookup.dart'; +import 'package:doctor_app_flutter/widgets/auth/auth_header.dart'; +import 'package:flutter/material.dart'; + +class VerifyAccountScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + // return Container()]; + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsetsDirectional.fromSTEB(30, 0, 0, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AuthHeader(loginType.verifyPassword), + // ChangePassword(), + ], + ), + ), + )); + } +} diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 47b449f8..704d8be4 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,5 +1,5 @@ -import 'package:doctor_app_flutter/lookups/home_items_lookup.dart'; -import 'package:doctor_app_flutter/routes.dart'; +import '../lookups/home_items_lookup.dart'; +import '../routes.dart'; import '../widgets/home/home_item.dart'; import '../widgets/shared/app.drawer.dart'; diff --git a/lib/util/dr_app_shared_pref.dart b/lib/util/dr_app_shared_pref.dart index b8a330bd..f75c171e 100644 --- a/lib/util/dr_app_shared_pref.dart +++ b/lib/util/dr_app_shared_pref.dart @@ -80,6 +80,6 @@ class DrAppSharedPreferances { if (string == null ){ return null; } - return json.decode(prefs.getString(key)); + return json.decode(string); } } diff --git a/lib/widgets/auth/auth_header.dart b/lib/widgets/auth/auth_header.dart index 7c9de094..2f3876bd 100644 --- a/lib/widgets/auth/auth_header.dart +++ b/lib/widgets/auth/auth_header.dart @@ -1,7 +1,8 @@ -import 'package:doctor_app_flutter/lookups/auth_lookup.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import 'package:flutter_device_type/flutter_device_type.dart'; + +import '../../config/size_config.dart'; +import '../../lookups/auth_lookup.dart'; class AuthHeader extends StatelessWidget { var userType; @@ -9,119 +10,166 @@ class AuthHeader extends StatelessWidget { @override Widget build(BuildContext context) { - var smallScreenSize = 660; - return LayoutBuilder(builder: (ctx, constraints) { - bool isSmallScreen = constraints.maxWidth <= smallScreenSize; - var screen = Container( - margin: isSmallScreen - ? null - : EdgeInsetsDirectional.fromSTEB(constraints.maxWidth * 0.30, - constraints.maxWidth * 0.1, 0, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: isSmallScreen - ? EdgeInsetsDirectional.fromSTEB(0, 50, 0, 0) - : EdgeInsetsDirectional.fromSTEB( - constraints.maxWidth * 0.13, 0, 0, 0), - child: Image.asset( - 'assets/images/login_icon.png', - fit: BoxFit.cover, - height: - isSmallScreen ? null : constraints.maxWidth * 0.09, - ), - ), - SizedBox( - height: 10, - ), - Container( - margin: isSmallScreen - ? null - : EdgeInsetsDirectional.fromSTEB( - constraints.maxWidth * 0.13, 0, 0, 0), - child: Text( - "LOGIN", - style: TextStyle( - fontSize: - isSmallScreen ? 30 : constraints.maxWidth * 0.035, - fontWeight: FontWeight.w800), - ), - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: isSmallScreen - ? [ - SizedBox( - height: 10, - ), - buildWelText(isSmallScreen, constraints), - buildDrSulText(isSmallScreen, constraints, context), - ] - : [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - buildWelText(isSmallScreen, constraints), - buildDrSulText(isSmallScreen, constraints, context), - ], - ), - ], - ), - buildDrAppContainer(isSmallScreen, constraints, context) - ], - )); - return screen; - }); + var screen = Container( + margin: SizeConfig.isMobile + ? null + : EdgeInsetsDirectional.fromSTEB(SizeConfig.screenWidth * 0.30, + SizeConfig.screenWidth * 0.1, 0, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: SizeConfig.isMobile + ? EdgeInsetsDirectional.fromSTEB(0, 50, 0, 0) + : EdgeInsetsDirectional.fromSTEB( + SizeConfig.screenWidth * 0.13, 0, 0, 0), + child: buildImageLogo(), + ), + SizedBox( + height: 10, + ), + Container( + margin: SizeConfig.isMobile + ? null + : EdgeInsetsDirectional.fromSTEB( + SizeConfig.screenWidth * 0.13, 0, 0, 0), + child: buildTextUnderLogo(context), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: SizeConfig.isMobile + ? [ + SizedBox( + height: 10, + ), + buildWelText(), + buildDrSulText(context), + ] + : [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + buildWelText(), + buildDrSulText(context), + ], + ), + ], + ), + buildDrAppContainer(context) + ], + )); + return screen; + } + + Image buildImageLogo() { + String img = 'assets/images/login_icon.png'; + if (userType == loginType.unknownUser) { + img = 'assets/images/welcome_login_icon.png'; + } + + return Image.asset( + img, + fit: BoxFit.cover, + height: SizeConfig.isMobile ? null : SizeConfig.screenWidth * 0.09, + ); + } + + Widget buildTextUnderLogo(context) { + if (userType == loginType.knownUser || userType == loginType.unknownUser) { + return Text( + "LOGIN", + style: TextStyle( + fontSize: SizeConfig.isMobile ? 30 : SizeConfig.screenWidth * 0.035, + fontWeight: FontWeight.w800), + ); + } else { + String text1; + String text2; + if (userType == loginType.changePassword) { + text1 = 'Change'; + text2 = 'Password!'; + } + if (userType == loginType.verifyPassword) { + text1 = 'verify'; + text2 = 'Your Account!'; + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + text1, + style: TextStyle( + fontSize: + SizeConfig.isMobile ? 30 : SizeConfig.screenWidth * 0.035, + fontWeight: FontWeight.w800), + ), + Text( + text2, + style: TextStyle( + color: Theme.of(context).primaryColor, + fontSize: + SizeConfig.isMobile ? 30 : SizeConfig.screenWidth * 0.035, + fontWeight: FontWeight.w800), + ) + ], + ); + } } - Container buildDrAppContainer( - bool isSmallScreen, BoxConstraints constraints, BuildContext context) { + Container buildDrAppContainer(BuildContext context) { + if (userType == loginType.changePassword || userType == loginType.verifyPassword ) { + return Container(); + } return Container( - margin: isSmallScreen + margin: SizeConfig.isMobile ? null : EdgeInsetsDirectional.fromSTEB( - constraints.maxWidth * 0.13, 0, 0, 0), + SizeConfig.screenWidth * 0.13, 0, 0, 0), child: Text( "Doctor App", style: TextStyle( - fontSize: isSmallScreen ? 26 : constraints.maxWidth * 0.030, + fontSize: SizeConfig.isMobile ? 26 : SizeConfig.screenWidth * 0.030, fontWeight: FontWeight.w800, color: Theme.of(context).primaryColor), ), ); } - Text buildDrSulText( - bool isSmallScreen, BoxConstraints constraints, BuildContext context) { + Text buildDrSulText(BuildContext context) { + if (userType == loginType.changePassword || userType == loginType.verifyPassword ) { + return Text(''); + } return Text( 'Dr Sulaiman Al Habib', style: TextStyle( fontWeight: FontWeight.w800, - fontSize: isSmallScreen ? 24 : constraints.maxWidth * 0.029, + fontSize: SizeConfig.isMobile ? 24 : SizeConfig.screenWidth * 0.029, color: Theme.of(context).primaryColor, ), ); } - Text buildWelText(bool isSmallScreen, BoxConstraints constraints) { + Widget buildWelText() { String text = 'Welcome to '; if (userType == loginType.unknownUser) { text = 'Welcome Back to '; } - + if (userType == loginType.changePassword || userType == loginType.verifyPassword ) { + return Text(''); + } return Text( text, style: TextStyle( - fontSize: isSmallScreen ? 24 : constraints.maxWidth * 0.029), + fontSize: SizeConfig.isMobile ? 24 : SizeConfig.screenWidth * 0.029), ); } } diff --git a/lib/widgets/auth/change_password.dart b/lib/widgets/auth/change_password.dart new file mode 100644 index 00000000..5c231f6a --- /dev/null +++ b/lib/widgets/auth/change_password.dart @@ -0,0 +1,159 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class ChangePassword extends StatelessWidget { + final changePassFormKey = GlobalKey(); + var changePassFormValues = { + 'currentPass': null, + 'newPass': null, + 'repeatedPass': null + }; + + @override + Widget build(BuildContext context) { + return Form( + key: changePassFormKey, + child: Container( + width: SizeConfig.widthMultiplier * 90, + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: < + Widget>[ + buildSizedBox(), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + // ts/images/password_icon.png + prefixIcon: Image.asset('assets/images/password_icon.png'), + hintText: 'Current Password', + hintStyle: + TextStyle(fontSize: 2 * SizeConfig.textMultiplier), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + borderSide: BorderSide(color: Hexcolor('#CCCCCC')), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ) + //BorderRadius.all(Radius.circular(20)); + ), + validator: (value) { + if (value.isEmpty) { + return 'Please enter your Current Password'; + } + return null; + }, + onSaved: (value) { + // changePassFormValues. = value; + }, + ), + buildSizedBox(40), + // buildSizedBox(), + Text( + "New Password", + style: TextStyle( + fontSize: 2.8 * SizeConfig.textMultiplier, + fontWeight: FontWeight.w800), + ), + buildSizedBox(10.0), + // Text() + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + // ts/images/password_icon.png + prefixIcon: Image.asset('assets/images/password_icon.png'), + hintText: 'New Password', + hintStyle: + TextStyle(fontSize: 2 * SizeConfig.textMultiplier), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + borderSide: BorderSide(color: Hexcolor('#CCCCCC')), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ) + //BorderRadius.all(Radius.circular(20)); + ), + validator: (value) { + if (value.isEmpty) { + return 'Please enter your New Password'; + } + return null; + }, + onSaved: (value) { + // userInfo.UserID = value; + }, + ), + buildSizedBox(), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + prefixIcon: Image.asset('assets/images/password_icon.png'), + hintText: 'Repeat Password', + hintStyle: + TextStyle(fontSize: 2 * SizeConfig.textMultiplier), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + borderSide: BorderSide(color: Hexcolor('#CCCCCC')), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ) + //BorderRadius.all(Radius.circular(20)); + ), + validator: (value) { + if (value.isEmpty) { + return 'Please enter your Repeat Password'; + } + return null; + }, + onSaved: (value) { + // userInfo.UserID = value; + }, + ), + buildSizedBox(), + RaisedButton( + onPressed:changePass, + elevation: 0.0, + child: Container( + width: double.infinity, + height: 50, + child: Center( + child: Text( + 'Change Password' + .toUpperCase(), + // textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 2.5 * SizeConfig.textMultiplier), + ), + ), + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(width: 0.5, color: Hexcolor('#CCCCCC'))), + ), + SizedBox( + height: 10, + ), + ]))); + } + + SizedBox buildSizedBox([double height = 20]) { + return SizedBox( + height: height, + ); + } + changePass(){ + if(changePassFormKey.currentState.validate()){ + changePassFormKey.currentState.save(); + // call Api + } + } +} diff --git a/lib/widgets/auth/known_user_login.dart b/lib/widgets/auth/known_user_login.dart index c6b2b3c6..b39b9c1b 100644 --- a/lib/widgets/auth/known_user_login.dart +++ b/lib/widgets/auth/known_user_login.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:local_auth/error_codes.dart' as auth_error; import 'package:local_auth/local_auth.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../config/config.dart'; +import '../../config/size_config.dart'; import '../../providers/auth_provider.dart'; import '../../routes.dart'; import '../../util/dr_app_shared_pref.dart'; import '../../util/dr_app_toast_msg.dart'; import '../../widgets/shared/dr_app_circular_progress_Indeicator.dart'; -import 'package:local_auth/error_codes.dart' as auth_error; DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); DrAppToastMsg toastMsg = DrAppToastMsg(); @@ -88,85 +88,72 @@ class _KnownUserLoginState extends State { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } else { - return LayoutBuilder( - builder: (ctx, constraints) { - int maxSmallScreenSize = MAX_SMALL_SCREEN; - bool isSmallScreen = - constraints.maxWidth <= maxSmallScreenSize; - return Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Stack(children: [ - Container( - decoration: BoxDecoration( - border: Border.all( - color: Hexcolor('#CCCCCC'), - ), - borderRadius: BorderRadius.circular(50)), - margin: const EdgeInsets.fromLTRB(0, 20.0, 30, 0), - child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - height: 100, - width: 100, - decoration: new BoxDecoration( - // color: Colors.green, // border color - shape: BoxShape.circle, - border: Border.all( - color: Hexcolor('#CCCCCC'))), - child: CircleAvatar( - child: Image.asset( - 'assets/images/dr_avatar.png', - fit: BoxFit.cover, - ), - )), - Container( - margin: EdgeInsets.symmetric( - vertical: 3, horizontal: 15), - child: Column( - // mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - _loggedUser['List_MemberInformation'][0] - ['MemberName'], - style: TextStyle( - color: Hexcolor('515A5D'), - fontSize: isSmallScreen - ? 24 - : constraints.maxWidth * 0.029, - fontWeight: FontWeight.w800), - ), - Text( - 'ENT Spec', - style: TextStyle( - color: Hexcolor('515A5D'), - fontSize: isSmallScreen - ? 20 - : constraints.maxWidth * 0.025), - ) - ], - ), - ) - ], + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Stack(children: [ + Container( + decoration: BoxDecoration( + border: Border.all( + color: Hexcolor('#CCCCCC'), ), - ), - Positioned( - top: 7, - right: 70, - child: Image.asset( - 'assets/images/close_icon.png', - fit: BoxFit.cover, - )) - ]), - buildVerificationTypeImageContainer(), - buildButtonsContainer( - isSmallScreen, constraints, context) - ], - ); - }, + borderRadius: BorderRadius.circular(50)), + margin: const EdgeInsets.fromLTRB(0, 20.0, 30, 0), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + height: 100, + width: 100, + decoration: new BoxDecoration( + // color: Colors.green, // border color + shape: BoxShape.circle, + border: + Border.all(color: Hexcolor('#CCCCCC'))), + child: CircleAvatar( + child: Image.asset( + 'assets/images/dr_avatar.png', + fit: BoxFit.cover, + ), + )), + Container( + margin: EdgeInsets.symmetric( + vertical: 3, horizontal: 15), + child: Column( + // mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _loggedUser['List_MemberInformation'][0] + ['MemberName'], + style: TextStyle( + color: Hexcolor('515A5D'), + fontSize: 2.5 *SizeConfig.textMultiplier, + fontWeight: FontWeight.w800), + ), + Text( + 'ENT Spec', + style: TextStyle( + color: Hexcolor('515A5D'), + fontSize: 1.5 *SizeConfig.textMultiplier), + ) + ], + ), + ) + ], + ), + ), + Positioned( + top: 7, + right: 70, + child: Image.asset( + 'assets/images/close_icon.png', + fit: BoxFit.cover, + )) + ]), + buildVerificationTypeImageContainer(), + buildButtonsContainer(context) + ], ); } } @@ -187,8 +174,7 @@ class _KnownUserLoginState extends State { } // - Container buildButtonsContainer( - bool isSmallScreen, BoxConstraints constraints, BuildContext context) { + Container buildButtonsContainer(BuildContext context) { return Container( margin: EdgeInsetsDirectional.fromSTEB(0, 0, 30, 0), width: double.infinity, @@ -207,8 +193,7 @@ class _KnownUserLoginState extends State { // textAlign: TextAlign.center, style: TextStyle( color: Colors.white, - fontSize: - isSmallScreen ? 20 : constraints.maxWidth * 0.029), + fontSize: 2.5 *SizeConfig.textMultiplier), ), ), ), @@ -234,8 +219,7 @@ class _KnownUserLoginState extends State { "More verification Options".toUpperCase(), style: TextStyle( color: Theme.of(context).primaryColor, - fontSize: - isSmallScreen ? 20 : constraints.maxWidth * 0.029), + fontSize: 2.5 *SizeConfig.textMultiplier), )), ), SizedBox( diff --git a/lib/widgets/auth/login_form.dart b/lib/widgets/auth/login_form.dart index f746f609..de2bfdec 100644 --- a/lib/widgets/auth/login_form.dart +++ b/lib/widgets/auth/login_form.dart @@ -1,5 +1,3 @@ -import '../../providers/projects_provider.dart'; -import '../../util/dr_app_toast_msg.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; @@ -7,13 +5,16 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:imei_plugin/imei_plugin.dart'; import 'package:provider/provider.dart'; +import '../../config/size_config.dart'; import '../../models/user_model.dart'; import '../../providers/auth_provider.dart'; +import '../../providers/projects_provider.dart'; import '../../routes.dart'; import '../../util/dr_app_shared_pref.dart'; +import '../../util/dr_app_toast_msg.dart'; DrAppSharedPreferances sharedPref = DrAppSharedPreferances(); -DrAppToastMsg toastMsg = DrAppToastMsg(); +DrAppToastMsg toastMsg = DrAppToastMsg(); class LoginForm extends StatefulWidget with DrAppToastMsg { LoginForm({ @@ -53,27 +54,49 @@ class _LoginFormState extends State { } AuthProvider authProv = Provider.of(context); - return LayoutBuilder(builder: (ctx, constraints) { - var smallScreenSize = 660; - bool isSmallScreen = constraints.maxWidth <= smallScreenSize; - return Form( - key: loginFormKey, - child: Container( - width: constraints.maxWidth * 0.9, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 20, - ), - TextFormField( - keyboardType: TextInputType.number, + return Form( + key: loginFormKey, + child: Container( + width: SizeConfig.widthMultiplier * 90, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildSizedBox(), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + prefixIcon: Image.asset('assets/images/user_id_icon.png'), + hintText: 'Enter ID', + hintStyle: TextStyle(fontSize: 2 * SizeConfig.textMultiplier), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + borderSide: BorderSide(color: Hexcolor('#CCCCCC')), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ) + //BorderRadius.all(Radius.circular(20)); + ), + validator: (value) { + if (value.isEmpty) { + return 'Please enter your ID'; + } + return null; + }, + onSaved: (value) { + userInfo.UserID = value; + }, + ), + buildSizedBox(), + TextFormField( + obscureText: true, decoration: InputDecoration( - prefixIcon: Image.asset('assets/images/user_id_icon.png'), - hintText: 'Enter ID', - hintStyle: TextStyle( - fontSize: - isSmallScreen ? 14 : constraints.maxWidth * 0.024), + prefixIcon: Image.asset('assets/images/password_icon.png'), + hintText: 'Enter Password', + hintStyle: + TextStyle(fontSize: 2 * SizeConfig.textMultiplier), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(20)), borderSide: BorderSide(color: Hexcolor('#CCCCCC')), @@ -87,149 +110,113 @@ class _LoginFormState extends State { ), validator: (value) { if (value.isEmpty) { - return 'Please enter some text'; + return 'Please enter your Password'; } return null; }, onSaved: (value) { - userInfo.UserID = value; + userInfo.Password = value; + }), + buildSizedBox(), + DropdownButtonFormField( + value: userInfo.ProjectID, + isExpanded: false, + decoration: InputDecoration( + contentPadding: EdgeInsets.all(10), + isDense: true, + prefixIcon: Image.asset('assets/images/hospital_icon.png'), + // hintText: 'Enter Password', + hintStyle: + TextStyle(fontSize: 2 * SizeConfig.textMultiplier), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + borderSide: BorderSide(color: Hexcolor('#CCCCCC')), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ) + //BorderRadius.all(Radius.circular(20)); + ), + validator: (value) { + print(value); + if (value == null) { + return 'Please select your project'; + } + return null; }, - ), - SizedBox( - height: 20, - ), - TextFormField( - obscureText: true, - decoration: InputDecoration( - prefixIcon: - Image.asset('assets/images/password_icon.png'), - hintText: 'Enter Password', - hintStyle: TextStyle( - fontSize: isSmallScreen - ? 14 - : constraints.maxWidth * 0.024), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(20)), - borderSide: BorderSide(color: Hexcolor('#CCCCCC')), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0)), - borderSide: - BorderSide(color: Theme.of(context).primaryColor), - ) - //BorderRadius.all(Radius.circular(20)); - ), - validator: (value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - onSaved: (value) { - userInfo.Password = value; - }), - SizedBox( - height: 20, - ), - DropdownButtonFormField( - value: userInfo.ProjectID, - isExpanded: false, - decoration: InputDecoration( - contentPadding: EdgeInsets.all(10), - isDense: true, - prefixIcon: - Image.asset('assets/images/hospital_icon.png'), - // hintText: 'Enter Password', - hintStyle: TextStyle( - fontSize: isSmallScreen - ? 14 - : constraints.maxWidth * 0.024), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(20)), - borderSide: BorderSide(color: Hexcolor('#CCCCCC')), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0)), - borderSide: - BorderSide(color: Theme.of(context).primaryColor), - ) - //BorderRadius.all(Radius.circular(20)); - ), - validator: (value) { - print(value); - if (value == null) { - return 'Please enter some text'; - } - return null; - }, - items: projectsList.map((item) { - return DropdownMenuItem( - child: Text( - '${item['Desciption']}', - ), - value: item['ID'], - ); - }).toList(), - onChanged: (value) { + items: projectsList.map((item) { + return DropdownMenuItem( + child: Text( + '${item['Desciption']}', + ), + value: item['ID'], + ); + }).toList(), + onChanged: (value) { + print(value); + setState(() { userInfo.ProjectID = value; - }), - SizedBox( - height: 20, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( + }); + }), + buildSizedBox(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Checkbox( + value: true, + activeColor: Theme.of(context).primaryColor, + onChanged: (bool newValue) {}), + Text("Remember me", + style: TextStyle( + fontSize: 2 * SizeConfig.textMultiplier)), + ], + ), + ), + RaisedButton( + onPressed: () { + login(context, authProv); + }, + textColor: Colors.white, + elevation: 0.0, + padding: const EdgeInsets.all(0.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(width: 0.5, color: Hexcolor('#CCCCCC'))), + child: Container( + padding: const EdgeInsets.all(10.0), + height: 50, + width: SizeConfig.widthMultiplier * 30, child: Row( - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Checkbox( - value: true, - activeColor: Theme.of(context).primaryColor, - onChanged: (bool newValue) {}), - Text("Remember me", + Text('LOGIN', style: TextStyle( - fontSize: isSmallScreen - ? 18 - : constraints.maxWidth * 0.018)), + fontSize: SizeConfig.isMobilePortrait + ? 2.3 * SizeConfig.textMultiplier + : 2.3 * SizeConfig.textMultiplier)), + Image.asset('assets/images/login_btn_arrow_icon.png') ], ), ), - RaisedButton( - onPressed: () { - login(context, authProv); - }, - textColor: Colors.white, - elevation: 0.0, - padding: const EdgeInsets.all(0.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - side: - BorderSide(width: 0.5, color: Hexcolor('#CCCCCC'))), - child: Container( - padding: const EdgeInsets.all(10.0), - height: 50, - width: 140, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('LOG IN', - style: TextStyle( - fontSize: isSmallScreen - ? 20 - : constraints.maxWidth * 0.020)), - Image.asset('assets/images/login_btn_arrow_icon.png') - ], - ), - ), - ) - ], - ), - ], - ), + ) + ], + ), + ], ), - ); - }); + ), + ); + } + + SizedBox buildSizedBox() { + return SizedBox( + height: 20, + ); } login(context, AuthProvider authProv) { @@ -310,7 +297,7 @@ class _LoginFormState extends State { } Future setSharedPref(key, value) async { - sharedPref.setString(key, value).then(( success) { + sharedPref.setString(key, value).then((success) { print("sharedPref.setString" + success.toString()); }); } diff --git a/pubspec.lock b/pubspec.lock index 0549d83b..4c0717c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,7 +70,7 @@ packages: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" build_modules: dependency: transitive description: @@ -91,14 +91,14 @@ packages: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "4.5.2" + version: "5.0.0" build_web_compilers: dependency: "direct dev" description: @@ -281,7 +281,7 @@ packages: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "3.1.3" + version: "3.1.4" i18n: dependency: "direct main" description: @@ -386,7 +386,7 @@ packages: name: package_config url: "https://pub.dartlang.org" source: hosted - version: "1.9.1" + version: "1.9.3" package_resolver: dependency: transitive description: @@ -456,7 +456,7 @@ packages: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "1.4.3" + version: "1.4.4" pubspec_parse: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 47014e30..c0c6e878 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,6 +70,7 @@ flutter: - assets/images/verification_sms_lg_icon.png - assets/images/verification_whatsapp_lg_icon.png - assets/images/close_icon.png + - assets/images/welcome_login_icon.png # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see