From 243c89b636925367e204c3979bda852b06fcd48e Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Wed, 4 Dec 2024 10:50:55 -0300 Subject: [PATCH] wip: cache license in build context.read --- .../home/presentation/pages/home_page.dart | 10 +++++++++- .../data_sources/locals_remote_data_source.dart | 12 ++++++------ .../repositories/locals_repository_impl.dart | 8 +++++++- .../presentation/blocs/local_profile_bloc.dart | 9 +++++---- .../local_profile/local_profile_widget.dart | 2 +- .../menu/presentation/blocs/menu_bloc.dart | 14 ++++++++------ .../menu/presentation/widgets/menu_factory.dart | 3 ++- .../data_sources/license_remote_data_source.dart | 16 ++++++++++++---- .../repositories/license_repository_impl.dart | 14 +++++++++----- lib/shared/helpers/database/database_helper.dart | 2 +- 10 files changed, 60 insertions(+), 30 deletions(-) diff --git a/lib/features/home/presentation/pages/home_page.dart b/lib/features/home/presentation/pages/home_page.dart index 8f026f3e..4d0a12b7 100644 --- a/lib/features/home/presentation/pages/home_page.dart +++ b/lib/features/home/presentation/pages/home_page.dart @@ -26,16 +26,24 @@ class _HomePageWidgetState extends State { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ + BlocProvider( + create: (context) => MenuBloc( + style: MenuView.list_grid, + item: EnumMenuItem.button, + menuOptions: MenuEntry.getEntriesByType(MenuEntryType.Home), + )..add(MenuEvent()), + ), BlocProvider( create: (context) => HomeBloc()..add(HomeEvent()), ), BlocProvider( create: (context) => LocalProfileBloc()..add(LocalProfileEvent()), ), + ], child: Builder( builder: (context) { - // context.read().updateProfile(context); + context.read().updateProfile(context); return Scaffold( key: scaffoldKey, backgroundColor: FlutterFlowTheme.of(context).primaryBackground, diff --git a/lib/shared/components/molecules/locals/data/data_sources/locals_remote_data_source.dart b/lib/shared/components/molecules/locals/data/data_sources/locals_remote_data_source.dart index eecd26d9..f252201a 100644 --- a/lib/shared/components/molecules/locals/data/data_sources/locals_remote_data_source.dart +++ b/lib/shared/components/molecules/locals/data/data_sources/locals_remote_data_source.dart @@ -18,11 +18,11 @@ import 'package:hub/shared/utils/dialog_util.dart'; import 'package:hub/shared/utils/snackbar_util.dart'; abstract class LocalsRemoteDataSource { - Future checkLocals(BuildContext context) async {} - Future processLocals(BuildContext context) async => false; - Future processData(BuildContext context) async => false; - Future selectLocal(BuildContext context, ApiCallResponse? response) async => false; - Future detachLocal(BuildContext context) async {} + Future checkLocals(BuildContext context); + Future processLocals(BuildContext context) ; + Future processData(BuildContext context); + Future selectLocal(BuildContext context, ApiCallResponse? response) ; + Future detachLocal(BuildContext context) ; } class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource { @@ -165,7 +165,7 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource { await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response)); return false; } else { - final bool isNewVersion = await LocalUtil.updateStorageUtil(response.jsonBody); + await LocalUtil.updateStorageUtil(response.jsonBody); return await LicenseRepositoryImpl().updateLicense(); } } catch (e, s) { 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 d30f7523..e2dbd15f 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 @@ -2,10 +2,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hub/shared/components/molecules/locals/index.dart'; import 'package:hub/shared/components/molecules/modules/index.dart'; +import 'package:rxdart/rxdart.dart'; class LocalsRepositoryImpl implements LocalsRepository { final LocalsRemoteDataSource remoteDataSource = LocalsRemoteDataSourceImpl(); + static final license = BehaviorSubject(); + static get stream => license.stream; + @override Future validateLocal(BuildContext context) async { return await remoteDataSource.checkLocals(context); @@ -13,8 +17,10 @@ class LocalsRepositoryImpl implements LocalsRepository { @override Future update(BuildContext context) async { - final bool response = await LicenseRepositoryImpl().updateLicense(); + LocalsRepositoryImpl.license.add(false); + final bool response = await remoteDataSource.processLocals(context); context.read().add(LocalProfileEvent()); + LocalsRepositoryImpl.license.add(response); return response; } 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 9abbd435..754abc2f 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 @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/shared/components/molecules/locals/index.dart'; +import 'package:hub/shared/components/molecules/menu/index.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart'; @@ -36,10 +37,10 @@ class LocalProfileBloc extends Bloc { emit(state.copyWith(cliName: cliName, cliUUID: cliUUID)); } - // void updateProfile(BuildContext context) { - // add(LocalProfileEvent()); - // LocalsRepositoryImpl().update(context); - // } + void updateProfile(BuildContext context) { + context.read().add(MenuEvent()); + add(LocalProfileEvent()); + } } class LocalProfileComponentModel extends FlutterFlowModel { 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 189cb702..7153de8c 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 @@ -31,7 +31,7 @@ class _LocalProfileComponentWidgetState extends State( - stream: LicenseRepositoryImpl.stream, + stream: LocalsRepositoryImpl.stream, builder: (context, snapshot) { final textScaler = MediaQuery.textScalerOf(context); final double baseFontSize = 14.0; diff --git a/lib/shared/components/molecules/menu/presentation/blocs/menu_bloc.dart b/lib/shared/components/molecules/menu/presentation/blocs/menu_bloc.dart index 6866013a..14d434c5 100644 --- a/lib/shared/components/molecules/menu/presentation/blocs/menu_bloc.dart +++ b/lib/shared/components/molecules/menu/presentation/blocs/menu_bloc.dart @@ -34,16 +34,18 @@ class MenuBloc extends Bloc { MenuBloc({required this.style, required this.item, required this.menuOptions}) : super(MenuState()) { - on((event, emit) async { - await LicenseRemoteDataSourceImpl().waitForSaveCompletion(); - final entries = await MenuRepositoryImpl().generateMenuEntries(menuOptions, item); - emit(state.copyWith(menuEntries: entries)); - }); + on(_onMenuEvent); _completer = LicenseRemoteDataSourceImpl().streamCompleterController.listen((_) { add(MenuEvent()); }); - } + } + + Future _onMenuEvent(MenuEvent event, Emitter emit) async { + await LicenseRemoteDataSourceImpl().waitForSaveCompletion(); + final entries = await MenuRepositoryImpl().generateMenuEntries(menuOptions, item); + emit(state.copyWith(menuEntries: entries)); + } @override Future close() { diff --git a/lib/shared/components/molecules/menu/presentation/widgets/menu_factory.dart b/lib/shared/components/molecules/menu/presentation/widgets/menu_factory.dart index 3528588d..c3c11fba 100644 --- a/lib/shared/components/molecules/menu/presentation/widgets/menu_factory.dart +++ b/lib/shared/components/molecules/menu/presentation/widgets/menu_factory.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; +import 'package:hub/shared/components/molecules/locals/index.dart'; import 'package:hub/shared/components/molecules/modules/index.dart'; import 'package:hub/shared/components/molecules/menu/index.dart'; import 'package:hub/shared/utils/loading_util.dart'; @@ -22,7 +23,7 @@ class Menufactory extends StatelessWidget { @override Widget build(BuildContext context) { return StreamBuilder( - stream: LicenseRepositoryImpl.stream, + stream: LocalsRepositoryImpl.stream, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); diff --git a/lib/shared/components/molecules/modules/data/data_sources/license_remote_data_source.dart b/lib/shared/components/molecules/modules/data/data_sources/license_remote_data_source.dart index 54230ed4..23427808 100644 --- a/lib/shared/components/molecules/modules/data/data_sources/license_remote_data_source.dart +++ b/lib/shared/components/molecules/modules/data/data_sources/license_remote_data_source.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'dart:developer'; import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/shared/components/molecules/locals/index.dart'; import 'package:hub/shared/components/molecules/modules/index.dart'; import 'package:hub/shared/helpers/database/database_helper.dart'; @@ -31,13 +32,14 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource { @override Future cleanLicense() async { - LicenseRepositoryImpl.license.add(false); + LocalsRepositoryImpl.license.add(false); } @override Future setupLicense(Database database, bool isNewVersion) async { log('Setting up license...'); + try { final License license = await License.getLicense(isNewVersion); final List inactiveModuleKey = license.modules @@ -65,6 +67,10 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource { } return true; + } catch (e, s) { + log('Erro ao configurar licenças: $e', stackTrace: s); + return false; + } } @override @@ -85,7 +91,8 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource { } if (responseBody == []) { - return await setupLicense(DatabaseStorage.database, isNewVersion); + // return await setupLicense(DatabaseStorage.database, isNewVersion); + return false; } List> saveOperations = []; @@ -98,12 +105,13 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource { return true; } catch (e, s) { log('Erro ao obter licenças: $e', stackTrace: s); - return await setupLicense(DatabaseStorage.database, isNewVersion); + // return await setupLicense(DatabaseStorage.database, isNewVersion); + return false; } } Future waitForSaveCompletion() async { - await LicenseRepositoryImpl.stream; + await LocalsRepositoryImpl.stream; } static bool licenseContainsKey(final String key) { diff --git a/lib/shared/components/molecules/modules/data/repositories/license_repository_impl.dart b/lib/shared/components/molecules/modules/data/repositories/license_repository_impl.dart index d2b2ae43..3ff81998 100644 --- a/lib/shared/components/molecules/modules/data/repositories/license_repository_impl.dart +++ b/lib/shared/components/molecules/modules/data/repositories/license_repository_impl.dart @@ -1,8 +1,9 @@ +import 'dart:developer'; + import 'package:hub/shared/components/molecules/modules/data/data_sources/license_local_data_source.dart'; import 'package:hub/shared/components/molecules/modules/data/data_sources/license_remote_data_source.dart'; import 'package:hub/shared/components/molecules/modules/domain/respositories/license_repository.dart'; import 'package:hub/shared/helpers/database/database_helper.dart'; -import 'package:rxdart/rxdart.dart'; import 'package:sqflite/sqflite.dart'; typedef LicenseStatus = bool; @@ -14,31 +15,34 @@ class LicenseRepositoryImpl implements LicenseRepository { LicenseRepositoryImpl(); - static final license = BehaviorSubject(); - static get stream => license.stream; + + @override Future updateLicense() async { - LicenseRepositoryImpl.license.add(false); bool result = false; final bool isNewVersion = await localDataSource.isNewVersion(); + log('isNewVersion: $isNewVersion'); result = await remoteDataSource.setupLicense(database, isNewVersion); if (isNewVersion) { result = await remoteDataSource.fetchLicenses(isNewVersion); } - LicenseRepositoryImpl.license.add(result); + return result; } + @override Future cleanLicense() async { return await remoteDataSource.cleanLicense(); } + @override Future getLicense(String key) async { return await localDataSource.get(key); } + @override Future setLicense(String key, T value) async { return await localDataSource.set(key, value); } diff --git a/lib/shared/helpers/database/database_helper.dart b/lib/shared/helpers/database/database_helper.dart index 258e81d7..a5054993 100644 --- a/lib/shared/helpers/database/database_helper.dart +++ b/lib/shared/helpers/database/database_helper.dart @@ -32,7 +32,7 @@ class DatabaseStorage { onUpgrade: _onUpgrade, onDowngrade: _onDowngrade, ); - await LicenseRepositoryImpl().updateLicense(); + // await LicenseRepositoryImpl().updateLicense(); isInitialized = true; }