diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7b010795..78402ac8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -56,14 +56,14 @@ - + - + diff --git a/lib/backend/notifications/notification_service.dart b/lib/backend/notifications/notification_service.dart index a494b6b6..5b10eb25 100644 --- a/lib/backend/notifications/notification_service.dart +++ b/lib/backend/notifications/notification_service.dart @@ -14,6 +14,254 @@ import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/shared/utils/dialog_util.dart'; +Future onMessageReceived( + Map payload, String? extra, String? handleClick) async { + 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: () { + context.pop(); + }, + 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) { + context.pop(); + context.pop(); + } else { + context.pop(); + context.pop(); + DialogUtil.errorDefault(context); + } + }).catchError((e) { + context.pop(); + context.pop(); + 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) { + context.pop(); + context.pop(); + } else { + context.pop(); + context.pop(); + DialogUtil.errorDefault(context); + } + }).catchError((e) { + context.pop(); + context.pop(); + 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 {}); +} + class NotificationService { static Future initialize() async { await AwesomeNotifications().initialize( @@ -40,7 +288,9 @@ class NotificationService { ], debug: kDebugMode); - await AwesomeNotifications().isNotificationAllowed().then((isAllowed) async { + await AwesomeNotifications() + .isNotificationAllowed() + .then((isAllowed) async { if (!AppState().isRequestOSNotification) { if (!isAllowed) { AppState().isRequestOSNotification = true; @@ -62,251 +312,7 @@ class NotificationService { 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: () { - context.pop(); - }, - 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) { - context.pop(); - context.pop(); - } else { - context.pop(); - context.pop(); - DialogUtil.errorDefault(context); - } - }).catchError((e) { - context.pop(); - context.pop(); - 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) { - context.pop(); - context.pop(); - } else { - context.pop(); - context.pop(); - DialogUtil.errorDefault(context); - } - }).catchError((e) { - context.pop(); - context.pop(); - 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 {}); + onMessageReceived(payload, extra, handleClick); } static Future onNotificationCreatedMethod( diff --git a/lib/main.dart b/lib/main.dart index 19fa0121..3e21b787 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,10 +9,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; -import 'package:hub/backend/api_requests/api_calls.dart'; -import 'package:hub/backend/api_requests/api_manager.dart'; -import 'package:hub/backend/notifications/firebase_messaging_service.dart'; -import 'package:hub/shared/utils/log_util.dart'; import 'package:hub/backend/notifications/notification_service.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; @@ -51,16 +47,16 @@ Future initializeApp() async { usePathUrlStrategy(); } -Future handleMessage(RemoteMessage message) async { +Future foregroundHandleMessage(RemoteMessage message) async { NotificationService.show( title: message.notification!.title!, body: message.notification!.body!, payload: Map.from(message.data)); } -Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { - await Firebase.initializeApp(); - log('Background message: ${message.toMap()}'); +Future _backgroundHandleMessage(RemoteMessage message) async { + log('Handling a background message: ${message.messageId}'); + // Add your message handling logic here } void main() async { @@ -95,17 +91,15 @@ class _AppState extends State { Future.delayed(const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage())); - FirebaseMessaging.onMessage.listen((RemoteMessage message) { - log('Received message: ${message.toMap()}'); - }); + FirebaseMessaging.onMessage.listen(foregroundHandleMessage); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { - log('Message opened: ${message.notification?.body}'); + onMessageReceived(message.data, '', message.data['click_action']); }); - FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + FirebaseMessaging.onBackgroundMessage(_backgroundHandleMessage); FirebaseMessaging.instance.getInitialMessage().then((message) { if (message != null) { - log('Initial message: ${message.notification?.body}'); + _backgroundHandleMessage(message); } }); }