import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:overlay_support/overlay_support.dart'; import '/database/models/my_profile.dart'; import '/views/main/home.dart'; import '/views/authentication/unauthenticated_landing.dart'; import '/views/authentication/login.dart'; import '/views/authentication/signup.dart'; class PushNotification { PushNotification({ this.title, this.body, this.dataTitle, this.dataBody, }); String? title; String? body; String? dataTitle; String? dataBody; } void main() async { await dotenv.load(fileName: '.env'); // TODO: Replace this with the prod url when server is deployed MyProfile.setServerUrl(dotenv.env['SERVER_URL'] ?? 'http://localhost:8080/'); runApp(MyApp()); } class MyApp extends StatelessWidget { MyApp({Key? key}) : super(key: key); static const String _title = 'Envelope'; late final FirebaseMessaging _messaging; void registerNotification() async { await Firebase.initializeApp(); _messaging = FirebaseMessaging.instance; NotificationSettings settings = await _messaging.requestPermission( alert: true, badge: true, provisional: false, sound: true, ); if (settings.authorizationStatus != AuthorizationStatus.authorized) { return; } final fcmToken = await _messaging.getToken(); print('Device Token: $fcmToken'); Color notificationBg = Colors.grey.shade100; if (SchedulerBinding.instance.window.platformBrightness == Brightness.dark) { notificationBg = Colors.grey[850]!; } // For handling the received notifications FirebaseMessaging.onMessage.listen((RemoteMessage message) { // Parse the message received PushNotification notification = PushNotification( title: message.notification?.title, body: message.notification?.body, ); // TODO: Replace this with a better notification UI showSimpleNotification( Text(notification.title!), // leading: NotificationBadge(totalNotifications: _totalNotifications), background: notificationBg, duration: const Duration(seconds: 5), slideDismissDirection: DismissDirection.up, ); }); } @override Widget build(BuildContext context) { registerNotification(); return OverlaySupport.global( child: MaterialApp( title: _title, routes: { '/home': (context) => const Home(), '/landing': (context) => const UnauthenticatedLandingWidget(), '/login': (context) => const Login(), '/signup': (context) => const Signup(), }, home: const Scaffold( body: SafeArea( child: Home(), ) ), theme: ThemeData( brightness: Brightness.light, primaryColor: const Color(0xff014bff), backgroundColor: Colors.grey[300], scaffoldBackgroundColor: Colors.grey.shade100, disabledColor: Colors.grey[700], hintColor: Colors.grey.shade700, colorScheme: ColorScheme( brightness: Brightness.light, primary: const Color(0xff014bff), onPrimary: Colors.white, secondary: const Color(0xff1a6dff), onSecondary: Colors.black, tertiary: const Color(0xff3490ff), onTertiary: Colors.black, error: Colors.red, onError: Colors.white, background: Colors.grey.shade300, onBackground: Colors.black, surface: Colors.grey.shade100, onSurface: Colors.black, ), appBarTheme: AppBarTheme( color: Colors.grey.shade100, foregroundColor: Colors.white, iconTheme: const IconThemeData( color: Colors.black, ), toolbarTextStyle: const TextStyle( color: Colors.black, ), systemOverlayStyle: const SystemUiOverlayStyle( statusBarColor: Colors.black, statusBarIconBrightness: Brightness.light, statusBarBrightness: Brightness.light, ) ), iconTheme: const IconThemeData(color: Colors.black), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: Colors.white, labelStyle: const TextStyle( color: Colors.black, fontSize: 30, ), hintStyle: TextStyle( color: Colors.grey.shade600, ), iconColor: Colors.grey.shade500, contentPadding: const EdgeInsets.all(8), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide( color: Colors.transparent, ) ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide( color: Colors.transparent, ) ), ), ), darkTheme: ThemeData( brightness: Brightness.dark, primaryColor: const Color(0xffff4a27), backgroundColor: Colors.grey.shade800, scaffoldBackgroundColor: Colors.grey[850], disabledColor: Colors.grey[400], hintColor: Colors.grey.shade400, colorScheme: ColorScheme( brightness: Brightness.dark, primary: const Color(0xffff4a27), onPrimary: Colors.white, secondary: const Color(0xffff5f3a), onSecondary: Colors.white, tertiary: const Color(0xffff7950), onTertiary: Colors.black, error: Colors.red, onError: Colors.white, background: Colors.grey.shade900, onBackground: Colors.white, surface: Colors.grey.shade700, onSurface: Colors.white, ), appBarTheme: AppBarTheme( color: Colors.grey.shade800, iconTheme: IconThemeData( color: Colors.grey.shade400 ), toolbarTextStyle: TextStyle( color: Colors.grey.shade400 ), systemOverlayStyle: const SystemUiOverlayStyle( statusBarColor: Colors.black, statusBarIconBrightness: Brightness.dark, statusBarBrightness: Brightness.dark, ) ), iconTheme: const IconThemeData(color: Colors.white), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: Colors.grey.shade800, hintStyle: TextStyle( color: Colors.grey.shade500, ), iconColor: Colors.grey.shade500, contentPadding: const EdgeInsets.all(8), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide( color: Colors.transparent, ) ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: const BorderSide( color: Colors.transparent, ) ), ), ), ), ); } }