import 'package:flutter/material.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:f_r_e_hub/components/templates_components/visit_request_template_component/visit_request_template_component_widget.dart'; import 'dart:io' show Platform; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; class PushNotificationService { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; Function(BuildContext)? onNotificationClick; /// Inicializa o serviço de notificação push. Future initialize() async { FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); await _requestPermissions(); _configureLocalNotification(_flutterLocalNotificationsPlugin); _listenToForegroundMessages(_flutterLocalNotificationsPlugin); _handleMessageTap(); _listenToBackgroundMessages(); await _updateDeviceToken(); } void showCustomSheet(BuildContext context) { showModalBottomSheet( context: context, isScrollControlled: true, builder: (BuildContext context) { return const VisitRequestTemplateComponentWidget( name: '', // Supondo que esses valores serão extraídos da mensagem image: '', message: '', reason: '', ); }, ); } void _configureLocalNotification( FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin) { var initializationSettingsAndroid = const AndroidInitializationSettings('mipmap/ic_launcher'); var initializationSettingsIOS = const DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); var initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS); _flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: (response) async { debugPrint('Notification tapped!'); }); } /// Solicita permissões ao usuário para iOS. Future _requestPermissions() async { NotificationSettings settings = await _firebaseMessaging.requestPermission( alert: true, badge: true, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { debugPrint('User granted permission'); } else { debugPrint('User declined or has not accepted permission'); } } void _listenToForegroundMessages( FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin) { FirebaseMessaging.onMessage.listen((RemoteMessage message) { debugPrint('Got a message whilst in the foreground!'); debugPrint('Message data: ${message.data}'); RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { _flutterLocalNotificationsPlugin.show( notification.hashCode, notification.title, notification.body, const NotificationDetails( android: AndroidNotificationDetails( 'your_channel_id', 'Your Channel Name', channelDescription: 'Your Channel Description', importance: Importance.max, priority: Priority.high, icon: 'mipmap/ic_launcher', ), ), ); } }); } /// Configura a ação ao tocar na notificação. void _handleMessageTap() { FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { debugPrint('Message clicked!'); // Implementar ação ao tocar na notificação }); } /// Configura o ouvinte para mensagens em segundo plano. void _listenToBackgroundMessages() { FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); } /// Atualiza o token do dispositivo e envia para o servidor, se necessário. Future _updateDeviceToken() async { String? token = await _firebaseMessaging.getToken(); debugPrint('Push Messaging token: $token'); // Enviar token para o servidor } } /// Manipula mensagens recebidas em segundo plano. Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { debugPrint('Handling a background message: ${message.messageId}'); } void _handleNotificationTap( NotificationResponse response, BuildContext context) { // Implementação para lidar com o toque na notificação showModalBottomSheet( context: context, isScrollControlled: true, builder: (BuildContext context) { return const VisitRequestTemplateComponentWidget( name: '', // Supondo que esses valores serão extraídos da mensagem image: '', message: '', reason: '', ); }, ); } void _handleMessageOpenedApp(RemoteMessage message, BuildContext context) { // Mostra um modal ao invés de navegar para uma nova página showModalBottomSheet( context: context, isScrollControlled: true, builder: (BuildContext context) { return const VisitRequestTemplateComponentWidget( name: '', // Supondo que esses valores serão extraídos da mensagem image: '', message: '', reason: '', ); }, ); }