159 lines
5.4 KiB
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: '',
|
|
);
|
|
},
|
|
);
|
|
}
|