43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
/**
|
|
* Контекст для управления всплывающими уведомлениями
|
|
*/
|
|
|
|
'use client';
|
|
|
|
import React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';
|
|
import { Toast, ToastMessage } from '@/components/common/Toast';
|
|
|
|
interface ToastContextType {
|
|
showToast: (message: string, type?: 'success' | 'error' | 'info') => void;
|
|
}
|
|
|
|
const ToastContext = createContext<ToastContextType | null>(null);
|
|
|
|
export function ToastProvider({ children }: { children: ReactNode }) {
|
|
const [messages, setMessages] = useState<ToastMessage[]>([]);
|
|
|
|
const showToast = useCallback((message: string, type: 'success' | 'error' | 'info' = 'info') => {
|
|
const id = Math.random().toString(36).substring(2, 9);
|
|
setMessages((prev) => [...prev, { id, message, type }]);
|
|
}, []);
|
|
|
|
const removeToast = useCallback((id: string) => {
|
|
setMessages((prev) => prev.filter((msg) => msg.id !== id));
|
|
}, []);
|
|
|
|
return (
|
|
<ToastContext.Provider value={{ showToast }}>
|
|
{children}
|
|
<Toast messages={messages} onRemove={removeToast} />
|
|
</ToastContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useToast() {
|
|
const context = useContext(ToastContext);
|
|
if (!context) {
|
|
throw new Error('useToast must be used within ToastProvider');
|
|
}
|
|
return context;
|
|
}
|