import 'dart:developer'; import 'package:app_tracking_transparency/app_tracking_transparency.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; import 'package:hub/backend/notifications/notification_service.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:provider/provider.dart'; import 'package:responsive_framework/responsive_framework.dart'; final GlobalKey navigatorKey = GlobalKey(); Future initializeApp() async { WidgetsFlutterBinding.ensureInitialized(); final status = await AppTrackingTransparency.requestTrackingAuthorization(); final appState = AppState(); await appState.initializePersistedState(); await Firebase.initializeApp(); await NotificationService.initialize(); setUrlStrategy(const PathUrlStrategy()); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); if (kDebugMode) { log("Aplicativo em Debug Mode, crashlytics desabilitado!"); } else { final crashlyticsInstance = FirebaseCrashlytics.instance; if (crashlyticsInstance.isCrashlyticsCollectionEnabled) { FlutterError.onError = crashlyticsInstance.recordFlutterError; } } await FlutterFlowTheme.initialize(); await FFLocalizations.initialize(); GoRouter.optionURLReflectsImperativeAPIs = true; usePathUrlStrategy(); } Future foregroundHandleMessage(RemoteMessage message) async { NotificationService.show( title: message.notification!.title!, body: message.notification!.body!, payload: Map.from(message.data)); } Future _backgroundHandleMessage(RemoteMessage message) async { log('Handling a background message: ${message.messageId}'); } void main() async { await initializeApp(); runApp(const App()); } class App extends StatefulWidget { const App({super.key}); @override State createState() => _AppState(); static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!; } class _AppState extends State { Locale? _locale = FFLocalizations.getStoredLocale(); ThemeMode _themeMode = FlutterFlowTheme.themeMode; late AppStateNotifier _appStateNotifier; late GoRouter _router; bool displaySplashImage = true; @override void initState() { super.initState(); FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); // WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((_) => initializeTracking()); _appStateNotifier = AppStateNotifier.instance; _router = createRouter(_appStateNotifier); Future.delayed(const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage())); FirebaseMessaging.onMessage.listen(foregroundHandleMessage); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { log(message.toMap().toString()); onMessageReceived(message.data, message.notification!.body, message.data['click_action']); }); FirebaseMessaging.onBackgroundMessage(_backgroundHandleMessage); FirebaseMessaging.instance.getInitialMessage().then((message) { if (message != null) { _backgroundHandleMessage(message); } }); } // // Future showCustomTrackingDialog(BuildContext context) async { // await showDialog( // context: context, // builder: (context) => AlertDialog( // title: const Text('Dear User'), // content: const Text( // 'We care about your privacy and data security. We keep this app free by showing ads. ' // 'Can we continue to use your data to tailor ads for you?\n\nYou can change your choice anytime in the app settings. ' // 'Our partners will collect data and use a unique identifier on your device to show you ads.', // ), // actions: [ // TextButton( // onPressed: () => Navigator.pop(context), // child: const Text('Continue'), // ), // ], // ), // ); // } // // Future initializeTracking() async { // if (await AppTrackingTransparency.trackingAuthorizationStatus == // TrackingStatus.notDetermined) { // // Show a custom explainer dialog before the system dialog // await showCustomTrackingDialog(context); // // Wait for dialog popping animation // await Future.delayed(const Duration(milliseconds: 200)); // // Request system's tracking authorization dialog // await AppTrackingTransparency.requestTrackingAuthorization(); // } // // final uuid = await AppTrackingTransparency.getAdvertisingIdentifier(); // log("UUID de Publicidade: $uuid"); // } void setLocale(String language) { setState(() => _locale = createLocale(language)); FFLocalizations.storeLocale(language); } void setThemeMode(ThemeMode mode) { setState(() { _themeMode = mode; FlutterFlowTheme.saveThemeMode(mode); }); } @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => AppState()), ], child: MaterialApp.router( title: 'FRE ACCESS HUB', builder: (context, widget) => ResponsiveBreakpoints.builder( child: BouncingScrollWrapper.builder(context, widget!), breakpoints: [ const Breakpoint(start: 0, end: 450, name: MOBILE), const Breakpoint(start: 451, end: 800, name: TABLET), const Breakpoint(start: 801, end: 1920, name: DESKTOP), const Breakpoint(start: 1921, end: double.infinity, name: '4K'), ], ), localizationsDelegates: const [ FFLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], locale: _locale, supportedLocales: const [ Locale('pt'), Locale('en'), ], theme: ThemeData( brightness: Brightness.light, scrollbarTheme: ScrollbarThemeData( thumbVisibility: WidgetStateProperty.all(false), interactive: false, thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.dragged)) { return const Color(0xff1aab5f); } if (states.contains(WidgetState.hovered)) { return const Color(0xff1aab5f); } return const Color(0xff1aab5f); }), ), ), darkTheme: ThemeData( brightness: Brightness.dark, scrollbarTheme: ScrollbarThemeData( thumbVisibility: WidgetStateProperty.all(false), interactive: false, thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.dragged)) { return const Color(0xff1aab5f); } if (states.contains(WidgetState.hovered)) { return const Color(0xff1aab5f); } return const Color(0xff1aab5f); }), ), ), themeMode: _themeMode, routerConfig: _router, ), ); } }