From c51d8621e60ec89d3153c707d7469b1cad18166f Mon Sep 17 00:00:00 2001 From: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:40:20 +0000 Subject: [PATCH 1/2] New Drawer --- ios/Runner.xcodeproj/project.pbxproj | 8 ++++---- lib/pages/home_page/home_page_widget.dart | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 1493dc01..76feb0df 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -44,8 +44,8 @@ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 6436409727A31CD800820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; - 6436409427A31CDB00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409C27A31CD200820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409D27A31CD100820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -225,8 +225,8 @@ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 6436409727A31CD800820AF7 /* pt */, - 6436409427A31CDB00820AF7 /* en */, + 6436409C27A31CD200820AF7 /* pt */, + 6436409D27A31CD100820AF7 /* en */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index d4f33260..8fa37905 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -171,18 +171,18 @@ class _HomePageWidgetState extends State { ), ), Expanded( - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Flexible( - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 5.9, 40.0, 0.0), + child: Container( + height: 30.0, + decoration: const BoxDecoration(), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Flexible( child: FlutterFlowIconButton( borderRadius: 100.0, borderWidth: 1.0, - buttonSize: 0.0, + buttonSize: 40.0, icon: Icon( Icons.close_sharp, color: FlutterFlowTheme.of(context) @@ -199,8 +199,8 @@ class _HomePageWidgetState extends State { }, ), ), - ), - ], + ], + ), ), ), ] From 3f0dc9a0343ed31425c14d4017b988f3493d5b70 Mon Sep 17 00:00:00 2001 From: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:48:09 +0000 Subject: [PATCH 2/2] add new FFAppStates --- ios/Runner.xcodeproj/project.pbxproj | 8 +- lib/actions/actions.dart | 4 + lib/app_state.dart | 193 +++++++++++++++--- lib/backend/schema/structs/action_struct.dart | 87 -------- lib/backend/schema/structs/index.dart | 1 - .../login_page/login_page_model.dart | 7 + pubspec.yaml | 8 + 7 files changed, 183 insertions(+), 125 deletions(-) delete mode 100644 lib/backend/schema/structs/action_struct.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 76feb0df..3aa7f1b9 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -44,8 +44,8 @@ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 6436409C27A31CD200820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; - 6436409D27A31CD100820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409327A31CD100820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409927A31CD000820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -225,8 +225,8 @@ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 6436409C27A31CD200820AF7 /* pt */, - 6436409D27A31CD100820AF7 /* en */, + 6436409327A31CD100820AF7 /* pt */, + 6436409927A31CD000820AF7 /* en */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart index 25b9688f..9f1e8d35 100644 --- a/lib/actions/actions.dart +++ b/lib/actions/actions.dart @@ -151,8 +151,12 @@ Future singInActionApp( }, ); + FFAppState().deleteEmail(); FFAppState().email = ''; + + FFAppState().deletePasswd(); FFAppState().passwd = ''; + FFAppState().update(() {}); } } else { diff --git a/lib/app_state.dart b/lib/app_state.dart index bd892705..956478e3 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:csv/csv.dart'; +import 'package:synchronized/synchronized.dart'; class FFAppState extends ChangeNotifier { static FFAppState _instance = FFAppState._internal(); @@ -15,36 +17,45 @@ class FFAppState extends ChangeNotifier { } Future initializePersistedState() async { - prefs = await SharedPreferences.getInstance(); - _safeInit(() { - _cliUUID = prefs.getString('ff_cliUUID') ?? _cliUUID; + secureStorage = const FlutterSecureStorage(); + await _safeInitAsync(() async { + _cliUUID = await secureStorage.getString('ff_cliUUID') ?? _cliUUID; }); - _safeInit(() { - _ownerUUID = prefs.getString('ff_ownerUUID') ?? _ownerUUID; + await _safeInitAsync(() async { + _ownerUUID = await secureStorage.getString('ff_ownerUUID') ?? _ownerUUID; }); - _safeInit(() { - _userUUID = prefs.getString('ff_userUUID') ?? _userUUID; + await _safeInitAsync(() async { + _userUUID = await secureStorage.getString('ff_userUUID') ?? _userUUID; }); - _safeInit(() { - _devUUID = prefs.getString('ff_devUUID') ?? _devUUID; + await _safeInitAsync(() async { + _devUUID = await secureStorage.getString('ff_devUUID') ?? _devUUID; }); - _safeInit(() { - _email = prefs.getString('ff_email') ?? _email; + await _safeInitAsync(() async { + _email = await secureStorage.getString('ff_email') ?? _email; }); - _safeInit(() { - _passwd = prefs.getString('ff_passwd') ?? _passwd; + await _safeInitAsync(() async { + _passwd = await secureStorage.getString('ff_passwd') ?? _passwd; }); - _safeInit(() { - _device = prefs.getString('ff_device') ?? _device; + await _safeInitAsync(() async { + _device = await secureStorage.getString('ff_device') ?? _device; }); - _safeInit(() { - _isLogged = prefs.getBool('ff_isLogged') ?? _isLogged; + await _safeInitAsync(() async { + _isLogged = await secureStorage.getBool('ff_isLogged') ?? _isLogged; }); - _safeInit(() { - _local = prefs.getString('ff_local') ?? _local; + await _safeInitAsync(() async { + _local = await secureStorage.getString('ff_local') ?? _local; }); - _safeInit(() { - _token = prefs.getString('ff_token') ?? _token; + await _safeInitAsync(() async { + _token = await secureStorage.getString('ff_token') ?? _token; + }); + await _safeInitAsync(() async { + _createdAt = await secureStorage.getString('ff_createdAt') ?? _createdAt; + }); + await _safeInitAsync(() async { + _updatedAt = await secureStorage.getString('ff_updatedAt') ?? _updatedAt; + }); + await _safeInitAsync(() async { + _status = await secureStorage.getString('ff_status') ?? _status; }); } @@ -53,76 +64,149 @@ class FFAppState extends ChangeNotifier { notifyListeners(); } - late SharedPreferences prefs; + late FlutterSecureStorage secureStorage; String _cliUUID = ''; String get cliUUID => _cliUUID; set cliUUID(String value) { _cliUUID = value; - prefs.setString('ff_cliUUID', value); + secureStorage.setString('ff_cliUUID', value); + } + + void deleteCliUUID() { + secureStorage.delete(key: 'ff_cliUUID'); } String _ownerUUID = ''; String get ownerUUID => _ownerUUID; set ownerUUID(String value) { _ownerUUID = value; - prefs.setString('ff_ownerUUID', value); + secureStorage.setString('ff_ownerUUID', value); + } + + void deleteOwnerUUID() { + secureStorage.delete(key: 'ff_ownerUUID'); } String _userUUID = ''; String get userUUID => _userUUID; set userUUID(String value) { _userUUID = value; - prefs.setString('ff_userUUID', value); + secureStorage.setString('ff_userUUID', value); + } + + void deleteUserUUID() { + secureStorage.delete(key: 'ff_userUUID'); } String _devUUID = ''; String get devUUID => _devUUID; set devUUID(String value) { _devUUID = value; - prefs.setString('ff_devUUID', value); + secureStorage.setString('ff_devUUID', value); + } + + void deleteDevUUID() { + secureStorage.delete(key: 'ff_devUUID'); } String _email = ''; String get email => _email; set email(String value) { _email = value; - prefs.setString('ff_email', value); + secureStorage.setString('ff_email', value); + } + + void deleteEmail() { + secureStorage.delete(key: 'ff_email'); } String _passwd = ''; String get passwd => _passwd; set passwd(String value) { _passwd = value; - prefs.setString('ff_passwd', value); + secureStorage.setString('ff_passwd', value); + } + + void deletePasswd() { + secureStorage.delete(key: 'ff_passwd'); } String _device = ''; String get device => _device; set device(String value) { _device = value; - prefs.setString('ff_device', value); + secureStorage.setString('ff_device', value); + } + + void deleteDevice() { + secureStorage.delete(key: 'ff_device'); } bool _isLogged = false; bool get isLogged => _isLogged; set isLogged(bool value) { _isLogged = value; - prefs.setBool('ff_isLogged', value); + secureStorage.setBool('ff_isLogged', value); + } + + void deleteIsLogged() { + secureStorage.delete(key: 'ff_isLogged'); } String _local = ''; String get local => _local; set local(String value) { _local = value; - prefs.setString('ff_local', value); + secureStorage.setString('ff_local', value); + } + + void deleteLocal() { + secureStorage.delete(key: 'ff_local'); } String _token = ''; String get token => _token; set token(String value) { _token = value; - prefs.setString('ff_token', value); + secureStorage.setString('ff_token', value); + } + + void deleteToken() { + secureStorage.delete(key: 'ff_token'); + } + + String _createdAt = ''; + String get createdAt => _createdAt; + set createdAt(String value) { + _createdAt = value; + secureStorage.setString('ff_createdAt', value); + } + + void deleteCreatedAt() { + secureStorage.delete(key: 'ff_createdAt'); + } + + String _updatedAt = ''; + String get updatedAt => _updatedAt; + set updatedAt(String value) { + _updatedAt = value; + secureStorage.setString('ff_updatedAt', value); + } + + void deleteUpdatedAt() { + secureStorage.delete(key: 'ff_updatedAt'); + } + + String _status = ''; + String get status => _status; + set status(String value) { + _status = value; + secureStorage.setString('ff_status', value); + } + + void deleteStatus() { + secureStorage.delete(key: 'ff_status'); } } @@ -137,3 +221,46 @@ Future _safeInitAsync(Function() initializeField) async { await initializeField(); } catch (_) {} } + +extension FlutterSecureStorageExtensions on FlutterSecureStorage { + static final _lock = Lock(); + + Future writeSync({required String key, String? value}) async => + await _lock.synchronized(() async { + await write(key: key, value: value); + }); + + void remove(String key) => delete(key: key); + + Future getString(String key) async => await read(key: key); + Future setString(String key, String value) async => + await writeSync(key: key, value: value); + + Future getBool(String key) async => (await read(key: key)) == 'true'; + Future setBool(String key, bool value) async => + await writeSync(key: key, value: value.toString()); + + Future getInt(String key) async => + int.tryParse(await read(key: key) ?? ''); + Future setInt(String key, int value) async => + await writeSync(key: key, value: value.toString()); + + Future getDouble(String key) async => + double.tryParse(await read(key: key) ?? ''); + Future setDouble(String key, double value) async => + await writeSync(key: key, value: value.toString()); + + Future?> getStringList(String key) async => + await read(key: key).then((result) { + if (result == null || result.isEmpty) { + return null; + } + return const CsvToListConverter() + .convert(result) + .first + .map((e) => e.toString()) + .toList(); + }); + Future setStringList(String key, List value) async => + await writeSync(key: key, value: const ListToCsvConverter().convert([value])); +} diff --git a/lib/backend/schema/structs/action_struct.dart b/lib/backend/schema/structs/action_struct.dart deleted file mode 100644 index 9d004d21..00000000 --- a/lib/backend/schema/structs/action_struct.dart +++ /dev/null @@ -1,87 +0,0 @@ -// ignore_for_file: unnecessary_getters_setters - -import '/backend/schema/util/schema_util.dart'; - -import 'index.dart'; -import '/flutter_flow/flutter_flow_util.dart'; - -class ActionStruct extends BaseStruct { - ActionStruct({ - String? title, - String? icon, - }) : _title = title, - _icon = icon; - - // "title" field. - String? _title; - String get title => _title ?? ''; - set title(String? val) => _title = val; - - bool hasTitle() => _title != null; - - // "icon" field. - String? _icon; - String get icon => _icon ?? ''; - set icon(String? val) => _icon = val; - - bool hasIcon() => _icon != null; - - static ActionStruct fromMap(Map data) => ActionStruct( - title: data['title'] as String?, - icon: data['icon'] as String?, - ); - - static ActionStruct? maybeFromMap(dynamic data) => - data is Map ? ActionStruct.fromMap(data.cast()) : null; - - Map toMap() => { - 'title': _title, - 'icon': _icon, - }.withoutNulls; - - @override - Map toSerializableMap() => { - 'title': serializeParam( - _title, - ParamType.String, - ), - 'icon': serializeParam( - _icon, - ParamType.String, - ), - }.withoutNulls; - - static ActionStruct fromSerializableMap(Map data) => - ActionStruct( - title: deserializeParam( - data['title'], - ParamType.String, - false, - ), - icon: deserializeParam( - data['icon'], - ParamType.String, - false, - ), - ); - - @override - String toString() => 'ActionStruct(${toMap()})'; - - @override - bool operator ==(Object other) { - return other is ActionStruct && title == other.title && icon == other.icon; - } - - @override - int get hashCode => const ListEquality().hash([title, icon]); -} - -ActionStruct createActionStruct({ - String? title, - String? icon, -}) => - ActionStruct( - title: title, - icon: icon, - ); diff --git a/lib/backend/schema/structs/index.dart b/lib/backend/schema/structs/index.dart index 0c01c05d..4affa264 100644 --- a/lib/backend/schema/structs/index.dart +++ b/lib/backend/schema/structs/index.dart @@ -1,4 +1,3 @@ export '/backend/schema/util/schema_util.dart'; -export 'action_struct.dart'; export 'device_struct.dart'; diff --git a/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart b/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart index df596b82..6d1e4434 100644 --- a/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart +++ b/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart @@ -101,12 +101,19 @@ class LoginPageModel extends FlutterFlowModel { }, ); + FFAppState().deleteEmail(); FFAppState().email = ''; + + FFAppState().deletePasswd(); FFAppState().passwd = ''; + FFAppState().update(() {}); } } else { + FFAppState().deleteEmail(); FFAppState().email = ''; + + FFAppState().deletePasswd(); FFAppState().passwd = ''; } } diff --git a/pubspec.yaml b/pubspec.yaml index 19887d02..9cd89217 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: cached_network_image: 3.3.1 collection: 1.18.0 crop_your_image: 1.0.0 + csv: 5.0.1 device_info_plus: 9.1.2 dropdown_button2: 2.3.9 easy_debounce: 2.0.1 @@ -37,6 +38,12 @@ dependencies: flutter_animate: 4.1.1+1 flutter_cache_manager: 3.3.1 flutter_plugin_android_lifecycle: 2.0.17 + flutter_secure_storage: 8.0.0 + flutter_secure_storage_linux: 1.2.0 + flutter_secure_storage_macos: 3.0.1 + flutter_secure_storage_platform_interface: 1.0.2 + flutter_secure_storage_web: 1.1.2 + flutter_secure_storage_windows: 2.1.1 flutter_spinkit: 5.2.0 flutter_staggered_grid_view: 0.7.0 flutter_svg: 2.0.9 @@ -66,6 +73,7 @@ dependencies: shared_preferences_platform_interface: 2.3.1 shared_preferences_web: 2.2.1 sqflite: 2.2.6 + synchronized: 3.1.0 timeago: 3.2.2 url_launcher: 6.2.5 url_launcher_android: 6.3.0