added firebase service
This commit is contained in:
parent
5fa4a67b0a
commit
0f67f4df74
@ -8,23 +8,33 @@ import 'package:marco/helpers/theme/app_theme.dart';
|
|||||||
import 'package:url_strategy/url_strategy.dart';
|
import 'package:url_strategy/url_strategy.dart';
|
||||||
import 'package:marco/helpers/services/app_logger.dart';
|
import 'package:marco/helpers/services/app_logger.dart';
|
||||||
import 'package:marco/helpers/services/auth_service.dart';
|
import 'package:marco/helpers/services/auth_service.dart';
|
||||||
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
|
import 'package:marco/helpers/services/firebase_messaging_services.dart';
|
||||||
|
|
||||||
Future<void> initializeApp() async {
|
Future<void> initializeApp() async {
|
||||||
try {
|
try {
|
||||||
logSafe("💡 Starting app initialization...");
|
logSafe("💡 Starting app initialization...");
|
||||||
|
|
||||||
|
// 1. Set Flutter web path URL strategy (optional but early)
|
||||||
setPathUrlStrategy();
|
setPathUrlStrategy();
|
||||||
logSafe("💡 URL strategy set.");
|
logSafe("💡 URL strategy set.");
|
||||||
|
|
||||||
|
// 2. Set system UI overlays
|
||||||
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
|
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
|
||||||
statusBarColor: Color.fromARGB(255, 255, 0, 0),
|
statusBarColor: Color.fromARGB(255, 255, 0, 0),
|
||||||
statusBarIconBrightness: Brightness.light,
|
statusBarIconBrightness: Brightness.light,
|
||||||
));
|
));
|
||||||
logSafe("💡 System UI overlay style set.");
|
logSafe("💡 System UI overlay style set.");
|
||||||
|
|
||||||
|
// 3. Initialize Firebase (should be before any Firebase service usage)
|
||||||
|
await Firebase.initializeApp();
|
||||||
|
logSafe("💡 Firebase initialized.");
|
||||||
|
|
||||||
|
// 4. Local storage
|
||||||
await LocalStorage.init();
|
await LocalStorage.init();
|
||||||
logSafe("💡 Local storage initialized.");
|
logSafe("💡 Local storage initialized.");
|
||||||
|
|
||||||
// If a refresh token is found, try to refresh the JWT token
|
// 5. Try to refresh JWT token if available
|
||||||
final refreshToken = await LocalStorage.getRefreshToken();
|
final refreshToken = await LocalStorage.getRefreshToken();
|
||||||
if (refreshToken != null && refreshToken.isNotEmpty) {
|
if (refreshToken != null && refreshToken.isNotEmpty) {
|
||||||
logSafe("🔁 Refresh token found. Attempting to refresh JWT...");
|
logSafe("🔁 Refresh token found. Attempting to refresh JWT...");
|
||||||
@ -32,15 +42,16 @@ Future<void> initializeApp() async {
|
|||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
logSafe("⚠️ Refresh token invalid or expired. Skipping controller injection.");
|
logSafe("⚠️ Refresh token invalid or expired. Skipping controller injection.");
|
||||||
// Optionally, clear tokens and force logout here if needed
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logSafe("❌ No refresh token found. Skipping refresh.");
|
logSafe("❌ No refresh token found. Skipping refresh.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 6. Initialize theme customization
|
||||||
await ThemeCustomizer.init();
|
await ThemeCustomizer.init();
|
||||||
logSafe("💡 Theme customizer initialized.");
|
logSafe("💡 Theme customizer initialized.");
|
||||||
|
|
||||||
|
// 7. Inject controllers if token is valid
|
||||||
final token = LocalStorage.getString('jwt_token');
|
final token = LocalStorage.getString('jwt_token');
|
||||||
if (token != null && token.isNotEmpty) {
|
if (token != null && token.isNotEmpty) {
|
||||||
if (!Get.isRegistered<PermissionController>()) {
|
if (!Get.isRegistered<PermissionController>()) {
|
||||||
@ -53,13 +64,18 @@ Future<void> initializeApp() async {
|
|||||||
logSafe("💡 ProjectController injected as permanent.");
|
logSafe("💡 ProjectController injected as permanent.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load data into controllers if required
|
|
||||||
await Get.find<PermissionController>().loadData(token);
|
await Get.find<PermissionController>().loadData(token);
|
||||||
await Get.find<ProjectController>().fetchProjects();
|
await Get.find<ProjectController>().fetchProjects();
|
||||||
} else {
|
} else {
|
||||||
logSafe("⚠️ No valid JWT token found. Skipping controller initialization.");
|
logSafe("⚠️ No valid JWT token found. Skipping controller initialization.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 8. Firebase Messaging setup
|
||||||
|
final notificationService = FirebaseNotificationService();
|
||||||
|
await notificationService.initialize();
|
||||||
|
logSafe("💡 Firebase Messaging initialized.");
|
||||||
|
|
||||||
|
// 9. App style setup
|
||||||
AppStyle.init();
|
AppStyle.init();
|
||||||
logSafe("💡 AppStyle initialized.");
|
logSafe("💡 AppStyle initialized.");
|
||||||
|
|
||||||
|
53
lib/helpers/services/firebase_messaging_services.dart
Normal file
53
lib/helpers/services/firebase_messaging_services.dart
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
|
import 'package:logger/logger.dart';
|
||||||
|
|
||||||
|
class FirebaseNotificationService {
|
||||||
|
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
|
||||||
|
final Logger _logger = Logger();
|
||||||
|
|
||||||
|
Future<void> initialize() async {
|
||||||
|
await Firebase.initializeApp();
|
||||||
|
_logger.i('Firebase initialized.');
|
||||||
|
|
||||||
|
NotificationSettings settings = await _firebaseMessaging.requestPermission();
|
||||||
|
_logger.i('FCM permission status: ${settings.authorizationStatus}');
|
||||||
|
|
||||||
|
// Foreground messages
|
||||||
|
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
|
||||||
|
_logger.i('🔔 Foreground Notification Received');
|
||||||
|
_logNotificationDetails(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
// When app is opened from background via notification
|
||||||
|
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
|
||||||
|
_logger.i('📲 App opened via notification');
|
||||||
|
_handleNotificationTap(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Background handler registration
|
||||||
|
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleNotificationTap(RemoteMessage message) {
|
||||||
|
_logger.i('Notification tapped with data: ${message.data}');
|
||||||
|
}
|
||||||
|
|
||||||
|
void _logNotificationDetails(RemoteMessage message) {
|
||||||
|
_logger.i('Notification ID: ${message.messageId}');
|
||||||
|
_logger.i('Title: ${message.notification?.title}');
|
||||||
|
_logger.i('Body: ${message.notification?.body}');
|
||||||
|
_logger.i('Data: ${message.data}');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Background handler
|
||||||
|
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||||
|
await Firebase.initializeApp();
|
||||||
|
final Logger _logger = Logger();
|
||||||
|
_logger.i('🕓 Handling background notification...');
|
||||||
|
_logger.i('Notification ID: ${message.messageId}');
|
||||||
|
_logger.i('Title: ${message.notification?.title}');
|
||||||
|
_logger.i('Body: ${message.notification?.body}');
|
||||||
|
_logger.i('Data: ${message.data}');
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user