| | |
| | | import React, { createContext, useContext, useState, useCallback } from 'react'; |
| | | import React, { createContext, useContext, useState, useCallback, useMemo } from 'react'; |
| | | import { Snackbar, Alert, Portal, Slide } from '@mui/material'; |
| | | |
| | | const NotificationContext = createContext(); |
| | |
| | | setNotification({ open: true, message, severity }); |
| | | }, []); |
| | | |
| | | const handleClose = () => { |
| | | setNotification({ ...notification, open: false }); |
| | | }; |
| | | const handleClose = useCallback(() => { |
| | | setNotification((prev) => ({ ...prev, open: false })); |
| | | }, []); |
| | | |
| | | const notify = useMemo(() => ({ |
| | | info: (msg) => showNotification(msg, 'info'), |
| | | success: (msg) => showNotification(msg, 'success'), |
| | | warning: (msg) => showNotification(msg, 'warning'), |
| | | error: (msg) => showNotification(msg, 'error'), |
| | | // Optional: If you prefer 'warn' instead of 'warning', uncomment the line below |
| | | // warn: (msg) => showNotification(msg, 'warning'), |
| | | }), [showNotification]); |
| | | |
| | | return ( |
| | | <NotificationContext.Provider value={showNotification}> |
| | | <NotificationContext.Provider value={notify}> |
| | | {children} |
| | | <Portal> |
| | | <Snackbar |
| | | open={notification.open} |
| | | autoHideDuration={4000} |
| | | autoHideDuration={3000} |
| | | onClose={handleClose} |
| | | TransitionComponent={SlideTransition} |
| | | anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} |
| | | sx={{ |
| | | // mt: 12, |
| | | zIndex: 2000, |
| | | }} |
| | | > |
| | | <Alert onClose={handleClose} severity={notification.severity} sx={{ width: '300px', zIndex: 2000 }}> |
| | | <Alert |
| | | onClose={handleClose} |
| | | severity={notification.severity} |
| | | sx={{ width: '300px', zIndex: 2000 }} |
| | | variant="filled" // standard' | 'filled' | 'outlined |
| | | > |
| | | {notification.message} |
| | | </Alert> |
| | | </Snackbar> |
| | |
| | | }; |
| | | |
| | | export const useNotification = () => { |
| | | return useContext(NotificationContext); |
| | | const context = useContext(NotificationContext); |
| | | if (!context) { |
| | | throw new Error('useNotification must be used within a NotificationProvider'); |
| | | } |
| | | return context; |
| | | }; |