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

157 lines
4.9 KiB
Dart

import 'dart:convert';
import 'dart:developer';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:hub/app_state.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart';
import 'package:hub/shared/utils/log_util.dart';
class PushNotification {
static final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
static final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
Future<void> initialize() async {
await _requestPermissions();
// Mensagens
_backgroundMessage();
_forgroundMessage();
_openMessage();
// Token
_refreshToken();
_updateDeviceToken();
}
Future<void> _updateDeviceToken() async {
try {
final String? deviceToken = await _firebaseMessaging.getToken();
if (deviceToken != null) {
AppState().token = deviceToken;
final ApiCallResponse? response = await PhpGroup.updToken.call(token: AppState().token, devid: AppState().devUUID, useruuid: AppState().userUUID);
if (PhpGroup.updToken.error((response?.jsonBody ?? '')) == false) {
log('Token Atualizado com Sucesso!');
} else {
log('Falha ao Atualizar Token: ${response?.jsonBody}');
}
} else {
log('Falha ao Pegar Token do Firebase');
}
} catch (e, s) {
LogUtil.requestAPIFailed("updToken.php", "", "Atualizar Token", e, s);
}
}
Future<void> _requestPermissions() async {
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
badge: true,
sound: true,
provisional: true,
criticalAlert: false,
carPlay: false,
announcement: false
);
log('Permisão de Notificação: ${settings.authorizationStatus == AuthorizationStatus.authorized ? "Liberado" : "Negado"}');
}
void _backgroundMessage() {
FirebaseMessaging.onBackgroundMessage((RemoteMessage message) => _printNotification(message, 'background'));
}
void _forgroundMessage() {
FirebaseMessaging.onMessage.listen((RemoteMessage message) => _printNotification(message, 'forground'));
}
void _openMessage() {
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) => _processNotification(message));
}
void _refreshToken() {
_firebaseMessaging.onTokenRefresh.listen((token) => log('Novo Token: $token'));
}
Future<void> _printNotification(RemoteMessage message, String type) async {
print("Tipo da Notificação: $type");
print("Mensagem: $message");
}
Future<void> _processNotification(RemoteMessage message) async {
switch (message.category) {
case 'mensagem':
_showMessageNotificationDialog(message.data, AppState().context!, message.notification?.body ?? '');
}
}
void _showMessageNotificationDialog(Map<String, dynamic> message, BuildContext context, String extra) {
showDialog(
useSafeArea: true,
barrierDismissible: true,
context: context,
builder: (BuildContext context) {
String localId = '';
try {
localId = jsonDecode(message['local'])['CLI_ID'];
} catch (e) {
localId = message['local']['CLI_ID'].toString();
}
return GestureDetector(
onTap: () => Navigator.of(context).pop(),
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Dialog(
backgroundColor: Colors.transparent,
child: GestureDetector(
onTap: () => Navigator.of(context).pop(),
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: MessageNotificationModalTemplateComponentWidget(
id: localId,
from: message['remetente'].toString(),
to: message['destinatario'].toString() == 'O'
? 'Morador'
: 'Visitante',
message: extra.isEmpty ? 'Unknown' : extra.toString(),
),
),
),
),
),
);
},
);
}
Future<void> _showMessage(RemoteMessage message) async {
print("Dados: ${message.data}");
print("From: ${message.from}");
print("Notification: ${message.notification?.body}");
print("Category: ${message.category}");
showDialog(
context: AppState().context!,
builder: (context) => Dialog(
child: Container(
child: Text("Notificação"),
),
)
);
}
}