Skip to content

Commit 51578d2

Browse files
committed
feat: added simple_print for easy logging
1 parent 4d12f0f commit 51578d2

File tree

4 files changed

+126
-80
lines changed

4 files changed

+126
-80
lines changed

lib/js_notifications_web.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:flutter_web_plugins/flutter_web_plugins.dart';
99
import 'package:js_notifications/const/const.dart';
1010
import 'package:js_notifications/interop/interop.dart' as interop;
1111
import 'package:js_notifications/managers/service_worker_manager.dart';
12+
import 'package:simple_print/simple_print.dart';
1213
import 'package:uuid/uuid.dart';
1314
import 'package:web/web.dart' as web;
1415

@@ -33,6 +34,7 @@ class JsNotificationsWeb extends JsNotificationsPlatform {
3334

3435
/// Constructs a JsNotificationsWeb
3536
JsNotificationsWeb._() {
37+
setAppTag("js_notifications");
3638
_setup();
3739
_startEventListeners();
3840
}

lib/managers/service_worker_manager.dart

Lines changed: 123 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import 'dart:html' as html;
33

44
import 'package:flutter/foundation.dart';
55
import 'package:js_notifications/core/core.dart';
6+
import 'package:simple_print/simple_print.dart';
67

78
import '../const/const.dart';
9+
import '../const/sw_events.dart';
810
import '../core/user_agent.dart';
911
import '../interop/interop.dart' as interop;
10-
import '../utils/utils.dart';
11-
import '../const/sw_events.dart';
1212

1313
typedef 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
}

lib/utils/utils.dart

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
import 'package:flutter/foundation.dart';
2-
3-
void printDebug(dynamic message, [String? tag]) {
4-
if (kDebugMode) {
5-
String m = (tag != null) ? '[$tag] $message' : message;
6-
print(m);
7-
}
8-
}
9-
101
extension StringExtension on String {
112
String capitalize() {
123
if(length == 0) return this;

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies:
1515
web: ^0.5.1
1616
plugin_platform_interface: ^2.0.2
1717
uuid: ^4.5.1
18+
simple_print: 0.0.1+2
1819

1920
dev_dependencies:
2021
flutter_test:

0 commit comments

Comments
 (0)