| import { toast } from "react-toastify" |
|
|
| const notificationTypes = { |
| success: { |
| icon: "β
", |
| background: "linear-gradient(135deg, #4ecdc4, #44a08d)", |
| color: "white" |
| }, |
| warning: { |
| icon: "β οΈ", |
| background: "linear-gradient(135deg, #f39c12, #e67e22)", |
| color: "white" |
| }, |
| error: { |
| icon: "β", |
| background: "linear-gradient(135deg, #e74c3c, #c0392b)", |
| color: "white" |
| }, |
| info: { |
| icon: "βΉοΈ", |
| background: "linear-gradient(135deg, #667eea, #764ba2)", |
| color: "white" |
| }, |
| order: { |
| icon: "π¦", |
| background: "linear-gradient(135deg, #9b59b6, #8e44ad)", |
| color: "white" |
| }, |
| cart: { |
| icon: "π", |
| background: "linear-gradient(135deg, #2ecc71, #27ae60)", |
| color: "white" |
| }, |
| wishlist: { |
| icon: "β€οΈ", |
| background: "linear-gradient(135deg, #e91e63, #c2185b)", |
| color: "white" |
| }, |
| review: { |
| icon: "β", |
| background: "linear-gradient(135deg, #ff9800, #f57c00)", |
| color: "white" |
| }, |
| shipping: { |
| icon: "π", |
| background: "linear-gradient(135deg, #00bcd4, #0097a7)", |
| color: "white" |
| }, |
| promotion: { |
| icon: "π", |
| background: "linear-gradient(135deg, #ff5722, #e64a19)", |
| color: "white" |
| }, |
| } |
|
|
| let notificationStore = { |
| notifications: [ |
| { |
| id: 1, |
| type: "success", |
| title: "Order Confirmed", |
| message: "Your Premium order #MK2025001 has been confirmed and is being processed.", |
| timestamp: new Date(Date.now() - 5 * 60 * 1000), |
| read: false, |
| priority: "high", |
| action: { label: "View Order", url: "/orders/MK2025001" }, |
| }, |
| { |
| id: 2, |
| type: "shipping", |
| title: "Package Shipped", |
| message: "Your Premium items are on the way! Expected delivery: Tomorrow", |
| timestamp: new Date(Date.now() - 30 * 60 * 1000), |
| read: false, |
| priority: "medium", |
| action: { label: "Track Package", url: "/tracking" }, |
| }, |
| { |
| id: 3, |
| type: "promotion", |
| title: "Exclusive Offer", |
| message: "Limited time: 25% off on Premium electronics. Use code Premium25", |
| timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000), |
| read: true, |
| priority: "low", |
| action: { label: "Shop Now", url: "/electronics" }, |
| }, |
| ], |
| listeners: [], |
| maxNotifications: 6 |
| } |
|
|
| export const addNotification = (notification) => { |
| const newNotification = { |
| id: Date.now(), |
| timestamp: new Date(), |
| read: false, |
| priority: "medium", |
| ...notification |
| } |
|
|
| notificationStore.notifications = [newNotification, ...notificationStore.notifications].slice(0, notificationStore.maxNotifications) |
|
|
| notificationStore.listeners.forEach(listener => listener(notificationStore.notifications)) |
|
|
| const type = notification.type || 'info' |
| const style = notificationTypes[type] |
| |
| toast.info( |
| <div> |
| <div style={{ fontWeight: 'bold', marginBottom: '4px' }}>{notification.title}</div> |
| <div style={{ fontSize: '0.9rem' }}>{notification.message}</div> |
| </div>, |
| { |
| position: "top-right", |
| autoClose: 2000, |
| hideProgressBar: false, |
| closeOnClick: true, |
| pauseOnHover: true, |
| draggable: true, |
| progress: undefined, |
| icon: style.icon, |
| style: { |
| background: style.background, |
| color: style.color, |
| } |
| } |
| ) |
|
|
| return newNotification |
| } |
|
|
| export const subscribeToNotifications = (callback) => { |
| notificationStore.listeners.push(callback) |
| return () => { |
| notificationStore.listeners = notificationStore.listeners.filter(listener => listener !== callback) |
| } |
| } |
|
|
| export const getNotifications = () => { |
| return notificationStore.notifications |
| } |
|
|
| export const markNotificationAsRead = (id) => { |
| notificationStore.notifications = notificationStore.notifications.map(notification => |
| notification.id === id ? { ...notification, read: true } : notification |
| ) |
| notificationStore.listeners.forEach(listener => listener(notificationStore.notifications)) |
| } |
|
|
| export const markAllNotificationsAsRead = () => { |
| notificationStore.notifications = notificationStore.notifications.map(notification => ({ |
| ...notification, |
| read: true |
| })) |
| notificationStore.listeners.forEach(listener => listener(notificationStore.notifications)) |
| } |
|
|
| export const deleteNotification = (id) => { |
| notificationStore.notifications = notificationStore.notifications.filter(notification => notification.id !== id) |
| notificationStore.listeners.forEach(listener => listener(notificationStore.notifications)) |
| } |
|
|
| export const clearAllNotifications = () => { |
| notificationStore.notifications = [] |
| notificationStore.listeners.forEach(listener => listener(notificationStore.notifications)) |
| } |
|
|
| export const getUnreadCount = () => { |
| return notificationStore.notifications.filter(notification => !notification.read).length |
| } |
|
|
| export const notifyCartAction = (action, product) => { |
| const notifications = { |
| add: { |
| type: 'cart', |
| title: 'Added to Cart! π', |
| message: `${product.name} has been added to your cart.`, |
| action: { label: 'View Cart', url: '/cart' } |
| }, |
| remove: { |
| type: 'cart', |
| title: 'Removed from Cart', |
| message: `${product.name} has been removed from your cart.`, |
| action: { label: 'View Cart', url: '/cart' } |
| }, |
| update: { |
| type: 'cart', |
| title: 'Cart Updated', |
| message: `Quantity updated for ${product.name}.`, |
| action: { label: 'View Cart', url: '/cart' } |
| }, |
| failed: { |
| type: 'error', |
| title: 'Cart Operation Failed! β', |
| message: `Failed to ${action === 'add' ? 'add' : action === 'remove' ? 'remove' : 'update'} ${product.name} from your cart.`, |
| action: { label: 'Try Again', url: '/cart' } |
| }, |
| error: { |
| type: 'error', |
| title: 'Cart Error! β', |
| message: `An error occurred while ${action === 'add' ? 'adding' : action === 'remove' ? 'removing' : 'updating'} ${product.name}.`, |
| action: { label: 'Try Again', url: '/cart' } |
| } |
| } |
|
|
| return addNotification(notifications[action]) |
| } |
|
|
| export const notifyWishlistAction = (action, product) => { |
| const notifications = { |
| add: { |
| type: 'wishlist', |
| title: 'Added to Wishlist! β€οΈ', |
| message: `${product.name} has been added to your wishlist.`, |
| action: { label: 'View Wishlist', url: '/wishlist' } |
| }, |
| remove: { |
| type: 'wishlist', |
| title: 'Removed from Wishlist', |
| message: `${product.name} has been removed from your wishlist.`, |
| action: { label: 'View Wishlist', url: '/wishlist' } |
| }, |
| failed: { |
| type: 'error', |
| title: 'Wishlist Operation Failed! β', |
| message: `Failed to ${action === 'add' ? 'add' : 'remove'} ${product.name} from your wishlist.`, |
| action: { label: 'Try Again', url: '/wishlist' } |
| }, |
| error: { |
| type: 'error', |
| title: 'Wishlist Error! β', |
| message: `An error occurred while ${action === 'add' ? 'adding' : 'removing'} ${product.name} to/from your wishlist.`, |
| action: { label: 'Try Again', url: '/wishlist' } |
| } |
| } |
|
|
| return addNotification(notifications[action]) |
| } |
|
|
| export const notifyOrderAction = (action, orderId) => { |
| const notifications = { |
| placed: { |
| type: 'order', |
| title: 'Order Placed! π¦', |
| message: `Your order #${orderId} has been successfully placed.`, |
| action: { label: 'Track Order', url: `/orders/${orderId}` } |
| }, |
| shipped: { |
| type: 'shipping', |
| title: 'Order Shipped! π', |
| message: `Your order #${orderId} is on its way to you.`, |
| action: { label: 'Track Package', url: `/tracking/${orderId}` } |
| }, |
| delivered: { |
| type: 'success', |
| title: 'Order Delivered! β
', |
| message: `Your order #${orderId} has been delivered.`, |
| action: { label: 'Review Product', url: `/reviews/write` } |
| } |
| } |
|
|
| return addNotification(notifications[action]) |
| } |