import 'dart:async'; import 'package:sysfarma_mobile/src/core/network/api_client.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; final pushNotificationServiceProvider = Provider( PushNotificationService.new, ); final pushRouteStreamProvider = StreamProvider((ref) { return ref.watch(pushNotificationServiceProvider).routeStream; }); class PushNotificationService { PushNotificationService(this.ref); final Ref ref; final _controller = StreamController.broadcast(); bool _initialized = false; Stream get routeStream => _controller.stream; Future initialize() async { if (_initialized || kIsWeb) return; _initialized = true; try { final messaging = FirebaseMessaging.instance; await messaging.requestPermission(); final token = await messaging.getToken(); if (token != null && token.isNotEmpty) { await _registerToken(token); } FirebaseMessaging.onMessageOpenedApp.listen((message) { _controller.add(_routeFromMessage(message)); }); final initialMessage = await messaging.getInitialMessage(); if (initialMessage != null) { _controller.add(_routeFromMessage(initialMessage)); } messaging.onTokenRefresh.listen((token) async { await _registerToken(token); }); } catch (_) {} } Future registerCurrentToken() async { if (kIsWeb) return; try { final token = await FirebaseMessaging.instance.getToken(); if (token == null || token.isEmpty) return; await _registerToken(token); } catch (_) {} } Future revokeCurrentToken() async { if (kIsWeb) return; try { final token = await FirebaseMessaging.instance.getToken(); await ref.read(apiClientProvider).revokePushToken( token: token, platform: 'android', ); } catch (_) {} } Future _registerToken(String token) async { await ref.read(apiClientProvider).registerPushToken( token: token, platform: 'android', ); } String _routeFromMessage(RemoteMessage message) { final route = message.data['route']?.toString(); if (route != null && route.isNotEmpty) return route; final type = message.data['type']?.toString(); return switch (type) { 'sync_failed' => '/pending-sync', 'cash_close' => '/home', _ => '/sales-history', }; } }