import type { UnlistenFn } from '@tauri-apps/api/event'; import type { NotificationData } from '~ui/components/overlay/notifications/NotificationComponent'; import { events } from '@onelauncher/client/bindings'; import { randomString } from '~utils'; import { type Accessor, type Context, createContext, createSignal, onCleanup, onMount, type ParentProps, type Signal, useContext } from 'solid-js'; type Notifications = Record; interface HookReturn { list: Accessor; set: (id: string, data: NotificationData) => void; create: (data: NotificationData) => void; clear: () => void; } const NotificationContext = createContext() as Context>; export function NotificationProvider(props: ParentProps) { const [notifications, setNotifications] = createSignal({}); let unlisten: UnlistenFn | undefined; onMount(() => { events.ingressPayload.listen((e) => { setNotifications(notifications => ({ ...notifications, [e.payload.ingress_uuid]: { title: e.payload.event.type.replaceAll('_', ' '), message: e.payload.message, fraction: e.payload.fraction ?? undefined, }, })); }).then(u => unlisten = u); }); onCleanup(() => { unlisten?.(); }); return ( {props.children} ); } function useNotifications(): HookReturn { const [notifications, setNotifications] = useContext(NotificationContext); const ctx = { list: notifications, set: (id, data) => setNotifications(notifications => ({ ...notifications, [id]: data })), create: data => ctx.set(randomString(6), data), clear: () => setNotifications({}), } satisfies HookReturn; return ctx; } export default useNotifications;