import { createContext, useCallback, useContext, useMemo, useRef, useState } from "react"; import type { PropsWithChildren } from "react"; interface ToastCtx { show: (message: string) => void; } const Ctx = createContext({ show: () => {} }); export function ToastProvider({ children }: PropsWithChildren) { const [message, setMessage] = useState(null); const timer = useRef | null>(null); const show = useCallback((msg: string) => { setMessage(msg); if (timer.current) clearTimeout(timer.current); timer.current = setTimeout(() => setMessage(null), 2800); }, []); // Провайдер обёрнут вокруг всего приложения и перерисовывается на каждый тост: // без useMemo новое значение контекста заставляло бы перерисоваться и всех // потребителей, к самому тосту отношения не имеющих. const value = useMemo(() => ({ show }), [show]); return ( {children} {message &&
{message}
}
); } export function useToast(): ToastCtx { return useContext(Ctx); }