This commit is contained in:
J. A. Messias 2024-09-30 17:29:17 -03:00
parent 9427c0bdb2
commit e646f56bff
10 changed files with 276 additions and 226 deletions

View File

@ -1,5 +1,3 @@
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
import 'package:hub/shared/utils/storage_util.dart';
import '/flutter_flow/flutter_flow_util.dart';

View File

@ -5,10 +5,8 @@ import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/storage_util.dart';
import 'package:provider/provider.dart';
import '/flutter_flow/custom_functions.dart' as functions;
import '/flutter_flow/flutter_flow_theme.dart';
@ -43,11 +41,7 @@ class _LocalProfileComponentWidgetState
_model.setStateCallback = () => safeSetState(() {});
() async {
_model.cliUUID = StorageUtil().cliUUID;
if (_model.cliUUID.isEmpty) {
await processLocals();
}
}();
}
@ -102,6 +96,7 @@ class _LocalProfileComponentWidgetState
final GetLocalsCall callback = PhpGroup.getLocalsCall;
final cliUUID = StorageUtil().cliUUID;
final cliName = StorageUtil().cliName;
var response = await callback.call();
List<dynamic> locals = response.jsonBody['locais'] ?? [];
@ -109,7 +104,7 @@ class _LocalProfileComponentWidgetState
final activeLocals =
locals.where((local) => local['CLU_STATUS'] == 'A').toList();
if (activeLocals.isEmpty || cliUUID.isEmpty) {
if (activeLocals.isEmpty || cliUUID.isEmpty || cliName.isEmpty) {
await showModalSelectLocal();
} else {
await processData();
@ -125,6 +120,8 @@ class _LocalProfileComponentWidgetState
backgroundColor: Colors.transparent,
enableDrag: false,
isDismissible: false,
showDragHandle: false,
useSafeArea: true,
context: context,
builder: (context) => Padding(
padding: MediaQuery.viewInsetsOf(context),
@ -137,8 +134,6 @@ class _LocalProfileComponentWidgetState
await processData();
}
void onUpdate() {
safeSetState(() {
_model.getData();

View File

@ -102,7 +102,6 @@ class SignInTemplateComponentModel
final String userName;
final String email;
final String passwd;
final bool isLogged;
email = emailAdress!;
passwd = password!;
@ -116,7 +115,6 @@ class SignInTemplateComponentModel
response = await callback.call();
if (response.jsonBody['error'] == false) {
userUUID = response.jsonBody['uid'];
status = response.jsonBody['user']['status'];
userDevUUID = response.jsonBody['user']['dev_id'];
@ -127,10 +125,9 @@ class SignInTemplateComponentModel
StorageUtil().status = status;
StorageUtil().userName = userName;
isLogged = true;
await checkLocals(context: context, model: model).then((value) {
StorageUtil().haveLocal = value;
StorageUtil().isLogged = isLogged;
StorageUtil().isLogged = true;
toggleApp(context);
});
} else {
@ -156,15 +153,7 @@ class SignInTemplateComponentModel
if (haveLocal == true) {
context.go('/homePage');
} else if (haveLocal == false) {
context.go(
'/receptionPage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.fade,
)
},
);
context.go('/receptionPage');
}
}

View File

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
@ -40,7 +41,16 @@ class AppStateNotifier extends ChangeNotifier {
}
}
GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
GoRouter createRouter(AppStateNotifier appStateNotifier) {
final bool? isLogged = StorageUtil().isLogged;
final bool? haveLocal = StorageUtil().haveLocal;
final bool haveUserUUID = StorageUtil().userUUID.isNotEmpty;
final bool haveDevUUID = StorageUtil().devUUID.isNotEmpty;
log('() => isLogged: $isLogged');
log('() => haveLocal: $haveLocal');
return GoRouter(
initialLocation: '/',
debugLogDiagnostics: true,
refreshListenable: appStateNotifier,
@ -74,10 +84,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
FFRoute(
name: '_initialize',
path: '/',
builder: (context, _) => StorageUtil().isLogged &&
(StorageUtil().userUUID.isNotEmpty &&
StorageUtil().userUUID.isNotEmpty)
? StorageUtil().haveLocal == true
builder: (context, _) => isLogged == true && haveDevUUID && haveUserUUID
? haveLocal == true
? const HomePageWidget()
: const ReceptionPageWidget()
: const WelcomePageWidget(),
@ -205,6 +213,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
// )
].map((r) => r.toRoute(appStateNotifier)).toList(),
);
}
extension NavParamExtensions on Map<String, String?> {
Map<String, String> get withoutNulls => Map.fromEntries(

View File

@ -2,6 +2,7 @@ import 'dart:developer';
import 'dart:io';
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
@ -23,6 +24,7 @@ final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
void main() async {
await _initializeApp();
runApp(const App());
FirebaseMessaging.onBackgroundMessage(_backgroundHandlerMessage);
}
Future<void> _initializeApp() async {
@ -77,7 +79,7 @@ Future<void> _initializeFlutterFlow() async {
usePathUrlStrategy();
}
Future<void> _foregroundHandleMessage(RemoteMessage message) async {
Future<void> _foregroundHandlerMessage(RemoteMessage message) async {
if (message.data['click_action'] == 'enroll_cond') {
StorageUtil().haveLocal = true;
StorageUtil().context?.go('/homePage');
@ -90,8 +92,9 @@ Future<void> _foregroundHandleMessage(RemoteMessage message) async {
}
}
Future<void> _backgroundHandleMessage(RemoteMessage message) async {
Future<void> _backgroundHandlerMessage(RemoteMessage message) async {
if (message.data['click_action'] == 'enroll_cond') {
log('backgroundHandlerMessage');
StorageUtil().haveLocal = true;
StorageUtil().context?.go('/homePage');
}
@ -177,20 +180,41 @@ class _AppState extends State<App> {
@override
void initState() {
super.initState();
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
_appStateNotifier = AppStateNotifier.instance;
_router = createRouter(_appStateNotifier);
Future.delayed(const Duration(milliseconds: 1000),
() => setState(() => _appStateNotifier.stopShowingSplashImage()));
FirebaseMessaging.onMessage.listen(_foregroundHandleMessage);
_setupFirebaseMessaging();
}
void _setupFirebaseMessaging() async {
FirebaseMessaging messaging = FirebaseMessaging.instance;
RemoteMessage? initialMessage = await messaging.getInitialMessage();
if (initialMessage != null) {
log('initialMessage');
_backgroundHandlerMessage(initialMessage);
}
FirebaseMessaging.onMessage.listen(_foregroundHandlerMessage);
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
if (message.data['click_action'] == 'enroll_cond') {
StorageUtil().haveLocal = true;
log('onMessageOpenedApp');
} else {
onMessageReceived(message.data, message.notification!.body,
message.data['click_action']);
}
});
FirebaseMessaging.onBackgroundMessage(_backgroundHandleMessage);
FirebaseMessaging.instance.getInitialMessage().then((message) {
if (message != null) {
_backgroundHandleMessage(message);
if (message.data['click_action'] == 'enroll_cond') {
StorageUtil().haveLocal = true;
log('getInitialMessage');
}
}
});
}

View File

@ -1,12 +1,5 @@
import 'dart:developer';
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:hub/app_state.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/storage_util.dart';
import 'package:share_plus/share_plus.dart';

View File

@ -1,5 +1,7 @@
import 'dart:developer';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
@ -22,12 +24,27 @@ class ReceptionPageWidget extends StatefulWidget {
State<ReceptionPageWidget> createState() => _ReceptionPageWidgetState();
}
class _ReceptionPageWidgetState extends State<ReceptionPageWidget> {
class _ReceptionPageWidgetState extends State<ReceptionPageWidget>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
() async {
final lifecycle = await AwesomeNotifications().getAppLifeCycle();
log('lifecycle: $lifecycle');
}();
FirebaseMessagingService().updateDeviceToken();
() async => await processData();
processLocals();
}
@override
void dispose() {
WidgetsBinding.instance
.removeObserver(this); // Remove a classe como observador
super.dispose();
}
Future<void> processLocals() async {
@ -39,14 +56,17 @@ class _ReceptionPageWidgetState extends State<ReceptionPageWidget> {
if (response.jsonBody['error'] == false) {
List<dynamic> locals = response.jsonBody['locais'] ?? [];
final locales = locals.where((local) => local['CLU_STATUS']).toList();
if (locals.isNotEmpty) {
StorageUtil().haveLocal = true;
StorageUtil().isLogged = true;
await WidgetsBinding.instance.endOfFrame;
dispose();
StorageUtil().context?.go('/homePage');
if (locales.isNotEmpty) await showModalSelectLocal();
await showModalSelectLocal();
}
} catch (e) {
// await showModalSelectLocal();
}
} catch (e, s) {
log(e.toString(), stackTrace: s);
}
}
@ -88,7 +108,7 @@ class _ReceptionPageWidgetState extends State<ReceptionPageWidget> {
return;
} catch (e) {
log('() => error: $e'); // Add this line to log the error
log('() => error: $e');
final BuildContext? context = StorageUtil().context;
if (context != null) {
DialogUtil.warningDefault(context).whenComplete(() => processLocals());
@ -114,6 +134,15 @@ class _ReceptionPageWidgetState extends State<ReceptionPageWidget> {
});
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
setState(() {
processLocals();
});
}
}
@override
Widget build(BuildContext context) {
StorageUtil().context = context;

View File

@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
import 'package:hub/shared/utils/storage_util.dart';
export 'context_entensions.dart' show ContextExtensions;
extension ContextExtensions on BuildContext {
void setStateStatic(VoidCallback callback) {
final element = findAncestorStateOfType<State<StatefulWidget>>();
element?.setState(callback);
}
}

View File

@ -49,14 +49,16 @@ class SecureStorageHelper extends ChangeNotifier implements Storage {
}
Future<bool?> getBool(String key) async {
log('getBool value for key: $key');
var value = CacheUtil.instance.get(key);
if (value == null) {
if (value == null || value == 'null') {
value = await _secureStorage.read(key: key);
CacheUtil.instance.set(key, value == 'true');
}
CacheUtil.instance.set(key, value);
log('getBool $value for key: $key');
return value == 'true';
}
log('getBool $value for key: $key');
return value;
}
Future<BuildContext?> getObject(String key) async {
log('getObject value for key: $key');
@ -71,11 +73,11 @@ class SecureStorageHelper extends ChangeNotifier implements Storage {
@override
Future<void> set(
String key, dynamic value, Function(dynamic) cacheSetter) async {
if (value is String) {
await setAndCacheString(key, value, cacheSetter);
} else if (value is bool) {
if (value is String? || value is String) {
await setAndCacheString(key, value!, cacheSetter);
} else if (value is bool? || value is bool) {
await setAndCacheBool(key, value, cacheSetter);
} else if (value is BuildContext) {
} else if (value is BuildContext || value is BuildContext?) {
await setAndCacheObject(key, value.toString(), cacheSetter);
}
}

View File

@ -125,9 +125,9 @@ class StorageUtil {
Future<void> initSharedPreferences() async {
_sharedPreferences.prefs ??= await SharedPreferences.getInstance();
_isFirstRun = _sharedPreferences.prefs?.getBool('first_run') ?? true;
isFirstRun = _sharedPreferences.prefs?.getBool('first_run') ?? true;
if (isFirstRun) {
_sharedPreferences.isFirstRun = false;
isFirstRun = false;
_secureStorage.purge();
}
}
@ -261,8 +261,8 @@ class StorageUtil {
}
bool? _isLogged;
bool get isLogged => _isLogged ?? false;
set isLogged(bool value) {
bool? get isLogged => _isLogged;
set isLogged(bool? value) {
_isLogged = value;
_secureStorage.set('ff_isLogged', value, (v) => _isLogged = v);
}