Alternative web application for the
pdsadmin command
1import { atom, useAtomValue, useSetAtom } from "jotai";
2import { useMemo } from "react";
3
4type Toast = {
5 id: string;
6 message: string;
7 level: "success" | "error";
8 removing?: boolean;
9};
10
11const baseAtom = atom<Toast[]>([]);
12
13const MAX_TOAST_COUNT = 3;
14const REMOVE_DELAY = 3000;
15
16const pushToastAtom = atom(
17 null,
18 (_, set, message: string, level: Toast["level"]) => {
19 const newToast = { message, level, id: `${Date.now()}` };
20 set(baseAtom, (prev) => [...prev, newToast].slice(-MAX_TOAST_COUNT));
21
22 setTimeout(() => {
23 set(baseAtom, (prev) => prev.filter((item) => item.id !== newToast.id));
24 }, REMOVE_DELAY);
25 },
26);
27
28export const useToasts = () => useAtomValue(baseAtom);
29
30export const useToast = () => {
31 const pushToast = useSetAtom(pushToastAtom);
32 return useMemo(
33 () => ({
34 success: (message: string) => pushToast(message, "success"),
35 error: (message: string) => pushToast(message, "error"),
36 }),
37 [pushToast],
38 );
39};