diff --git a/devtools_options.yaml b/devtools_options.yaml index fa0b357c..2bc8e05f 100644 --- a/devtools_options.yaml +++ b/devtools_options.yaml @@ -1,3 +1,4 @@ description: This file stores settings for Dart & Flutter DevTools. documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states extensions: + - provider: true \ No newline at end of file diff --git a/lib/features/home/presentation/pages/home_page.dart b/lib/features/home/presentation/pages/home_page.dart index dd567508..a31df8ef 100644 --- a/lib/features/home/presentation/pages/home_page.dart +++ b/lib/features/home/presentation/pages/home_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hub/backend/notifications/firebase_messaging_service.dart'; import 'package:hub/features/home/index.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; @@ -12,6 +13,9 @@ import 'package:hub/shared/components/molecules/drawer/index.dart'; import 'package:hub/shared/components/molecules/locals/index.dart'; import 'package:hub/shared/components/molecules/menu/index.dart'; import 'package:hub/shared/components/molecules/modules/index.dart'; +import 'package:hub/shared/helpers/storage/base_storage.dart'; +import 'package:hub/shared/extensions/string_extensions.dart'; +import 'package:hub/shared/helpers/storage/storage_helper.dart'; class HomePageWidget extends StatefulWidget { const HomePageWidget({ @@ -24,12 +28,13 @@ class HomePageWidget extends StatefulWidget { State createState() => _HomePageWidgetState(); } -class _HomePageWidgetState extends State { +class _HomePageWidgetState extends State with WidgetsBindingObserver { final scaffoldKey = GlobalKey(); @override void initState() { super.initState(); + WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addPostFrameCallback((_) async { if (widget.update != null) { await widget.update!(context); @@ -37,6 +42,41 @@ class _HomePageWidgetState extends State { }); } + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) async { + Future execute() async { + final isLogged = await StorageHelper().get(SecureStorageKey.isLogged.value); + log('isLogged: $isLogged'); + if (isLogged.toBoolean()) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + await LocalsRepositoryImpl().update(context); + await FirebaseMessagingService().updateDeviceToken(); + }); + } + } + if (state == AppLifecycleState.detached) { + print('AppLifecycleState.detached'); + } + if (state == AppLifecycleState.resumed) { + print('AppLifecycleState.resumed'); + } + if (state == AppLifecycleState.inactive) { + print('AppLifecycleState.inactive'); + } + if (state == AppLifecycleState.paused) { + print('AppLifecycleState.paused'); + } + if (state == AppLifecycleState.hidden) { + print('AppLifecycleState.hidden'); + } + } + @override Widget build(BuildContext context) { diff --git a/lib/main.dart b/lib/main.dart index 220796a2..8ba07637 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -60,7 +60,7 @@ class App extends StatefulWidget { static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!; } -class _AppState extends State with WidgetsBindingObserver { +class _AppState extends State { Locale? _locale = FFLocalizations.getStoredLocale(); ThemeMode _themeMode = FlutterFlowTheme.themeMode; late AppStateNotifier _appStateNotifier; @@ -169,7 +169,7 @@ class _AppState extends State with WidgetsBindingObserver { @override void initState() { super.initState(); - WidgetsBinding.instance.addObserver(this); + FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); _appStateNotifier = AppStateNotifier.instance; @@ -185,23 +185,9 @@ class _AppState extends State with WidgetsBindingObserver { @override void dispose() { - WidgetsBinding.instance.removeObserver(this); super.dispose(); } - @override - void didChangeAppLifecycleState(AppLifecycleState state) async { - if (state == AppLifecycleState.detached) { - final isLogged = await StorageHelper().get(SecureStorageKey.isLogged.value); - log('isLogged: $isLogged'); - if (isLogged.toBoolean()) { - LocalsRepositoryImpl.license.add(false); - final response = await LocalsRepositoryImpl().update(context); - LocalsRepositoryImpl.license.add(response); - await FirebaseMessagingService().updateDeviceToken(); - } - } - } @override Widget build(BuildContext context) { diff --git a/lib/shared/components/molecules/locals/data/data_sources/locals_local_data_source.dart b/lib/shared/components/molecules/locals/data/data_sources/locals_local_data_source.dart index 47f65ad7..e8718025 100644 --- a/lib/shared/components/molecules/locals/data/data_sources/locals_local_data_source.dart +++ b/lib/shared/components/molecules/locals/data/data_sources/locals_local_data_source.dart @@ -1,3 +1,18 @@ -abstract class LocalsLocalDataSource {} +import 'package:hub/shared/helpers/storage/base_storage.dart'; +import 'package:hub/shared/helpers/storage/storage_helper.dart'; -class LocalsLocalDataSourceImpl {} +abstract class LocalsLocalDataSource { + Future unlinkLocal(); +} + +class LocalsLocalDataSourceImpl { + + Future unlinkLocal() async { + await StorageHelper().set(KeychainStorageKey.clientUUID.value, ''); + await StorageHelper().set(KeychainStorageKey.ownerName.value, ''); + await StorageHelper().set(KeychainStorageKey.ownerUUID.value, ''); + await StorageHelper().set(KeychainStorageKey.clientName.value, ''); + await StorageHelper().set(KeychainStorageKey.ownerName.value, ''); + } + +} diff --git a/lib/shared/components/molecules/locals/data/repositories/locals_repository_impl.dart b/lib/shared/components/molecules/locals/data/repositories/locals_repository_impl.dart index dd426587..97c254c3 100644 --- a/lib/shared/components/molecules/locals/data/repositories/locals_repository_impl.dart +++ b/lib/shared/components/molecules/locals/data/repositories/locals_repository_impl.dart @@ -12,6 +12,7 @@ import 'package:rxdart/rxdart.dart'; class LocalsRepositoryImpl implements LocalsRepository { final LocalsRemoteDataSource remoteDataSource = LocalsRemoteDataSourceImpl(); + final LocalsLocalDataSourceImpl localDataSource = LocalsLocalDataSourceImpl(); static final license = BehaviorSubject(); static get stream => license.stream; @@ -23,19 +24,30 @@ class LocalsRepositoryImpl implements LocalsRepository { @override Future update(BuildContext context) async { + LocalsRepositoryImpl.license.add(false); + final bool response = await _handleReponse(context); + LocalsRepositoryImpl.license.add(response); + return response; + } + + Future select(BuildContext context) async { + await localDataSource.unlinkLocal(); + await update(context); + } + + Future _handleReponse(BuildContext context) async { bool response = false; - try { - while (!response) { + while (!response) { + try { response = await remoteDataSource.processLocals(context); if (!response) { await _handleUpdateError(context); } - } - await _notifyBlocs(context); - } catch (e) { - log('Error updating locals: $e'); - await _handleUpdateError(context); - } + } catch (e , s) { + log('Error updating locals: $e', stackTrace: s); + await _handleUpdateError(context); + } + } return response; } @@ -46,10 +58,10 @@ class LocalsRepositoryImpl implements LocalsRepository { } Future _notifyBlocs(BuildContext context) async { - LocalsRepositoryImpl.license.add(false); + context.read().add(LocalProfileEvent()); context.read().add(MenuEvent()); - LocalsRepositoryImpl.license.add(true); + } @override diff --git a/lib/shared/components/molecules/locals/presentation/blocs/local_profile_bloc.dart b/lib/shared/components/molecules/locals/presentation/blocs/local_profile_bloc.dart index e05375c5..d19459a1 100644 --- a/lib/shared/components/molecules/locals/presentation/blocs/local_profile_bloc.dart +++ b/lib/shared/components/molecules/locals/presentation/blocs/local_profile_bloc.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -31,8 +32,13 @@ class LocalProfileState { } class LocalProfileBloc extends Bloc { + late StreamSubscription _completer; + LocalProfileBloc() : super(LocalProfileState()) { on(_onLocalProfileEvent); + _completer = LocalsRepositoryImpl.license.stream.listen((v) { + add(LocalProfileEvent()); + }); } Future _onLocalProfileEvent(LocalProfileEvent event, Emitter emit) async { diff --git a/lib/shared/components/molecules/locals/presentation/widgets/local_profile/local_profile_widget.dart b/lib/shared/components/molecules/locals/presentation/widgets/local_profile/local_profile_widget.dart index 297a7d0d..83760caa 100644 --- a/lib/shared/components/molecules/locals/presentation/widgets/local_profile/local_profile_widget.dart +++ b/lib/shared/components/molecules/locals/presentation/widgets/local_profile/local_profile_widget.dart @@ -26,13 +26,8 @@ class _LocalProfileComponentWidgetState extends State) { + + if (responseBody == []) { + return true; + } + else if (response.jsonBody is! List) { late final String error; if (response.jsonBody is Map) error = response.jsonBody['error_msg']; @@ -86,10 +90,7 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource { throw Exception('Erro ao consultar licenças: $error'); } - if (responseBody == []) { - // return await setupLicense(DatabaseStorage.database, isNewVersion); - return true; - } + List> saveOperations = []; for (var element in responseBody) {