From 8e5d40ff2f659653c0e462293bf94f84b9a01b50 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Thu, 21 Nov 2024 16:15:14 -0300 Subject: [PATCH] WIP --- .../menu_component/menu_component_model.dart | 62 ++++++++----- lib/flutter_flow/nav/nav.dart | 5 -- lib/main.dart | 1 + .../about_property_model.dart | 19 ++-- lib/pages/home_page/home_page_model.dart | 88 +++++++++++-------- .../helpers/database/database_helper.dart | 12 ++- .../helpers/license/license_helper.dart | 40 +++++---- .../helpers/storage/keychain_storage.dart | 9 +- .../helpers/storage/secure_storage.dart | 3 + .../storage/shared_preferences_storage.dart | 3 + .../helpers/storage/storage_helper.dart | 15 ++-- .../services/deeplink/deep_link_service.dart | 2 +- 12 files changed, 159 insertions(+), 100 deletions(-) diff --git a/lib/components/organism_components/menu_component/menu_component_model.dart b/lib/components/organism_components/menu_component/menu_component_model.dart index 3aadf479..213ad4cf 100644 --- a/lib/components/organism_components/menu_component/menu_component_model.dart +++ b/lib/components/organism_components/menu_component/menu_component_model.dart @@ -27,19 +27,25 @@ class MenuComponentModel extends FlutterFlowModel { final bool expandable; final List menuOptions; - MenuComponentModel({required this.style, required this.item, required this.expandable, required this.menuOptions}); + MenuComponentModel( + {required this.style, + required this.item, + required this.expandable, + required this.menuOptions}); bool isGrid = false; late MenuListViewComponentModel menuListViewComponentModel; late MenuStaggeredViewComponentModel menuStaggeredViewComponentModel; late VoidCallback safeSetState; - late List menuEntries; + List menuEntries = []; @override void initState(BuildContext context) { - menuListViewComponentModel = createModel(context, () => MenuListViewComponentModel()); - menuStaggeredViewComponentModel = createModel(context, () => MenuStaggeredViewComponentModel()); + menuListViewComponentModel = + createModel(context, () => MenuListViewComponentModel()); + menuStaggeredViewComponentModel = + createModel(context, () => MenuStaggeredViewComponentModel()); } @override @@ -48,27 +54,32 @@ class MenuComponentModel extends FlutterFlowModel { menuStaggeredViewComponentModel.dispose(); } - Future> generateMenuEntries(BuildContext context, MenuItem item, List options) async { + Future> generateMenuEntries( + BuildContext context, MenuItem item, List options) async { List entries = []; - Future addMenuEntry(IconData icon, String enText, String ptText, Function() action) async { + Future addMenuEntry( + IconData icon, String enText, String ptText, Function() action) async { entries.add( item == MenuItem.button ? MenuButtonWidget( icon: icon, action: action, - title: FFLocalizations.of(context).getVariableText(enText: enText, ptText: ptText), + title: FFLocalizations.of(context) + .getVariableText(enText: enText, ptText: ptText), safeSetState: safeSetState) : item == MenuItem.card ? MenuCardItem( icon: icon, action: action, - title: FFLocalizations.of(context).getVariableText(enText: enText, ptText: ptText), + title: FFLocalizations.of(context) + .getVariableText(enText: enText, ptText: ptText), safeSetState: safeSetState) : item == MenuItem.tile ? MenuCardItem( icon: icon, action: action, - title: FFLocalizations.of(context).getVariableText(enText: enText, ptText: ptText), + title: FFLocalizations.of(context) + .getVariableText(enText: enText, ptText: ptText), safeSetState: safeSetState) : null, ); @@ -80,15 +91,18 @@ class MenuComponentModel extends FlutterFlowModel { log('Module: ${opt.value} - License: $v'); switch (v) { case 'VISIVEL': - addMenuEntry(Icons.engineering_outlined, 'Schedule Providers', 'Agendar Prestadores', () async { + addMenuEntry(Icons.engineering_outlined, 'Schedule Providers', + 'Agendar Prestadores', () async { await open(context, '/provisionalSchedule'); }); break; - case 'INVISIVEL': + case 'BLOQUEADO': DialogUnavailable.unavailableFeature(context); break; - default: + case 'INVISIVEL': break; + default: + throw Exception('Invalid license value'); } safeSetState(); } @@ -118,11 +132,13 @@ class MenuComponentModel extends FlutterFlowModel { ptText: 'Tem certeza que deseja sair?', enText: 'Are you sure you want to logout?', ); - showAlertDialog(context, title, content, () async => await AuthenticationService.signOut(context)); + showAlertDialog(context, title, content, + () async => await AuthenticationService.signOut(context)); } Future openDeliverySchedule(BuildContext context) async { - final bool isProvisional = await StorageHelper().g(KeychainStorageKey.provisional.value) == 'true'; + final bool isProvisional = + await StorageHelper().g(KeychainStorageKey.provisional.value) == 'true'; if (isProvisional == true) { context.push( '/deliverySchedule', @@ -140,7 +156,8 @@ class MenuComponentModel extends FlutterFlowModel { } Future openProvisionalSchedule(BuildContext context) async { - final isProvisional = await StorageHelper().g(KeychainStorageKey.provisional.value) == 'true'; + final isProvisional = + await StorageHelper().g(KeychainStorageKey.provisional.value) == 'true'; if (isProvisional == true) { context.push( '/provisionalSchedule', @@ -158,7 +175,8 @@ class MenuComponentModel extends FlutterFlowModel { } Future openFastPassSchedule(BuildContext context) async { - final isWpp = await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; + final isWpp = + await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; if (isWpp) { context.push( '/fastPassPage', @@ -250,7 +268,8 @@ class MenuComponentModel extends FlutterFlowModel { ptText: 'Tem certeza que deseja sair?', enText: 'Are you sure you want to logout?', ); - showAlertDialog(context, title, content, () async => await AuthenticationService.signOut(context)); + showAlertDialog(context, title, content, + () async => await AuthenticationService.signOut(context)); } Future openPreferencesSettings(BuildContext context) async { @@ -267,7 +286,8 @@ class MenuComponentModel extends FlutterFlowModel { } Future openMyOrders(BuildContext context) async { - final isWpp = await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; + final isWpp = + await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; ; if (isWpp) { context.push( @@ -286,7 +306,8 @@ class MenuComponentModel extends FlutterFlowModel { } Future openReservations(BuildContext context) async { - final isWpp = await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; + final isWpp = + await StorageHelper().g(KeychainStorageKey.whatsapp.value) == 'true'; ; if (isWpp) { context.push( @@ -403,7 +424,8 @@ class MenuComponentModel extends FlutterFlowModel { } Future openPetsRegister(BuildContext context) async { - bool isPet = await StorageHelper().g(KeychainStorageKey.pets.value) == 'true'; + bool isPet = + await StorageHelper().g(KeychainStorageKey.pets.value) == 'true'; ; if (isPet) { context.push( diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index 994467d0..6ff6dd73 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -148,11 +148,6 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { name: 'vehiclesOnThePropertyPage', path: '/vehiclesOnThePropertyPage', builder: (context, params) => const VehicleOnTheProperty()), - FFRoute( - name: 'homePage', - path: '/homePage', - builder: (context, params) => HomePageWidget(key: UniqueKey()), - ), FFRoute( name: 'receptionPage', path: '/receptionPage', diff --git a/lib/main.dart b/lib/main.dart index 143bc33c..0bcabe17 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,6 +16,7 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/shared/helpers/database/database_helper.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/services/deeplink/deep_link_service.dart'; diff --git a/lib/pages/about_property_page/about_property_model.dart b/lib/pages/about_property_page/about_property_model.dart index 4bd5e867..df559059 100644 --- a/lib/pages/about_property_page/about_property_model.dart +++ b/lib/pages/about_property_page/about_property_model.dart @@ -6,6 +6,7 @@ import 'package:hub/components/organism_components/menu_component/menu_component import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/pages/about_property_page/about_property_screen.dart'; +import 'package:hub/shared/helpers/license/license_helper.dart'; class AboutPropertyModel extends FlutterFlowModel { dynamic item; @@ -22,13 +23,17 @@ class AboutPropertyModel extends FlutterFlowModel { void initState(BuildContext context) { menuComponentModel = createModel( context, - () => MenuComponentModel(expandable: true, style: MenuView.list_grid, item: MenuItem.button, menuOptions: [ - MenuOption.PetsOnTheProperty, - MenuOption.ResidentsOnTheProperty, - MenuOption.VisitsOnTheProperty, - MenuOption.VehiclesOnTheProperty, - MenuOption.PackagesOnTheProperty, - ])); + () => MenuComponentModel( + expandable: true, + style: MenuView.list_grid, + item: MenuItem.button, + menuOptions: [ + Module.pets, + Module.residents, + Module.openedVisits, + Module.vehicles, + Module.orders, + ])); initAsync(); } diff --git a/lib/pages/home_page/home_page_model.dart b/lib/pages/home_page/home_page_model.dart index db3eb7e1..e68faf34 100644 --- a/lib/pages/home_page/home_page_model.dart +++ b/lib/pages/home_page/home_page_model.dart @@ -6,10 +6,10 @@ import 'package:hub/components/organism_components/menu_component/menu_component import 'package:hub/components/organism_components/message_well_component/message_well_component_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/pages/home_page/home_page_widget.dart'; +import 'package:hub/shared/helpers/license/license_helper.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart'; - class HomePageModel extends FlutterFlowModel { HomePageModel({required this.safeSetState}); late final VoidCallback safeSetState; @@ -32,54 +32,64 @@ class HomePageModel extends FlutterFlowModel { Future _initVariable() async { devUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value)) ?? ''; - userUUID = (await StorageHelper().g(KeychainStorageKey.userUUID.value)) ?? ''; - cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; - userName = (await StorageHelper().g(KeychainStorageKey.userName.value)) ?? ''; + userUUID = + (await StorageHelper().g(KeychainStorageKey.userUUID.value)) ?? ''; + cliUUID = + (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; + userName = + (await StorageHelper().g(KeychainStorageKey.userName.value)) ?? ''; userEmail = (await StorageHelper().g(SecureStorageKey.email.value)) ?? ''; } @override void initState(BuildContext context) { _initVariable(); - localComponentModel = createModel(context, () => LocalProfileComponentModel()); + localComponentModel = + createModel(context, () => LocalProfileComponentModel()); homeMenuComponentModel = createModel( context, - () => MenuComponentModel(expandable: true, style: MenuView.list_grid, item: MenuItem.button, menuOptions: [ - MenuOption.SettingsOnTheApp, - MenuOption.MessagesOnTheProperty, - MenuOption.AccessOnTheProperty, - MenuOption.PetsRegister, - MenuOption.VisitorsRegister, - MenuOption.ReservationsOnTheLocal, - MenuOption.PackagesOnTheProperty, - MenuOption.DeliverySchedule, - MenuOption.WorkersOnTheProperty, - MenuOption.AboutProperty, - MenuOption.CompleteSchedule, - MenuOption.FastPassSchedule, - MenuOption.LiberationsOnTheProperty, - MenuOption.QRCodeAccessInProperty, - ])); + () => MenuComponentModel( + expandable: true, + style: MenuView.list_grid, + item: MenuItem.button, + menuOptions: [ + Module.messages, + Module.access, + Module.pets, + Module.openedVisits, + Module.reservations, + Module.orders, + Module.providerSchedule, + Module.deliverySchedule, + Module.completeSchedule, + Module.fastPass, + Module.liberations, + Module.qrCode, + Module.settings, + ])); drawerMenuComponentModel = createModel( context, - () => MenuComponentModel(expandable: false, style: MenuView.list, item: MenuItem.tile, menuOptions: [ - MenuOption.SettingsOnTheApp, - MenuOption.MessagesOnTheProperty, - MenuOption.AccessOnTheProperty, - MenuOption.PetsRegister, - MenuOption.VisitorsRegister, - MenuOption.ReservationsOnTheLocal, - MenuOption.PackagesOnTheProperty, - MenuOption.DeliverySchedule, - MenuOption.WorkersOnTheProperty, - MenuOption.AboutProperty, - MenuOption.CompleteSchedule, - MenuOption.FastPassSchedule, - MenuOption.LiberationsOnTheProperty, - MenuOption.QRCodeAccessInProperty, - MenuOption.LogoutOnTheApp, - ])); - messageWellComponentModel = createModel(context, () => MessageWellComponentModel()); + () => MenuComponentModel( + expandable: false, + style: MenuView.list, + item: MenuItem.tile, + menuOptions: [ + Module.messages, + Module.access, + Module.pets, + Module.openedVisits, + Module.reservations, + Module.orders, + Module.providerSchedule, + Module.deliverySchedule, + Module.completeSchedule, + Module.fastPass, + Module.liberations, + Module.qrCode, + Module.logout, + ])); + messageWellComponentModel = + createModel(context, () => MessageWellComponentModel()); } @override diff --git a/lib/shared/helpers/database/database_helper.dart b/lib/shared/helpers/database/database_helper.dart index 8163308b..0166e34c 100644 --- a/lib/shared/helpers/database/database_helper.dart +++ b/lib/shared/helpers/database/database_helper.dart @@ -21,8 +21,10 @@ class DatabaseStorage { return _database!; } + bool isInitialized = false; + Future init() async { - if (_database != null) return; + if (isInitialized) return; _database = await openDatabase( join(await getDatabasesPath(), _dbName), version: _dbVersion, @@ -31,6 +33,7 @@ class DatabaseStorage { onDowngrade: _onDowngrade, ); await LicenseService.setupLicense(database); + isInitialized = true; } Future _onCreate(Database database, int version) async { @@ -39,13 +42,14 @@ class DatabaseStorage { await database.execute(LicenseHelper.createTableQuery); } - Future _onUpgrade(Database database, int oldVersion, int newVersion) async { + Future _onUpgrade( + Database database, int oldVersion, int newVersion) async { log('Upgrading database from version $oldVersion to $newVersion...'); if (oldVersion < 2) { await database.execute(LicenseHelper.createTableQuery); - await LicenseService.setupLicense(database); } } - Future _onDowngrade(Database database, int oldVersion, int newVersion) async {} + Future _onDowngrade( + Database database, int oldVersion, int newVersion) async {} } diff --git a/lib/shared/helpers/license/license_helper.dart b/lib/shared/helpers/license/license_helper.dart index ab47f094..7c55abcd 100644 --- a/lib/shared/helpers/license/license_helper.dart +++ b/lib/shared/helpers/license/license_helper.dart @@ -77,6 +77,9 @@ enum Module { providerSchedule, deliverySchedule, fastPass, + qrCode, + settings, + logout, } extension LicenseKeyExtension on Module { @@ -116,31 +119,31 @@ extension LicenseKeyExtension on Module { String get route { switch (this) { case Module.messages: - return '/messages'; + return '/messageHistoryPage'; case Module.liberations: - return '/liberations'; + return '/liberationHistory'; case Module.reservations: - return '/reservations'; + return '/reservation'; case Module.access: - return '/access'; + return '/acessHistoryPage'; case Module.openedVisits: - return '/opened-visits'; + return '/visitsOnTheProperty'; case Module.vehicles: - return '/vehicles'; + return '/vehiclesOnThePropertyPage'; case Module.residents: - return '/residents'; + return '/peopleOnThePropertyPage'; case Module.pets: - return '/pets'; + return '/petsPage'; case Module.orders: - return '/orders'; + return '/packageOrder'; case Module.completeSchedule: - return '/complete-schedule'; + return '/scheduleCompleteVisitPage'; case Module.providerSchedule: - return '/provider-schedule'; + return '/provisionalSchedule'; case Module.deliverySchedule: - return '/delivery-schedule'; + return '/deliverySchedule'; case Module.fastPass: - return '/fast-pass'; + return '/fastPassPage'; default: return ''; } @@ -170,7 +173,8 @@ class LicenseHelper { await DatabaseStorage.instance.init(); } - static Future insertLicenseFoo(final List key, final String display) async { + static Future insertLicenseFoo( + final List key, final String display) async { for (var element in key) { DatabaseStorage.database.insert( tableLicense, @@ -187,11 +191,12 @@ class LicenseHelper { } Future g(String key) async { - var response = await DatabaseStorage.database.query(tableLicense, where: 'key = ?', whereArgs: [key]); + var response = await DatabaseStorage.database.query(tableLicense, + where: 'key = ?', whereArgs: [key], columns: ['display']); if (response.isEmpty) { return null; } - return response.first['value'].toString(); + return response.first['display'].toString(); } Future s(String key, T value) async { @@ -211,7 +216,8 @@ class LicenseHelper { } Future d(String key) async { - await DatabaseStorage.database.delete(tableLicense, where: 'key = ?', whereArgs: [key]); + await DatabaseStorage.database + .delete(tableLicense, where: 'key = ?', whereArgs: [key]); } Future c() async { diff --git a/lib/shared/helpers/storage/keychain_storage.dart b/lib/shared/helpers/storage/keychain_storage.dart index c14aa6b5..e7116864 100644 --- a/lib/shared/helpers/storage/keychain_storage.dart +++ b/lib/shared/helpers/storage/keychain_storage.dart @@ -8,6 +8,7 @@ class KeychainHelper implements BaseStorage { static final KeychainHelper instance = KeychainHelper._(); static const String tableKeychain = 'keychain'; + bool _isInitialized = false; static String get createTableQuery => ''' CREATE TABLE $tableKeychain ( @@ -22,12 +23,15 @@ class KeychainHelper implements BaseStorage { @override Future init() async { + if (_isInitialized) return; await DatabaseStorage.instance.init(); + _isInitialized = true; } @override Future get(String key) async { - var response = await DatabaseStorage.database.query(tableKeychain, where: 'key = ?', whereArgs: [key]); + var response = await DatabaseStorage.database + .query(tableKeychain, where: 'key = ?', whereArgs: [key]); if (response.isEmpty) { return null; } @@ -52,7 +56,8 @@ class KeychainHelper implements BaseStorage { @override Future delete(String key) async { - await DatabaseStorage.database.delete(tableKeychain, where: 'key = ?', whereArgs: [key]); + await DatabaseStorage.database + .delete(tableKeychain, where: 'key = ?', whereArgs: [key]); } @override diff --git a/lib/shared/helpers/storage/secure_storage.dart b/lib/shared/helpers/storage/secure_storage.dart index 1d40ee71..59125aa2 100644 --- a/lib/shared/helpers/storage/secure_storage.dart +++ b/lib/shared/helpers/storage/secure_storage.dart @@ -7,10 +7,13 @@ class SecureStorage implements BaseStorage { static final SecureStorage instance = SecureStorage._(); late final FlutterSecureStorage _secureStorage; + bool _isInitialized = false; @override Future init() async { + if (_isInitialized) return; _secureStorage = const FlutterSecureStorage(); + _isInitialized = true; } @override diff --git a/lib/shared/helpers/storage/shared_preferences_storage.dart b/lib/shared/helpers/storage/shared_preferences_storage.dart index 3cc38a6e..a2561e2a 100644 --- a/lib/shared/helpers/storage/shared_preferences_storage.dart +++ b/lib/shared/helpers/storage/shared_preferences_storage.dart @@ -7,10 +7,13 @@ class SharedPreferencesStorage implements BaseStorage { static final SharedPreferencesStorage instance = SharedPreferencesStorage._(); late final SharedPreferences _prefs; + bool _isInitialized = false; @override Future init() async { + if (_isInitialized) return; _prefs = await SharedPreferences.getInstance(); + _isInitialized = true; } @override diff --git a/lib/shared/helpers/storage/storage_helper.dart b/lib/shared/helpers/storage/storage_helper.dart index 3e97ddf5..f5536d4b 100644 --- a/lib/shared/helpers/storage/storage_helper.dart +++ b/lib/shared/helpers/storage/storage_helper.dart @@ -10,10 +10,10 @@ class StorageHelper { StorageHelper._internal(); late BuildContext? _context; - late bool _isRecovered = false; BuildContext? get context => _context; set context(BuildContext? context) => _context = context; + late bool _isRecovered = false; bool get isRecovered => _isRecovered; set isRecovered(bool isRecovered) => _isRecovered = isRecovered; @@ -22,10 +22,12 @@ class StorageHelper { await SharedPreferencesStorage.instance.init(); await KeychainHelper.instance.init(); - String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value); + String? isFirstRun = await SharedPreferencesStorage.instance + .get(SharedPreferencesKey.isFirstRun.value); - if (isFirstRun == 'true') { - await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, false); + if (isFirstRun != 'false') { + await SharedPreferencesStorage.instance + .set(SharedPreferencesKey.isFirstRun.value, false); await SecureStorage.instance.set(SecureStorageKey.isLogged.value, false); } } @@ -44,7 +46,10 @@ class StorageHelper { static BaseStorage getInstanceByKey(String key) { if (SecureStorageKey.values.map((e) => e.value).toList().contains(key)) { return SecureStorage.instance; - } else if (SharedPreferencesKey.values.map((e) => e.value).toList().contains(key)) { + } else if (SharedPreferencesKey.values + .map((e) => e.value) + .toList() + .contains(key)) { return SharedPreferencesStorage.instance; } else { return KeychainHelper.instance; diff --git a/lib/shared/services/deeplink/deep_link_service.dart b/lib/shared/services/deeplink/deep_link_service.dart index 76715219..42cf083d 100644 --- a/lib/shared/services/deeplink/deep_link_service.dart +++ b/lib/shared/services/deeplink/deep_link_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart'; -import 'package:hub/shared/helpers/storage_helper.dart'; +import 'package:hub/shared/helpers/storage/storage_helper.dart'; class DeepLinkService { static final DeepLinkService _instance = DeepLinkService._internal();