@@ -3,12 +3,12 @@ import 'dart:html' as html;
33
44import 'package:flutter/foundation.dart' ;
55import 'package:js_notifications/core/core.dart' ;
6+ import 'package:simple_print/simple_print.dart' ;
67
78import '../const/const.dart' ;
9+ import '../const/sw_events.dart' ;
810import '../core/user_agent.dart' ;
911import '../interop/interop.dart' as interop;
10- import '../utils/utils.dart' ;
11- import '../const/sw_events.dart' ;
1212
1313typedef Consumer <T > = void Function (T t);
1414
@@ -19,7 +19,11 @@ class ServiceWorkerManager {
1919
2020 late final String _scope;
2121
22- ServiceWorkerManager ({this .onNotificationTap, this .onNotificationAction, this .onNotificationDismiss, required String scopeUrl}){
22+ ServiceWorkerManager (
23+ {this .onNotificationTap,
24+ this .onNotificationAction,
25+ this .onNotificationDismiss,
26+ required String scopeUrl}) {
2327 _scope = scopeUrl;
2428 _notificationApi = interop.NotificationsAPI .instance;
2529 _setupServiceWorker ();
@@ -34,7 +38,8 @@ class ServiceWorkerManager {
3438 html.ServiceWorker ? _serviceWorker;
3539
3640 StreamSubscription <html.Event >? _serviceWorkerErrorSubscription;
37- StreamSubscription <html.MessageEvent >? _serviceWorkerMessageStreamSubscription;
41+ StreamSubscription <html.MessageEvent >?
42+ _serviceWorkerMessageStreamSubscription;
3843
3944 static const int platformLimitMac = 2 ;
4045 static const int platformLimitLinux = 2 ;
@@ -62,7 +67,7 @@ class ServiceWorkerManager {
6267 printDebug ("Setting up service worker" );
6368 _webServiceWorkerContainerDelegate = html.window.navigator.serviceWorker;
6469 if (_webServiceWorkerContainerDelegate == null ) {
65- printDebug ("No service worker found." , tag);
70+ printDebug ("No service worker found." , tag: tag );
6671 return ;
6772 }
6873
@@ -75,97 +80,127 @@ class ServiceWorkerManager {
7580 final options = {'scope' : _scope, 'type' : 'module' };
7681
7782 printDebug ("Registering service worker at '/$jsNotificationsSwJs '." );
78- final registration = await delegate.register ("/$jsNotificationsSwJs " , options).catchError ((e) {
83+ final registration = await delegate
84+ .register ("/$jsNotificationsSwJs " , options)
85+ .catchError ((e) {
7986 printDebug (e);
80- printDebug ("Failed to register $jsNotificationsSwJs , please make sure you copied over $jsNotificationsSwJs into your project's web folder e.g. root_project/web/$jsNotificationsSwJs " );
87+ printDebug (
88+ "Failed to register $jsNotificationsSwJs , please make sure you copied over $jsNotificationsSwJs into your project's web folder e.g. root_project/web/$jsNotificationsSwJs " );
8189 throw e;
8290 });
8391
8492 _updateServiceWorker (registration.active ?? registration.installing);
8593 }
8694
8795 void _attachServiceWorkerEvents (html.ServiceWorker serviceWorker) {
88- printDebug ("Attaching service worker event listeners (${serviceWorker .hashCode })" );
89- _serviceWorkerErrorSubscription = serviceWorker.onError.listen (_onServiceWorkerErrorEvent);
96+ printDebug (
97+ "Attaching service worker event listeners (${serviceWorker .hashCode })" );
98+ _serviceWorkerErrorSubscription =
99+ serviceWorker.onError.listen (_onServiceWorkerErrorEvent);
90100 serviceWorker.addEventListener (SWEvents .message, _onServiceWorkerMessage);
91- serviceWorker.addEventListener (SWEvents .statechange, _onServiceWorkerStateChange);
101+ serviceWorker.addEventListener (
102+ SWEvents .statechange, _onServiceWorkerStateChange);
92103 serviceWorker.addEventListener (SWEvents .error, _onServiceWorkerError);
93104 serviceWorker.addEventListener (SWEvents .install, _onServiceWorkerInstall);
94105 serviceWorker.addEventListener (SWEvents .activate, _onServiceWorkerActivate);
95106 serviceWorker.addEventListener (SWEvents .fetch, _onServiceWorkerFetch);
96107 serviceWorker.addEventListener (SWEvents .push, _onServiceWorkerPush);
97- serviceWorker.addEventListener (SWEvents .pushsubscriptionchange, _onServiceWorkerPushSubscriptionChange);
108+ serviceWorker.addEventListener (SWEvents .pushsubscriptionchange,
109+ _onServiceWorkerPushSubscriptionChange);
98110 serviceWorker.addEventListener (SWEvents .sync , _onServiceWorkerSync);
99111 }
100112
101113 void _detachServiceWorkerEvents (html.ServiceWorker serviceWorker) {
102- printDebug ("Detaching service worker event listeners (${serviceWorker .hashCode })" );
103- serviceWorker.removeEventListener (SWEvents .message, _onServiceWorkerMessage);
104- serviceWorker.removeEventListener (SWEvents .statechange, _onServiceWorkerStateChange);
114+ printDebug (
115+ "Detaching service worker event listeners (${serviceWorker .hashCode })" );
116+ serviceWorker.removeEventListener (
117+ SWEvents .message, _onServiceWorkerMessage);
118+ serviceWorker.removeEventListener (
119+ SWEvents .statechange, _onServiceWorkerStateChange);
105120 serviceWorker.removeEventListener (SWEvents .error, _onServiceWorkerError);
106- serviceWorker.removeEventListener (SWEvents .install, _onServiceWorkerInstall);
107- serviceWorker.removeEventListener (SWEvents .activate, _onServiceWorkerActivate);
121+ serviceWorker.removeEventListener (
122+ SWEvents .install, _onServiceWorkerInstall);
123+ serviceWorker.removeEventListener (
124+ SWEvents .activate, _onServiceWorkerActivate);
108125 serviceWorker.removeEventListener (SWEvents .fetch, _onServiceWorkerFetch);
109126 serviceWorker.removeEventListener (SWEvents .push, _onServiceWorkerPush);
110- serviceWorker.removeEventListener (SWEvents .pushsubscriptionchange, _onServiceWorkerPushSubscriptionChange);
127+ serviceWorker.removeEventListener (SWEvents .pushsubscriptionchange,
128+ _onServiceWorkerPushSubscriptionChange);
111129 serviceWorker.removeEventListener (SWEvents .sync , _onServiceWorkerSync);
112130 }
113131
114- void _attachServiceWorkerContainerEvents (html.ServiceWorkerContainer serviceWorkerContainer) {
115- printDebug ("Attaching service worker container event listeners (${serviceWorkerContainer .hashCode })" );
116- _serviceWorkerMessageStreamSubscription = serviceWorkerContainer.onMessage.listen (_onServiceWorkerContainerMessageEvent);
117- serviceWorkerContainer.addEventListener (SWEvents .controllerchange, _onServiceWorkerContainerControllerChange);
118- serviceWorkerContainer.addEventListener (SWEvents .statechange, _onServiceWorkerContainerStateChange);
119- serviceWorkerContainer.addEventListener (SWEvents .error, _onServiceWorkerContainerError);
120- serviceWorkerContainer.addEventListener (SWEvents .install, _onServiceWorkerContainerInstall);
121- serviceWorkerContainer.addEventListener (SWEvents .activate, _onServiceWorkerContainerActivate);
122- serviceWorkerContainer.addEventListener (SWEvents .fetch, _onServiceWorkerContainerFetch);
123- }
124-
125- void _detachServiceWorkerContainerEvents (html.ServiceWorkerContainer serviceWorkerContainer) {
126- printDebug ("Detaching service worker container event listeners (${serviceWorkerContainer .hashCode })" );
132+ void _attachServiceWorkerContainerEvents (
133+ html.ServiceWorkerContainer serviceWorkerContainer) {
134+ printDebug (
135+ "Attaching service worker container event listeners (${serviceWorkerContainer .hashCode })" );
136+ _serviceWorkerMessageStreamSubscription = serviceWorkerContainer.onMessage
137+ .listen (_onServiceWorkerContainerMessageEvent);
138+ serviceWorkerContainer.addEventListener (
139+ SWEvents .controllerchange, _onServiceWorkerContainerControllerChange);
140+ serviceWorkerContainer.addEventListener (
141+ SWEvents .statechange, _onServiceWorkerContainerStateChange);
142+ serviceWorkerContainer.addEventListener (
143+ SWEvents .error, _onServiceWorkerContainerError);
144+ serviceWorkerContainer.addEventListener (
145+ SWEvents .install, _onServiceWorkerContainerInstall);
146+ serviceWorkerContainer.addEventListener (
147+ SWEvents .activate, _onServiceWorkerContainerActivate);
148+ serviceWorkerContainer.addEventListener (
149+ SWEvents .fetch, _onServiceWorkerContainerFetch);
150+ }
151+
152+ void _detachServiceWorkerContainerEvents (
153+ html.ServiceWorkerContainer serviceWorkerContainer) {
154+ printDebug (
155+ "Detaching service worker container event listeners (${serviceWorkerContainer .hashCode })" );
127156 _serviceWorkerMessageStreamSubscription? .cancel ();
128- serviceWorkerContainer.removeEventListener (SWEvents .controllerchange, _onServiceWorkerContainerControllerChange);
129- serviceWorkerContainer.removeEventListener (SWEvents .statechange, _onServiceWorkerContainerStateChange);
130- serviceWorkerContainer.removeEventListener (SWEvents .error, _onServiceWorkerContainerError);
131- serviceWorkerContainer.removeEventListener (SWEvents .install, _onServiceWorkerContainerInstall);
132- serviceWorkerContainer.removeEventListener (SWEvents .activate, _onServiceWorkerContainerActivate);
133- serviceWorkerContainer.removeEventListener (SWEvents .fetch, _onServiceWorkerContainerFetch);
157+ serviceWorkerContainer.removeEventListener (
158+ SWEvents .controllerchange, _onServiceWorkerContainerControllerChange);
159+ serviceWorkerContainer.removeEventListener (
160+ SWEvents .statechange, _onServiceWorkerContainerStateChange);
161+ serviceWorkerContainer.removeEventListener (
162+ SWEvents .error, _onServiceWorkerContainerError);
163+ serviceWorkerContainer.removeEventListener (
164+ SWEvents .install, _onServiceWorkerContainerInstall);
165+ serviceWorkerContainer.removeEventListener (
166+ SWEvents .activate, _onServiceWorkerContainerActivate);
167+ serviceWorkerContainer.removeEventListener (
168+ SWEvents .fetch, _onServiceWorkerContainerFetch);
134169 }
135170
136171 /// Service Worker Container event listeners
137172 void _onServiceWorkerContainerControllerChange (html.Event event) {
138- printDebug ("Service worker container controller changed: $event " , tag);
173+ printDebug ("Service worker container controller changed: $event " , tag: tag );
139174 _updateServiceWorker (_webServiceWorkerContainerDelegate? .controller);
140175 }
141176
142177 void _onServiceWorkerContainerStateChange (html.Event event) {
143- printDebug ("Service worker container state change: $event " , tag);
178+ printDebug ("Service worker container state change: $event " , tag: tag );
144179 }
145180
146181 void _onServiceWorkerContainerError (html.Event event) {
147- printDebug ("Service worker container error: $event " , tag);
182+ printDebug ("Service worker container error: $event " , tag: tag );
148183 }
149184
150185 void _onServiceWorkerContainerInstall (html.Event event) {
151- printDebug ("Service worker container install: $event " , tag);
186+ printDebug ("Service worker container install: $event " , tag: tag );
152187 }
153188
154189 void _onServiceWorkerContainerActivate (html.Event event) {
155- printDebug ("Service worker container activate: $event " , tag);
190+ printDebug ("Service worker container activate: $event " , tag: tag );
156191 _updateServiceWorker (_webServiceWorkerContainerDelegate? .controller);
157192 }
158193
159194 void _onServiceWorkerContainerFetch (html.Event event) {
160- printDebug ("Service worker container fetch: $event " , tag);
195+ printDebug ("Service worker container fetch: $event " , tag: tag );
161196 }
162197
163198 void _onServiceWorkerContainerMessageEvent (html.MessageEvent event) {
164- printDebug ("Service worker container message event: $event " , tag);
199+ printDebug ("Service worker container message event: $event " , tag: tag );
165200 final map = Map <String , dynamic >.from (event.data);
166201 final result = NotificationActionResult .fromJson (map);
167202 final type = map["type" ];
168- if (type == SWEvents .click) {
203+ if (type == SWEvents .click) {
169204 /// Custom notification event, not part of the standard Notification API.
170205 /// Used to describe clicking on a notification.
171206 /// This may be confused with an empty notification action event.
@@ -180,7 +215,7 @@ class ServiceWorkerManager {
180215 /// The above action with title "Open Window" will be considered a tap action as the service worker does not
181216 /// distinguish between a normal notification click and a notification action with an empty action string
182217 /// (see "Open Window" action above).
183- if (result.action == null || result.action! .isEmpty) {
218+ if (result.action == null || result.action! .isEmpty) {
184219 onNotificationTap? .call (result);
185220 } else {
186221 onNotificationAction? .call (result);
@@ -194,43 +229,44 @@ class ServiceWorkerManager {
194229
195230 /// Service Worker event listeners
196231 void _onServiceWorkerMessage (html.Event event) {
197- printDebug ("Service worker message: $event " , tag);
232+ printDebug ("Service worker message: $event " , tag: tag );
198233 }
199234
200235 void _onServiceWorkerStateChange (html.Event event) {
201- printDebug ("Service worker state change: ${_serviceWorker ?.state }" , tag);
236+ printDebug ("Service worker state change: ${_serviceWorker ?.state }" ,
237+ tag: tag);
202238 }
203239
204240 void _onServiceWorkerError (html.Event event) {
205- printDebug ("Service worker error: $event " , tag);
241+ printDebug ("Service worker error: $event " , tag: tag );
206242 }
207243
208244 void _onServiceWorkerErrorEvent (html.Event event) {
209- printDebug ("Service worker error event: $event " , tag);
245+ printDebug ("Service worker error event: $event " , tag: tag );
210246 }
211247
212248 void _onServiceWorkerInstall (html.Event event) {
213- printDebug ("Service worker install: $event " , tag);
249+ printDebug ("Service worker install: $event " , tag: tag );
214250 }
215251
216252 void _onServiceWorkerActivate (html.Event event) {
217- printDebug ("Service worker activate: $event " , tag);
253+ printDebug ("Service worker activate: $event " , tag: tag );
218254 }
219255
220256 void _onServiceWorkerFetch (html.Event event) {
221- printDebug ("Service worker fetch: $event " , tag);
257+ printDebug ("Service worker fetch: $event " , tag: tag );
222258 }
223259
224260 void _onServiceWorkerPush (html.Event event) {
225- printDebug ("Service worker state change: $event " , tag);
261+ printDebug ("Service worker state change: $event " , tag: tag );
226262 }
227263
228264 void _onServiceWorkerPushSubscriptionChange (html.Event event) {
229- printDebug ("Service worker push subscription change: $event " , tag);
265+ printDebug ("Service worker push subscription change: $event " , tag: tag );
230266 }
231267
232268 void _onServiceWorkerSync (html.Event event) {
233- printDebug ("Service worker sync: $event " , tag);
269+ printDebug ("Service worker sync: $event " , tag: tag );
234270 }
235271
236272 Future <void > postNotification (
@@ -248,37 +284,53 @@ class ServiceWorkerManager {
248284
249285 void _checkActionCountLimitation (interop.JSNotification notification) {
250286 final actions = notification.options? .actions ?? [];
251- if (actions.isEmpty) {
287+ if (actions.isEmpty) {
252288 return ;
253289 }
254290
255- if (! kIsWeb) {
256- return ;
291+ if (! kIsWeb) {
292+ return ;
257293 }
258294
259- switch (platformFromUserAgent) {
295+ switch (platformFromUserAgent) {
260296 case Platform .macos:
261- if (actions.length > platformLimitMac) {
262- final ignoredActions = actions.sublist (platformLimitMac).map ((e) => "'${e .action }'" ).join (", " );
263- printDebug ("macOS Notification centre only supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
297+ if (actions.length > platformLimitMac) {
298+ final ignoredActions = actions
299+ .sublist (platformLimitMac)
300+ .map ((e) => "'${e .action }'" )
301+ .join (", " );
302+ printDebug (
303+ "macOS Notification centre only supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
264304 }
265305 break ;
266306 case Platform .linux:
267- if (actions.length > platformLimitLinux) {
268- final ignoredActions = actions.sublist (platformLimitLinux).map ((e) => "'${e .action }'" ).join (", " );
269- printDebug ("Linux platforms usually supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
307+ if (actions.length > platformLimitLinux) {
308+ final ignoredActions = actions
309+ .sublist (platformLimitLinux)
310+ .map ((e) => "'${e .action }'" )
311+ .join (", " );
312+ printDebug (
313+ "Linux platforms usually supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
270314 }
271315 break ;
272316 case Platform .windows:
273- if (actions.length > platformLimitWin) {
274- final ignoredActions = actions.sublist (platformLimitWin).map ((e) => "'${e .action }'" ).join (", " );
275- printDebug ("Windows 10 Toast Notification only supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
317+ if (actions.length > platformLimitWin) {
318+ final ignoredActions = actions
319+ .sublist (platformLimitWin)
320+ .map ((e) => "'${e .action }'" )
321+ .join (", " );
322+ printDebug (
323+ "Windows 10 Toast Notification only supports up to 3 actions, ignored the following actions: [$ignoredActions ]" );
276324 }
277325 case Platform .unknown:
278326 default :
279- if (actions.length > platformLimitDefault) {
280- final ignoredActions = actions.sublist (platformLimitDefault).map ((e) => "'${e .action }'" ).join (", " );
281- printDebug ("Could not determine the platform from user agent, most platforms ignore actions beyond 3, ignored the following actions may be ignored: [$ignoredActions ]" );
327+ if (actions.length > platformLimitDefault) {
328+ final ignoredActions = actions
329+ .sublist (platformLimitDefault)
330+ .map ((e) => "'${e .action }'" )
331+ .join (", " );
332+ printDebug (
333+ "Could not determine the platform from user agent, most platforms ignore actions beyond 3, ignored the following actions may be ignored: [$ignoredActions ]" );
282334 }
283335 return ;
284336 }
0 commit comments