waveterm/frontend/app/notification/updatenotifier.tsx
2024-11-15 21:26:16 -08:00

99 lines
3.4 KiB
TypeScript

// Copyright 2024, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import { atoms, isDev, pushNotification } from "@/store/global";
import { useAtomValue } from "jotai";
import { useEffect } from "react";
export const useUpdateNotifier = () => {
const appUpdateStatus = useAtomValue(atoms.updaterStatusAtom);
useEffect(() => {
let notification: NotificationType | null = null;
switch (appUpdateStatus) {
case "ready":
notification = {
id: "update-notification",
icon: "arrows-rotate",
title: "Update Available",
message: "A new update is available and ready to be installed.",
timestamp: new Date().toLocaleString(),
type: "update",
actions: [
{
label: "Install Now",
actionKey: "installUpdate",
color: "green",
disabled: false,
},
],
};
break;
case "downloading":
notification = {
id: "update-notification",
icon: "arrows-rotate",
title: "Downloading Update",
message: "The update is currently being downloaded.",
timestamp: new Date().toLocaleString(),
type: "update",
actions: [
{
label: "Downloading...",
actionKey: "",
color: "green",
disabled: true,
},
],
};
break;
case "installing":
notification = {
id: "update-notification",
icon: "arrows-rotate",
title: "Installing Update",
message: "The update is currently being installed.",
timestamp: new Date().toLocaleString(),
type: "update",
actions: [
{
label: "Installing...",
actionKey: "",
color: "green",
disabled: true,
},
],
};
break;
case "error":
notification = {
id: "update-notification",
icon: "circle-exclamation",
title: "Update Error",
message: "An error occurred during the update process.",
timestamp: new Date().toLocaleString(),
type: "update",
actions: [
{
label: "Retry Update",
actionKey: "retryUpdate",
color: "green",
disabled: false,
},
],
};
break;
}
if (!isDev()) return;
if (notification) {
pushNotification(notification);
}
}, [appUpdateStatus]);
};