diff options
Diffstat (limited to 'packages/web-util/src/hooks')
-rw-r--r-- | packages/web-util/src/hooks/index.ts | 6 | ||||
-rw-r--r-- | packages/web-util/src/hooks/useNotifications.ts | 44 |
2 files changed, 28 insertions, 22 deletions
diff --git a/packages/web-util/src/hooks/index.ts b/packages/web-util/src/hooks/index.ts index a3a2053e6..f6c74ff22 100644 --- a/packages/web-util/src/hooks/index.ts +++ b/packages/web-util/src/hooks/index.ts @@ -1,11 +1,7 @@ export { useLang } from "./useLang.js"; export { useLocalStorage, buildStorageKey } from "./useLocalStorage.js"; export { useMemoryStorage } from "./useMemoryStorage.js"; -export { - useNotifications, - notifyError, - notifyInfo, -} from "./useNotifications.js"; +export * from "./useNotifications.js"; export { useAsyncAsHook, HookError, diff --git a/packages/web-util/src/hooks/useNotifications.ts b/packages/web-util/src/hooks/useNotifications.ts index 733950592..e9e8a240b 100644 --- a/packages/web-util/src/hooks/useNotifications.ts +++ b/packages/web-util/src/hooks/useNotifications.ts @@ -4,13 +4,13 @@ import { memoryMap } from "../index.browser.js"; export type NotificationMessage = ErrorNotification | InfoNotification; -interface ErrorNotification { +export interface ErrorNotification { type: "error"; title: TranslatedString; description?: TranslatedString; debug?: string; } -interface InfoNotification { +export interface InfoNotification { type: "info"; title: TranslatedString; } @@ -18,33 +18,43 @@ interface InfoNotification { const storage = memoryMap<Map<string, NotificationMessage>>(); const NOTIFICATION_KEY = "notification"; +export function notify(notif: NotificationMessage): void { + const currentState: Map<string, NotificationMessage> = + storage.get(NOTIFICATION_KEY) ?? new Map(); + const newState = currentState.set(hash(notif), notif); + storage.set(NOTIFICATION_KEY, newState); +} export function notifyError( title: TranslatedString, description: TranslatedString | undefined, debug?: any, ) { - const currentState: Map<string, NotificationMessage> = - storage.get(NOTIFICATION_KEY) ?? new Map(); - - const notif = { + notify({ type: "error" as const, title, description, debug, - }; - const newState = currentState.set(hash(notif), notif); - storage.set(NOTIFICATION_KEY, newState); + }); +} +export function notifyException( + title: TranslatedString, + ex: Error, +) { + notify({ + type: "error" as const, + title, + description: ex.message as TranslatedString, + debug: ex.stack, + }); } export function notifyInfo(title: TranslatedString) { - const currentState: Map<string, NotificationMessage> = - storage.get(NOTIFICATION_KEY) ?? new Map(); - - const notif = { type: "info" as const, title }; - const newState = currentState.set(hash(notif), notif); - storage.set(NOTIFICATION_KEY, newState); + notify({ + type: "info" as const, + title, + }); } -type Notification = { +export type Notification = { message: NotificationMessage; remove: () => void; }; @@ -54,7 +64,7 @@ export function useNotifications(): Notification[] { useEffect(() => { return storage.onUpdate(NOTIFICATION_KEY, () => { const mem = storage.get(NOTIFICATION_KEY) ?? new Map(); - setter(mem); + setter(structuredClone(mem)); }); }); |