WIP
This commit is contained in:
parent
9797d8d811
commit
b28ca12482
|
@ -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
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue