149 lines
4.5 KiB
Dart
149 lines
4.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'serialization_util.dart';
|
|
import '../backend.dart';
|
|
import '../../flutter_flow/flutter_flow_theme.dart';
|
|
import '../../flutter_flow/flutter_flow_util.dart';
|
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
final _handledMessageIds = <String?>{};
|
|
|
|
class PushNotificationsHandler extends StatefulWidget {
|
|
const PushNotificationsHandler({super.key, required this.child});
|
|
|
|
final Widget child;
|
|
|
|
@override
|
|
_PushNotificationsHandlerState createState() =>
|
|
_PushNotificationsHandlerState();
|
|
}
|
|
|
|
class _PushNotificationsHandlerState extends State<PushNotificationsHandler> {
|
|
bool _loading = false;
|
|
|
|
Future handleOpenedPushNotification() async {
|
|
if (isWeb) {
|
|
return;
|
|
}
|
|
|
|
final notification = await FirebaseMessaging.instance.getInitialMessage();
|
|
if (notification != null) {
|
|
await _handlePushNotification(notification);
|
|
}
|
|
FirebaseMessaging.onMessageOpenedApp.listen(_handlePushNotification);
|
|
}
|
|
|
|
Future _handlePushNotification(RemoteMessage message) async {
|
|
if (_handledMessageIds.contains(message.messageId)) {
|
|
return;
|
|
}
|
|
_handledMessageIds.add(message.messageId);
|
|
|
|
if (mounted) {
|
|
setState(() => _loading = true);
|
|
}
|
|
try {
|
|
final initialPageName = message.data['initialPageName'] as String;
|
|
final initialParameterData = getInitialParameterData(message.data);
|
|
final parametersBuilder = parametersBuilderMap[initialPageName];
|
|
if (parametersBuilder != null) {
|
|
final parameterData = await parametersBuilder(initialParameterData);
|
|
context.pushNamed(
|
|
initialPageName,
|
|
pathParameters: parameterData.pathParameters,
|
|
extra: parameterData.extra,
|
|
);
|
|
}
|
|
} catch (e) {
|
|
print('Error: $e');
|
|
} finally {
|
|
if (mounted) {
|
|
setState(() => _loading = false);
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
handleOpenedPushNotification();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) => _loading
|
|
? Container(
|
|
color: FlutterFlowTheme.of(context).primary,
|
|
child: Image.asset(
|
|
'assets/images/logo.svg',
|
|
fit: BoxFit.cover,
|
|
),
|
|
)
|
|
: widget.child;
|
|
}
|
|
|
|
class ParameterData {
|
|
const ParameterData(
|
|
{this.requiredParams = const {}, this.allParams = const {}});
|
|
final Map<String, String?> requiredParams;
|
|
final Map<String, dynamic> allParams;
|
|
|
|
Map<String, String> get pathParameters => Map.fromEntries(
|
|
requiredParams.entries
|
|
.where((e) => e.value != null)
|
|
.map((e) => MapEntry(e.key, e.value!)),
|
|
);
|
|
Map<String, dynamic> get extra => Map.fromEntries(
|
|
allParams.entries.where((e) => e.value != null),
|
|
);
|
|
|
|
static Future<ParameterData> Function(Map<String, dynamic>) none() =>
|
|
(data) async => const ParameterData();
|
|
}
|
|
|
|
final parametersBuilderMap =
|
|
<String, Future<ParameterData> Function(Map<String, dynamic>)>{
|
|
'LoginPage': (data) async => ParameterData(
|
|
allParams: {
|
|
'device': getParameter<String>(data, 'device'),
|
|
},
|
|
),
|
|
'ForgotPasswordPage': ParameterData.none(),
|
|
'homePage': ParameterData.none(),
|
|
'RegisterPage': ParameterData.none(),
|
|
'WelcomePage': ParameterData.none(),
|
|
'registerVisitorPage': ParameterData.none(),
|
|
'scheduleCompleteVisitPage': (data) async => ParameterData(
|
|
allParams: {
|
|
'visitorStrList': getParameter<String>(data, 'visitorStrList'),
|
|
'visitStartDateStr': getParameter<String>(data, 'visitStartDateStr'),
|
|
'visitEndDateStr': getParameter<String>(data, 'visitEndDateStr'),
|
|
'visitReasonStr': getParameter<String>(data, 'visitReasonStr'),
|
|
'visitLevelStr': getParameter<String>(data, 'visitLevelStr'),
|
|
'visitTempBol': getParameter<bool>(data, 'visitTempBol'),
|
|
'visitObsStr': getParameter<String>(data, 'visitObsStr'),
|
|
},
|
|
),
|
|
'scheduleProvisionalVisitPage': ParameterData.none(),
|
|
'onBoardingPage': ParameterData.none(),
|
|
'fastPassPage': ParameterData.none(),
|
|
'test': ParameterData.none(),
|
|
'peopleOnThePropertyPage': ParameterData.none(),
|
|
};
|
|
|
|
Map<String, dynamic> getInitialParameterData(Map<String, dynamic> data) {
|
|
try {
|
|
final parameterDataStr = data['parameterData'];
|
|
if (parameterDataStr == null ||
|
|
parameterDataStr is! String ||
|
|
parameterDataStr.isEmpty) {
|
|
return {};
|
|
}
|
|
return jsonDecode(parameterDataStr) as Map<String, dynamic>;
|
|
} catch (e) {
|
|
print('Error parsing parameter data: $e');
|
|
return {};
|
|
}
|
|
}
|