aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/app/service-worker.tsx
blob: 2dc7fb6e23776d946112e3ccc030a988ea7a5ade (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import React from "react";
import { useTranslation } from "react-i18next";
import { Button } from "react-bootstrap";

import { pushAlert } from "./services/alert";

if ("serviceWorker" in navigator) {
  let isThisTriggerUpgrade = false;

  const upgradeSuccessLocalStorageKey = "TIMELINE_UPGRADE_SUCCESS";

  if (window.localStorage.getItem(upgradeSuccessLocalStorageKey)) {
    pushAlert({
      message: {
        type: "i18n",
        key: "serviceWorker.upgradeSuccess",
      },
      type: "success",
    });
    window.localStorage.removeItem(upgradeSuccessLocalStorageKey);
  }

  void import("workbox-window").then(({ Workbox, messageSW }) => {
    const wb = new Workbox("/sw.js");
    let registration: ServiceWorkerRegistration | undefined;

    // externalactivated is not usable but I still use its name.
    wb.addEventListener("controlling", () => {
      const upgradeReload = (): void => {
        window.localStorage.setItem(upgradeSuccessLocalStorageKey, "true");
        window.location.reload();
      };

      if (isThisTriggerUpgrade) {
        upgradeReload();
      } else {
        const Message: React.FC = () => {
          const { t } = useTranslation();
          return (
            <>
              {t("serviceWorker.externalActivatedPrompt")}
              <Button
                variant="outline-success"
                size="sm"
                onClick={upgradeReload}
              >
                {t("serviceWorker.reloadNow")}
              </Button>
            </>
          );
        };

        pushAlert({
          message: Message,
          dismissTime: "never",
          type: "warning",
        });
      }
    });

    wb.addEventListener("activated", (event) => {
      if (!event.isUpdate) {
        pushAlert({
          message: {
            type: "i18n",
            key: "serviceWorker.availableOffline",
          },
          type: "success",
        });
      }
    });

    // Add an event listener to detect when the registered
    // service worker has installed but is waiting to activate.
    wb.addEventListener("waiting", (): void => {
      const upgrade = (): void => {
        isThisTriggerUpgrade = true;
        if (registration && registration.waiting) {
          // Send a message to the waiting service worker,
          // instructing it to activate.
          // Note: for this to work, you have to add a message
          // listener in your service worker. See below.
          void messageSW(registration.waiting, { type: "SKIP_WAITING" });
        }
      };

      const UpgradeMessage: React.FC = () => {
        const { t } = useTranslation();
        return (
          <>
            {t("serviceWorker.upgradePrompt")}
            <Button variant="outline-success" size="sm" onClick={upgrade}>
              {t("serviceWorker.upgradeNow")}
            </Button>
          </>
        );
      };

      pushAlert({
        message: UpgradeMessage,
        dismissTime: "never",
        type: "success",
      });
    });

    void wb.register().then((reg) => {
      registration = reg;
    });
  });
}