This commit is contained in:
J. A. Messias 2024-12-06 11:16:32 -03:00
parent 9797d8d811
commit b28ca12482
8 changed files with 97 additions and 41 deletions

View File

@ -1,3 +1,4 @@
description: This file stores settings for Dart & Flutter DevTools. description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions: extensions:
- provider: true

View File

@ -4,6 +4,7 @@ import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:flutter_bloc/flutter_bloc.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/features/home/index.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.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/locals/index.dart';
import 'package:hub/shared/components/molecules/menu/index.dart'; import 'package:hub/shared/components/molecules/menu/index.dart';
import 'package:hub/shared/components/molecules/modules/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 { class HomePageWidget extends StatefulWidget {
const HomePageWidget({ const HomePageWidget({
@ -24,12 +28,13 @@ class HomePageWidget extends StatefulWidget {
State<HomePageWidget> createState() => _HomePageWidgetState(); State<HomePageWidget> createState() => _HomePageWidgetState();
} }
class _HomePageWidgetState extends State<HomePageWidget> { class _HomePageWidgetState extends State<HomePageWidget> with WidgetsBindingObserver {
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
if (widget.update != null) { if (widget.update != null) {
await widget.update!(context); await widget.update!(context);
@ -37,6 +42,41 @@ class _HomePageWidgetState extends State<HomePageWidget> {
}); });
} }
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
Future<void> 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -60,7 +60,7 @@ class App extends StatefulWidget {
static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!; static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
} }
class _AppState extends State<App> with WidgetsBindingObserver { class _AppState extends State<App> {
Locale? _locale = FFLocalizations.getStoredLocale(); Locale? _locale = FFLocalizations.getStoredLocale();
ThemeMode _themeMode = FlutterFlowTheme.themeMode; ThemeMode _themeMode = FlutterFlowTheme.themeMode;
late AppStateNotifier _appStateNotifier; late AppStateNotifier _appStateNotifier;
@ -169,7 +169,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addObserver(this);
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
_appStateNotifier = AppStateNotifier.instance; _appStateNotifier = AppStateNotifier.instance;
@ -185,23 +185,9 @@ class _AppState extends State<App> with WidgetsBindingObserver {
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose(); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -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<void> unlinkLocal();
}
class LocalsLocalDataSourceImpl {
Future<void> 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, '');
}
}

View File

@ -12,6 +12,7 @@ import 'package:rxdart/rxdart.dart';
class LocalsRepositoryImpl implements LocalsRepository { class LocalsRepositoryImpl implements LocalsRepository {
final LocalsRemoteDataSource remoteDataSource = LocalsRemoteDataSourceImpl(); final LocalsRemoteDataSource remoteDataSource = LocalsRemoteDataSourceImpl();
final LocalsLocalDataSourceImpl localDataSource = LocalsLocalDataSourceImpl();
static final license = BehaviorSubject<LicenseStatus>(); static final license = BehaviorSubject<LicenseStatus>();
static get stream => license.stream; static get stream => license.stream;
@ -23,19 +24,30 @@ class LocalsRepositoryImpl implements LocalsRepository {
@override @override
Future<bool> update(BuildContext context) async { Future<bool> update(BuildContext context) async {
LocalsRepositoryImpl.license.add(false);
final bool response = await _handleReponse(context);
LocalsRepositoryImpl.license.add(response);
return response;
}
Future<void> select(BuildContext context) async {
await localDataSource.unlinkLocal();
await update(context);
}
Future<bool> _handleReponse(BuildContext context) async {
bool response = false; bool response = false;
try {
while (!response) { while (!response) {
try {
response = await remoteDataSource.processLocals(context); response = await remoteDataSource.processLocals(context);
if (!response) { if (!response) {
await _handleUpdateError(context); await _handleUpdateError(context);
} }
} } catch (e , s) {
await _notifyBlocs(context); log('Error updating locals: $e', stackTrace: s);
} catch (e) {
log('Error updating locals: $e');
await _handleUpdateError(context); await _handleUpdateError(context);
} }
}
return response; return response;
} }
@ -46,10 +58,10 @@ class LocalsRepositoryImpl implements LocalsRepository {
} }
Future<void> _notifyBlocs(BuildContext context) async { Future<void> _notifyBlocs(BuildContext context) async {
LocalsRepositoryImpl.license.add(false);
context.read<LocalProfileBloc>().add(LocalProfileEvent()); context.read<LocalProfileBloc>().add(LocalProfileEvent());
context.read<MenuBloc>().add(MenuEvent()); context.read<MenuBloc>().add(MenuEvent());
LocalsRepositoryImpl.license.add(true);
} }
@override @override

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -31,8 +32,13 @@ class LocalProfileState {
} }
class LocalProfileBloc extends Bloc<LocalProfileEvent, LocalProfileState> { class LocalProfileBloc extends Bloc<LocalProfileEvent, LocalProfileState> {
late StreamSubscription<bool> _completer;
LocalProfileBloc() : super(LocalProfileState()) { LocalProfileBloc() : super(LocalProfileState()) {
on<LocalProfileEvent>(_onLocalProfileEvent); on<LocalProfileEvent>(_onLocalProfileEvent);
_completer = LocalsRepositoryImpl.license.stream.listen((v) {
add(LocalProfileEvent());
});
} }
Future<void> _onLocalProfileEvent(LocalProfileEvent event, Emitter<LocalProfileState> emit) async { Future<void> _onLocalProfileEvent(LocalProfileEvent event, Emitter<LocalProfileState> emit) async {

View File

@ -26,12 +26,7 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
Future retrieveProfileInfo() async { Future retrieveProfileInfo() async {
setState(() {_isLoading = true;}); setState(() {_isLoading = true;});
await LocalsRepositoryImpl().select(context);
await StorageHelper().set(KeychainStorageKey.clientUUID.value, '');
LocalsRepositoryImpl.license.add(false);
final response = await LocalsRepositoryImpl().update(context);
LocalsRepositoryImpl.license.add(response);
setState(() {_isLoading = false;}); setState(() {_isLoading = false;});
} }

View File

@ -76,7 +76,11 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource {
final response = await PhpGroup.getLicense(); final response = await PhpGroup.getLicense();
final dynamic responseBody = response.jsonBody; final dynamic responseBody = response.jsonBody;
if (response.jsonBody is! List<dynamic>) {
if (responseBody == []) {
return true;
}
else if (response.jsonBody is! List<dynamic>) {
late final String error; late final String error;
if (response.jsonBody is Map<String, dynamic>) if (response.jsonBody is Map<String, dynamic>)
error = response.jsonBody['error_msg']; error = response.jsonBody['error_msg'];
@ -86,10 +90,7 @@ class LicenseRemoteDataSourceImpl implements LicenseRemoteDataSource {
throw Exception('Erro ao consultar licenças: $error'); throw Exception('Erro ao consultar licenças: $error');
} }
if (responseBody == []) {
// return await setupLicense(DatabaseStorage.database, isNewVersion);
return true;
}
List<Future<void>> saveOperations = []; List<Future<void>> saveOperations = [];
for (var element in responseBody) { for (var element in responseBody) {