diff --git a/frontend/src/shared/ui/toast-store.tsx b/frontend/src/shared/ui/toast-store.tsx deleted file mode 100644 index e34abc4..0000000 --- a/frontend/src/shared/ui/toast-store.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { - createContext, - useCallback, - useContext, - useMemo, - useState, - type ReactNode, -} from 'react' - -type ToastVariant = 'default' | 'success' | 'error' -export type ToastItem = { id: number; message: string; variant: ToastVariant } - -let nextId = 1 -let pushImpl: ((message: string, variant: ToastVariant) => void) | null = null - -type ToastContextValue = { - toasts: ToastItem[] - dismiss: (id: number) => void -} - -const ToastContext = createContext(null) - -export function ToastProvider({ children }: { children: ReactNode }) { - const [toasts, setToasts] = useState([]) - - const push = useCallback((message: string, variant: ToastVariant) => { - setToasts((prev) => [...prev, { id: nextId++, message, variant }]) - }, []) - - const dismiss = useCallback((id: number) => { - setToasts((prev) => prev.filter((t) => t.id !== id)) - }, []) - - pushImpl = push - - // Литерал в value пересоздавался бы на каждый рендер провайдера и перерисовывал всех потребителей - // контекста, даже когда список тостов не менялся. - const value = useMemo(() => ({ toasts, dismiss }), [toasts, dismiss]) - - return {children} -} - -export function useToastContext() { - const ctx = useContext(ToastContext) - if (!ctx) throw new Error('useToastContext must be used within ToastProvider') - return ctx -} - -/** Императивный вызов из любого места (не только компонентов). */ -export const toast = { - success: (message: string) => pushImpl?.(message, 'success'), - error: (message: string) => pushImpl?.(message, 'error'), - message: (message: string) => pushImpl?.(message, 'default'), -}