mkcart / frontend /src /utils /notificationService.jsx
Kumar
updated
c2efbe6
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])
}