Skip to content

Commit c85af4d

Browse files
authored
Merge pull request #2734 from daostack/CW-service-worker-performance
Service worker performance
2 parents 7eab570 + dc5b99a commit c85af4d

File tree

3 files changed

+40
-13
lines changed

3 files changed

+40
-13
lines changed

src/pages/App/handlers/NotificationsHandler/NotificationsHandler.tsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,60 @@ const NotificationsHandler: FC = () => {
88
const userId = user?.uid;
99
const [isRegistered, setIsRegistered] = useState(false);
1010

11+
function initServiceWorker() {
12+
navigator.serviceWorker
13+
.register("/firebase-messaging-sw.js")
14+
.then((registration) => {
15+
setIsRegistered(true);
16+
return registration;
17+
})
18+
.catch((err) => {
19+
console.log("ServiceWorker registration failed: ", err);
20+
});
21+
}
22+
23+
// Check if the service worker is already registered or register a new one
1124
useEffect(() => {
1225
if ("serviceWorker" in navigator) {
1326
navigator.serviceWorker
14-
.register("/firebase-messaging-sw.js")
15-
.then((registration) => {
16-
setIsRegistered(true);
17-
return registration;
27+
.getRegistration("/firebase-messaging-sw.js")
28+
.then((existingRegistration) => {
29+
if (existingRegistration) {
30+
setIsRegistered(true);
31+
} else {
32+
initServiceWorker();
33+
}
34+
35+
return;
1836
})
1937
.catch((err) => {
20-
console.log("ServiceWorker registration failed: ", err);
38+
console.log("Error checking service worker registration: ", err);
2139
});
2240
}
2341
}, []);
2442

43+
// Handle notification permissions and foreground message listener
2544
useEffect(() => {
26-
if (!userId && !isRegistered) {
45+
if (!userId || !isRegistered) {
2746
return;
2847
}
2948

3049
let unsubscribeOnMessage;
3150
(async () => {
3251
const hasPermissions = await NotificationService.requestPermissions();
33-
if (hasPermissions) {
34-
await NotificationService.saveFCMToken();
35-
36-
unsubscribeOnMessage = NotificationService.onForegroundMessage();
52+
if (!hasPermissions) {
53+
console.log("Notification permissions denied");
54+
return;
3755
}
56+
57+
await NotificationService.saveFCMToken();
58+
unsubscribeOnMessage = NotificationService.onForegroundMessage();
3859
})();
3960

4061
return () => {
41-
unsubscribeOnMessage && unsubscribeOnMessage();
62+
if (unsubscribeOnMessage) {
63+
unsubscribeOnMessage();
64+
}
4265
};
4366
}, [userId, isRegistered]);
4467

src/shared/components/Header/Header.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useDispatch, useSelector } from "react-redux";
33
import { Link, RouteProps, useHistory } from "react-router-dom";
44
import classNames from "classnames";
55
import { Routes } from "@/pages/MyAccount/components/Routes";
6+
import { NotificationService } from "@/services";
67
import { Loader } from "@/shared/components";
78
import {
89
useAnyMandatoryRoles,
@@ -82,7 +83,8 @@ const Header = () => {
8283
setShowAccountLinks(isMyAccountRoute);
8384
}, [showMenu, isMyAccountRoute]);
8485

85-
const handleLogIn = useCallback(() => {
86+
const handleLogIn = useCallback(async () => {
87+
await NotificationService.requestPermissions();
8688
dispatch(setLoginModalState({ isShowing: true }));
8789
setShowMenu(false);
8890
}, [dispatch]);
@@ -116,7 +118,8 @@ const Header = () => {
116118
dispatch(logOut());
117119
};
118120

119-
const handleLaunchApp = () => {
121+
const handleLaunchApp = async () => {
122+
await NotificationService.requestPermissions();
120123
history.push(ROUTE_PATHS.INBOX);
121124
};
122125

src/shared/utils/firebase.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function handlePersistenceError(err: any) {
3030
clearFirestoreCache();
3131
} else {
3232
console.error("Error enabling persistence:", err);
33+
reinitializeFirestoreWithPersistence();
3334
}
3435
}
3536

0 commit comments

Comments
 (0)