diff options
Diffstat (limited to 'frontend/src/components/shared/NotificationContext.tsx')
-rw-r--r-- | frontend/src/components/shared/NotificationContext.tsx | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/frontend/src/components/shared/NotificationContext.tsx b/frontend/src/components/shared/NotificationContext.tsx new file mode 100644 index 0000000..a8f6454 --- /dev/null +++ b/frontend/src/components/shared/NotificationContext.tsx @@ -0,0 +1,55 @@ +'use client'; + +import { createContext, useContext, useState, ReactNode } from 'react'; +import { Notification, NotificationType } from './Notification'; + +type NotificationData = { + id: string; + type: NotificationType; + message: string; + duration?: number; +}; + +interface NotificationContextType { + showNotification: (type: NotificationType, message: string, duration?: number) => void; + hideNotification: (id: string) => void; +} + +const NotificationContext = createContext<NotificationContextType | undefined>(undefined); + +export function NotificationProvider({ children }: { children: ReactNode }) { + const [notifications, setNotifications] = useState<NotificationData[]>([]); + + const showNotification = (type: NotificationType, message: string, duration?: number) => { + const id = Math.random().toString(36).substring(2, 9); + setNotifications(prev => [...prev, { id, type, message, duration }]); + return id; + }; + + const hideNotification = (id: string) => { + setNotifications(prev => prev.filter(notification => notification.id !== id)); + }; + + return ( + <NotificationContext.Provider value={{ showNotification, hideNotification }}> + {children} + {notifications.map(notification => ( + <Notification + key={notification.id} + type={notification.type} + message={notification.message} + duration={notification.duration} + onClose={() => hideNotification(notification.id)} + /> + ))} + </NotificationContext.Provider> + ); +} + +export function useNotification() { + const context = useContext(NotificationContext); + if (context === undefined) { + throw new Error('useNotification must be used within a NotificationProvider'); + } + return context; +}
\ No newline at end of file |