import React, { createContext, useContext, useState, useCallback, useMemo } from 'react';
|
import { Snackbar, Alert, Portal, Slide } from '@mui/material';
|
|
const NotificationContext = createContext();
|
|
const SlideTransition = (props) => {
|
return <Slide {...props} direction="up" />;
|
}
|
|
export const NotificationProvider = ({ children }) => {
|
const [notification, setNotification] = useState({
|
open: false,
|
message: '',
|
severity: 'info',
|
});
|
|
const showNotification = useCallback((message, severity = 'info') => {
|
setNotification({ open: true, message, severity });
|
}, []);
|
|
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={notify}>
|
{children}
|
<Portal>
|
<Snackbar
|
open={notification.open}
|
autoHideDuration={3000}
|
onClose={handleClose}
|
TransitionComponent={SlideTransition}
|
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
|
sx={{
|
zIndex: 2000,
|
}}
|
>
|
<Alert
|
onClose={handleClose}
|
severity={notification.severity}
|
sx={{ width: '300px', zIndex: 2000 }}
|
variant="filled" // standard' | 'filled' | 'outlined
|
>
|
{notification.message}
|
</Alert>
|
</Snackbar>
|
</Portal>
|
</NotificationContext.Provider>
|
);
|
};
|
|
export const useNotification = () => {
|
const context = useContext(NotificationContext);
|
if (!context) {
|
throw new Error('useNotification must be used within a NotificationProvider');
|
}
|
return context;
|
};
|