Remove ToastProvider and related toast context functionality to streamline UI components and eliminate unused code. This change enhances overall code maintainability and reduces bundle size.
This commit is contained in:
@@ -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<ToastContextValue | null>(null)
|
|
||||||
|
|
||||||
export function ToastProvider({ children }: { children: ReactNode }) {
|
|
||||||
const [toasts, setToasts] = useState<ToastItem[]>([])
|
|
||||||
|
|
||||||
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 <ToastContext value={value}>{children}</ToastContext>
|
|
||||||
}
|
|
||||||
|
|
||||||
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'),
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user