diff --git a/lib/controllers/providers/settings/app_settings.dart b/lib/controllers/providers/settings/app_settings.dart index 65824cc7..c22e1788 100644 --- a/lib/controllers/providers/settings/app_settings.dart +++ b/lib/controllers/providers/settings/app_settings.dart @@ -2,5 +2,6 @@ class ASettings { static final String user = "user"; static final String host = "host"; static final String language = "language"; + static final String theme = "theme"; static final String speechToText = "speech_to_text"; } diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index a38b20c1..77b72a25 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -1,10 +1,11 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; +import 'package:test_sa/new_views/app_style/app_themes.dart'; import '../settings/app_settings.dart'; @@ -47,6 +48,15 @@ class SettingProvider extends ChangeNotifier { notifyListeners(); } + String _theme; + ThemeData get theme => _theme == "light" ? AppThemes.lightTheme : AppThemes.darkTheme; + Future setTheme(ThemeData themeData) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + _theme = themeData.brightness == Brightness.light ? "light" : "dark"; + prefs.setString(ASettings.theme, _theme); + notifyListeners(); + } + String _speechToText; String get speechToText => _speechToText; Future setSpeechToText(String currentLanguage) async { @@ -71,6 +81,12 @@ class SettingProvider extends ChangeNotifier { _language = 'en'; } + if (prefs.containsKey(ASettings.theme)) { + _theme = prefs.getString(ASettings.theme); + } else { + _theme = 'light'; + } + if (prefs.containsKey(ASettings.speechToText)) { _speechToText = prefs.getString(ASettings.speechToText); } else { diff --git a/lib/main.dart b/lib/main.dart index 3d7241b5..16bfe7dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,86 +5,28 @@ import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/departments_provider.dart'; -import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/providers/api/devices_provider.dart'; -import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; -import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/asset_transfer_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/pages/login.dart'; -import 'package:test_sa/views/pages/register.dart'; -import 'package:test_sa/views/pages/splash_screen.dart'; -import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; -import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; -import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; -import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/land_page.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; -import 'package:test_sa/views/pages/user/profile_page.dart'; -import 'package:test_sa/views/pages/user/report_issues_page.dart'; -import 'package:test_sa/views/pages/user/requests/create_request.dart'; -import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; -import 'package:test_sa/views/pages/user/requests/requests_page.dart'; -import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart'; -import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; -import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; -import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/new_views/app_style/app_themes.dart'; +import 'package:test_sa/new_views/pages/login_page.dart'; +import 'package:test_sa/new_views/pages/splash_page.dart'; -import 'controllers/providers/api/parts_provider.dart'; -import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; -import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/service_types_provider.dart'; -import 'controllers/providers/api/status_drop_down/report/vendor_provider.dart'; import 'controllers/providers/api/user_provider.dart'; import 'controllers/providers/settings/setting_provider.dart'; -import 'views/pages/device_transfer/request_device_transfer.dart'; -import 'views/pages/device_transfer/track_device_transfer.dart'; -import 'views/widgets/hospitals/single_hospital_picker.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); if (Platform.isIOS) { await Firebase.initializeApp( - options: - const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), + options: const FirebaseOptions( + apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", + appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", + messagingSenderId: "973582662416", + projectId: "atoms-fb912", + ), ); } else { await Firebase.initializeApp(); } - runApp(ChangeNotifierProvider( - create: (_) => SettingProvider(), - child: const MyApp(), - )); + runApp(ChangeNotifierProvider(create: (_) => SettingProvider(), child: const MyApp())); } class MyApp extends StatelessWidget { @@ -97,46 +39,6 @@ class MyApp extends StatelessWidget { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => UserProvider()), - ChangeNotifierProvider(create: (_) => HospitalsProvider()), - ChangeNotifierProvider(create: (_) => DevicesProvider()), - ChangeNotifierProvider(create: (_) => AssetTransferStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()), - ChangeNotifierProvider(create: (_) => DepartmentsProvider()), - ChangeNotifierProvider(create: (_) => NotificationsProvider()), - ChangeNotifierProvider(create: (_) => PreventiveMaintenanceVisitsProvider()), - ChangeNotifierProvider(create: (_) => RegularVisitsProvider()), - ChangeNotifierProvider(create: (_) => PartsProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportEquipmentStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()), - ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), - ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), - ChangeNotifierProvider(create: (_) => GasCylinderTypesProvider()), - ChangeNotifierProvider(create: (_) => GasStatusProvider()), - ChangeNotifierProvider(create: (_) => GasTypesProvider()), - ChangeNotifierProvider(create: (_) => GasRefillProvider()), - ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), - ChangeNotifierProvider(create: (_) => AssignedToProvider()), - ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), - ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), - ChangeNotifierProvider(create: (_) => PentryStatusProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestTypeProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()), - ChangeNotifierProvider(create: (_) => EngineersProvider()), - ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), - ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportRepairLocationProvider()), - ChangeNotifierProvider(create: (_) => ServiceRequestFaultDescriptionProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportVisitOperatorProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), - ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()), - ChangeNotifierProvider(create: (_) => VendorProvider()), ], child: GestureDetector( onTap: () { @@ -148,13 +50,7 @@ class MyApp extends StatelessWidget { child: MaterialApp( title: 'ATOMS', debugShowCheckedModeBanner: false, - theme: ThemeData( - fontFamily: "Poppins", - //canvasColor: AColors.primaryColor, - scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, - primaryColor: AColors.primaryColor, - indicatorColor: AColors.primaryColor, - colorScheme: const ColorScheme.light(primary: AColors.primaryColor, onPrimary: Colors.white, secondary: AColors.secondaryColor, onSecondary: Colors.white)), + theme: settingProvider.theme ?? AppThemes.lightTheme, localizationsDelegates: const [ // ... app-specific localization delegate[s] here AppLocalization.delegate, @@ -162,34 +58,12 @@ class MyApp extends StatelessWidget { GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], - supportedLocales: const [ - Locale('en'), - Locale('ar'), - ], + supportedLocales: const [Locale('en'), Locale('ar')], locale: Locale(settingProvider.language ?? 'en'), - initialRoute: SplashScreen.id, + initialRoute: SplashPage.routeName, routes: { - SplashScreen.id: (_) => const SplashScreen(), - LandPage.id: (_) => const LandPage(), - Login.id: (_) => Login(), - Register.id: (_) => Register(), - ProfilePage.id: (_) => ProfilePage(), - ReportIssuesPage.id: (_) => const ReportIssuesPage(), - RequestGasRefill.id: (_) => const RequestGasRefill(), - CreateRequestPage.id: (_) => const CreateRequestPage(), - SingleHospitalPicker.id: (_) => SingleHospitalPicker(), - SingleDevicePicker.id: (_) => SingleDevicePicker(), - SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), - ServiceRequestsPage.id: (_) => ServiceRequestsPage(), - NotificationsPage.id: (_) => NotificationsPage(), - FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(), - PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(), - RegularVisitsPage.id: (_) => RegularVisitsPage(), - TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), - RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), - TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), - SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), - CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(), + SplashPage.routeName: (_) => const SplashPage(), + LoginPage.routeName: (_) => const LoginPage(), }, ), ), diff --git a/lib/models/user.dart b/lib/models/user.dart index 4daa7964..4b755999 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -66,6 +66,8 @@ class User { this.accessFailedCount, }); + bool get isLiveToken => tokenlife != null && (DateTime.tryParse(tokenlife)?.isAfter(DateTime.now()) ?? false); + Future> toLoginJson() async { if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart new file mode 100644 index 00000000..47b5c6eb --- /dev/null +++ b/lib/new_views/app_style/app_color.dart @@ -0,0 +1,38 @@ +import 'dart:ui'; + +class AppColor { + AppColor._(); + //primary + static const Color primary30 = Color(0xffA2E2F8); + static const Color primary40 = Color(0xff75BDE0); + static const Color primary50 = Color(0xff4A8DB7); + static const Color primary60 = Color(0xff3B7097); + static const Color primary70 = Color(0xff163A51); + + //texts + static const Color neutral20 = Color(0xff767676); + static const Color neutral30 = Color(0xffEAF1F4); + static const Color neutral40 = Color(0xffE4E5E6); + static const Color neutral50 = Color(0xff3B3D4A); + static const Color neutral60 = Color(0xff2C2C31); + static const Color neutral70 = Color(0xff111427); + + //background + static const Color backgroundLight = Color(0xffF7F9FB); + static const Color backgroundDark = neutral50; + + //red + static const Color red40 = Color(0xffFFDBDC); + static const Color red50 = Color(0xffD02127); + static const Color red60 = Color(0xff8C050A); + + //green + static const Color green40 = Color(0xffBAFFE1); + static const Color green50 = Color(0xff62BE96); + static const Color green60 = Color(0xff065E38); + + //orange + static const Color orange40 = Color(0xffFFEDBC); + static const Color orange50 = Color(0xffCC9B14); + static const Color orange60 = Color(0xff886400); +} diff --git a/lib/new_views/app_style/app_themes.dart b/lib/new_views/app_style/app_themes.dart new file mode 100644 index 00000000..06488882 --- /dev/null +++ b/lib/new_views/app_style/app_themes.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class AppThemes { + AppThemes._(); + static final ThemeData _data = ThemeData( + fontFamily: "Poppins", + primaryColor: AppColor.primary50, + indicatorColor: AppColor.primary50, + ); + + static ThemeData lightTheme = _data.copyWith( + brightness: Brightness.light, + scaffoldBackgroundColor: AppColor.backgroundLight, + colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: Colors.white, secondary: Colors.white, onSecondary: AppColor.neutral70), + ); + + static ThemeData darkTheme = _data.copyWith( + brightness: Brightness.dark, + scaffoldBackgroundColor: AppColor.backgroundDark, + colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: AppColor.neutral60, secondary: AppColor.neutral60, onSecondary: Colors.white), + ); +} diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index e69de29b..4a9ae634 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class LoginPage extends StatelessWidget { + static const String routeName = "/login_page"; + const LoginPage({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset("assets/images/logo.png", height: 60), + Text( + "Login", + style: Theme.of(context).textTheme.displayMedium?.copyWith(color: AppColor.neutral50), + ), + Text( + "Enter you credential to login", + style: Theme.of(context).textTheme.titleLarge?.copyWith(color: AppColor.neutral20), + ), + ], + ), + ); + } +} diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index e69de29b..c6a976e4 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -0,0 +1,60 @@ +import 'dart:convert'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flare_flutter/flare_actor.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/notification/notification_manger.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/app_notification.dart'; +import 'package:test_sa/new_views/pages/login_page.dart'; + +class SplashPage extends StatefulWidget { + static const String routeName = '/splash_page'; + const SplashPage({Key key}) : super(key: key); + + @override + State createState() => _SplashPageState(); +} + +class _SplashPageState extends State { + SettingProvider _settingProvider; + UserProvider _userProvider; + + @override + void initState() { + Firebase.initializeApp(); + NotificationManger.initialisation((notificationDetails) { + AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); + if (notification.path == null || notification.path.isEmpty) return; + Navigator.pushNamed(context, notification.path, arguments: notification.requestId); + }, (id, title, body, payload) async {}); + super.initState(); + } + + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context, listen: false); + _userProvider = Provider.of(context, listen: false); + return Scaffold( + body: Center( + child: SizedBox( + width: MediaQuery.of(context).size.width / 1.1, + child: FlareActor( + "assets/rives/atoms_splash.flr", + fit: BoxFit.contain, + animation: "splash", + callback: (animation) async { + Navigator.of(context).pushNamed(LoginPage.routeName); + if (_settingProvider.isLoaded && (_settingProvider.user?.isLiveToken ?? false)) { + _userProvider.user = _settingProvider.user; + // TODO [zaid] : push to home page + } + }, + ), + ), + ), + ); + } +}