flutter-freaccess-hub/lib/backend/push_notification/pushNotificationService.dart

159 lines
5.4 KiB
Dart

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<void> 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<void> _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<void> _updateDeviceToken() async {
String? token = await _firebaseMessaging.getToken();
debugPrint('Push Messaging token: $token');
// Enviar token para o servidor
}
}
/// Manipula mensagens recebidas em segundo plano.
Future<void> _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: '',
);
},
);
}