Skip to content

Commit

Permalink
Merge pull request #114 from humhub/102-deletereset-push-token-on-logout
Browse files Browse the repository at this point in the history
Delete/Reset push token on logout
  • Loading branch information
luke- committed Oct 6, 2023
2 parents ca94144 + 1adf91c commit 30e8d86
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 36 deletions.
3 changes: 2 additions & 1 deletion lib/models/channel_message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'dart:convert';

part 'channel_message.g.dart';

enum ChannelAction { showOpener, hideOpener, registerFcmDevice, updateNotificationCount, none }
enum ChannelAction { showOpener, hideOpener, registerFcmDevice, unregisterFcmDevice, updateNotificationCount, none }

class ChannelMessage {
final String type;
Expand All @@ -12,6 +12,7 @@ class ChannelMessage {
if (type == "showOpener") return ChannelAction.showOpener;
if (type == "hideOpener") return ChannelAction.hideOpener;
if (type == "registerFcmDevice") return ChannelAction.registerFcmDevice;
if (type == "unregisterFcmDevice") return ChannelAction.unregisterFcmDevice;
if (type == "updateNotificationCount") return ChannelAction.updateNotificationCount;

return ChannelAction.none;
Expand Down
79 changes: 44 additions & 35 deletions lib/pages/web_view.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:app_settings/app_settings.dart';
Expand Down Expand Up @@ -128,47 +129,15 @@ class WebViewAppState extends ConsumerState<WebViewApp> {
}

_onWebViewCreated(InAppWebViewController controller) async {
headlessWebView = HeadlessInAppWebView();
headlessWebView!.run();
await controller.addWebMessageListener(
WebMessageListener(
jsObjectName: "flutterChannel",
onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async {
logInfo(inMessage);
ChannelMessage message = ChannelMessage.fromJson(inMessage!);
switch (message.action) {
case ChannelAction.showOpener:
ref.read(humHubProvider).setIsHideOpener(false);
ref.read(humHubProvider).clearSafeStorage();
Navigator.of(context).pushNamedAndRemoveUntil(Opener.path, (Route<dynamic> route) => false);
break;
case ChannelAction.hideOpener:
ref.read(humHubProvider).setIsHideOpener(true);
ref.read(humHubProvider).setHash(HumHub.generateHash(32));
break;
case ChannelAction.registerFcmDevice:
String? token = ref.read(pushTokenProvider).value;
if (token != null) {
var postData = Uint8List.fromList(utf8.encode("token=$token"));
URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData);
// Works but it blinks because new navigation request is called on dart level.
/*RegisterPushInAppBrowser(request: request).register();*/

// Works but for admin to see the changes it need to reload a page because a request is called on separate instance.
headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) {
controller.postUrl(url: request.url!, postData: postData);
});
headlessWebView!.run();
}
var status = await Permission.notification.status;
// status.isDenied: The user has previously denied the notification permission
// !status.isGranted: The user has never been asked for the notification permission
if (status.isDenied || !status.isGranted) askForNotificationPermissions();
break;
case ChannelAction.updateNotificationCount:
if (message.count != null) FlutterAppBadger.updateBadgeCount(message.count!);
break;
case ChannelAction.none:
break;
}
await _handleJSMessage(message, headlessWebView!);
},
),
);
Expand Down Expand Up @@ -278,6 +247,46 @@ class WebViewAppState extends ConsumerState<WebViewApp> {
logInfo(jsResponse != null ? jsResponse.toString() : "Script returned null value");
}

Future<void> _handleJSMessage(ChannelMessage message, HeadlessInAppWebView headlessWebView) async {
switch (message.action) {
case ChannelAction.showOpener:
ref.read(humHubProvider).setIsHideOpener(false);
ref.read(humHubProvider).clearSafeStorage();
Navigator.of(context).pushNamedAndRemoveUntil(Opener.path, (Route<dynamic> route) => false);
break;
case ChannelAction.hideOpener:
ref.read(humHubProvider).setIsHideOpener(true);
ref.read(humHubProvider).setHash(HumHub.generateHash(32));
break;
case ChannelAction.registerFcmDevice:
String? token = ref.read(pushTokenProvider).value;
if (token != null) {
var postData = Uint8List.fromList(utf8.encode("token=$token"));
URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData);
await headlessWebView.webViewController.loadUrl(urlRequest: request);
}
var status = await Permission.notification.status;
// status.isDenied: The user has previously denied the notification permission
// !status.isGranted: The user has never been asked for the notification permission
if (status.isDenied || !status.isGranted) askForNotificationPermissions();
break;
case ChannelAction.updateNotificationCount:
if (message.count != null) FlutterAppBadger.updateBadgeCount(message.count!);
break;
case ChannelAction.unregisterFcmDevice:
String? token = ref.read(pushTokenProvider).value;
if (token != null) {
var postData = Uint8List.fromList(utf8.encode("token=$token"));
URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData);
// Works but for admin to see the changes it need to reload a page because a request is called on separate instance.
await headlessWebView.webViewController.loadUrl(urlRequest: request);
}
break;
case ChannelAction.none:
break;
}
}

@override
void dispose() {
super.dispose();
Expand Down

0 comments on commit 30e8d86

Please sign in to comment.