import 'dart:developer'; import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:flutter/material.dart'; import 'package:hub/actions/actions.dart'; import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/shared/utils/dialog_util.dart'; class NotificationService { static Future initialize() async { await AwesomeNotifications().initialize( 'resource://drawable/notification_icon', [ NotificationChannel( channelKey: 'basic_channel', channelGroupKey: 'basic_channel', channelName: 'Notificações do App', channelDescription: 'Canal de notificação do Aplicativo', importance: NotificationImportance.Max, channelShowBadge: true, playSound: true, criticalAlerts: true, onlyAlertOnce: true, defaultColor: Colors.green, ledColor: Colors.white, ) ], channelGroups: [ NotificationChannelGroup( channelGroupKey: 'basic_channel_group', channelGroupName: 'group_1') ], debug: true); await AwesomeNotifications() .isNotificationAllowed() .then((isAllowed) async { if (!isAllowed) { await AwesomeNotifications().requestPermissionToSendNotifications(); } }); await AwesomeNotifications().setListeners( onActionReceivedMethod: onActionReceivedMethod, onNotificationCreatedMethod: onNotificationCreatedMethod, onNotificationDisplayedMethod: onNotificationDisplayedMethod, onDismissActionReceivedMethod: onDismissActionReceivedMethod); } static Future onActionReceivedMethod( ReceivedAction receivedAction) async { final payload = receivedAction.payload ?? {}; final extra = receivedAction.body; final handleClick = payload['click_action']; final localId = jsonDecode(payload['local']!)['CLI_ID']; log('payload: $payload'); log('extra: $extra'); switch (handleClick) { case 'visit_request': showDialog( context: AppState().context!, barrierColor: Colors.transparent, barrierDismissible: true, builder: (BuildContext context) { return Dialog( child: SizedBox( width: MediaQuery.of(context).size.width * 0.8, height: MediaQuery.of(context).size.height * 0.6, child: DetailsComponentWidget( buttons: [ FlutterFlowIconButton( icon: const Icon(Icons.done), onPressed: () async { showDialog( context: context, builder: (context) { return AlertDialog( title: Text( FFLocalizations.of(context).getVariableText( ptText: 'Aprovar Visita', enText: 'Approve Visit', ), ), content: Text( FFLocalizations.of(context).getVariableText( ptText: 'Você tem certeza que deseja aprovar essa visita?', enText: 'Are you sure you want to approve this visit?', ), ), backgroundColor: FlutterFlowTheme.of(context) .primaryBackground, actions: [ FFButtonWidget( text: FFLocalizations.of(context) .getVariableText( enText: 'No', ptText: 'Não', ), onPressed: () { Navigator.pop(context); }, options: FFButtonOptions( width: 100, height: 40, color: FlutterFlowTheme.of(context) .primaryBackground, textStyle: TextStyle( color: FlutterFlowTheme.of(context) .primaryText, ), borderSide: BorderSide( color: FlutterFlowTheme.of(context) .primaryBackground, width: 1, ), borderRadius: BorderRadius.circular(10)), ), FFButtonWidget( text: FFLocalizations.of(context) .getVariableText( enText: 'Yes', ptText: 'Sim', ), onPressed: () async { log("payload: $payload"); await answersRequest .call( context, payload['referencia'].toString(), 'L', 'Mensagem', payload['idVisitante'].toString(), ) .then((value) { if (value) { Navigator.pop(context); Navigator.pop(context); } else { Navigator.pop(context); Navigator.pop(context); DialogUtil.errorDefault(context); } }).catchError((e) { Navigator.pop(context); Navigator.pop(context); DialogUtil.errorDefault(context); }); }, options: FFButtonOptions( width: 100, height: 40, color: FlutterFlowTheme.of(context) .primaryBackground, textStyle: TextStyle( color: FlutterFlowTheme.of(context) .primaryText, ), borderSide: BorderSide( color: FlutterFlowTheme.of(context) .primaryBackground, width: 1, ), borderRadius: BorderRadius.circular(10), ), ), ], ); }); }, ), FlutterFlowIconButton( icon: const Icon(Icons.close), onPressed: () async { showAlertDialog( context, FFLocalizations.of(context).getVariableText( ptText: 'Bloquear Visita', enText: 'Block Visit', ), FFLocalizations.of(context).getVariableText( ptText: 'Você tem certeza que deseja bloquear essa visita?', enText: 'Are you sure you want to block this visit?', ), () async { await answersRequest .call( context, payload['referencia'].toString(), 'B', 'Mensagem', payload['idVisitante'].toString(), ) .then((value) { if (value) { Navigator.pop(context); Navigator.pop(context); } else { Navigator.pop(context); Navigator.pop(context); DialogUtil.errorDefault(context); } }).catchError((e) { Navigator.pop(context); Navigator.pop(context); DialogUtil.errorDefault(context); }); }); }, ), ], labelsHashMap: Map.from({ FFLocalizations.of(context).getVariableText( enText: 'Visitor', ptText: 'Visitante', ): payload['nomevisita'], FFLocalizations.of(context).getVariableText( enText: 'Reason', ptText: 'Motivo', ): payload['motivo'], FFLocalizations.of(context).getVariableText( enText: 'Message', ptText: 'Mensagem', ): payload['mensagem'], }), imagePath: 'https://freaccess.com.br/freaccess/getImage.php?cliID=${AppState().cliUUID}&atividade=getFoto&Documento=${payload['documento'] ?? ''}&tipo=E', statusHashMap: [ { FFLocalizations.of(context).getVariableText( enText: 'Active', ptText: 'Ativo', ): FlutterFlowTheme.of(context).warning, }, ], ), ), ); }); break; case 'access': showDialog( context: AppState().context!, barrierColor: Colors.transparent, barrierDismissible: true, builder: (BuildContext context) { return Dialog( backgroundColor: Colors.transparent, child: AccessNotificationModalTemplateComponentWidget( datetime: payload['ACE_DATAHORA'].toString(), drive: payload['ACI_DESCRICAO'].toString(), id: payload['USR_TIPO'].toString() == 'O' ? payload['USR_ID'].toString() == '' ? '0' : payload['USR_ID'].toString() : payload['USR_DOCUMENTO'].toString() == '' ? '0' : payload['USR_DOCUMENTO'].toString(), name: payload['PES_NOME'].toString(), type: payload['USR_TIPO'], ), ); }); break; case 'mensagem': showDialog( context: AppState().context!, barrierColor: Colors.transparent, barrierDismissible: true, builder: (BuildContext context) { return Dialog( child: SizedBox( width: MediaQuery.of(context).size.width * 0.3, height: MediaQuery.of(context).size.height * 0.3, child: MessageNotificationModalTemplateComponentWidget( id: localId, from: payload['remetente'].toString(), to: payload['destinatario'].toString() == 'O' ? 'Morador' : 'Visitante', message: extra.toString().isEmpty ? 'Unknown' : extra.toString(), ), ), ); }); break; default: break; } // showAlertDialog(AppState().context!, 'Test', 'Test', () async {}); } static Future onNotificationCreatedMethod( ReceivedNotification receivedNotification) async {} static Future onNotificationDisplayedMethod( ReceivedNotification receivedNotification) async {} static Future onDismissActionReceivedMethod( ReceivedAction receivedAction) async {} static Future show({ required final String title, required final String body, final String? summary, final Map? payload, final ActionType actionType = ActionType.Default, final NotificationLayout notificationLayout = NotificationLayout.Default, final NotificationCategory? category, final String? bigPicture, final List? actionButtons, final bool scheduled = false, final int? interval, }) async { assert(!scheduled || (scheduled && interval != null)); await AwesomeNotifications().createNotification( content: NotificationContent( id: 0, channelKey: 'basic_channel', title: title, body: body, actionType: actionType, notificationLayout: notificationLayout, summary: summary, category: category, payload: payload, bigPicture: bigPicture, ), actionButtons: actionButtons, schedule: scheduled ? NotificationInterval( interval: interval, timeZone: await AwesomeNotifications().getLocalTimeZoneIdentifier(), preciseAlarm: true) : null); } }