| "use client"; |
|
|
| import { X, CheckCircle, AlertCircle, Info, AlertTriangle } from "lucide-react"; |
| import { cn } from "@/lib/utils"; |
| import { useNotificationStore } from "@/store/notifications"; |
|
|
| const typeConfig = { |
| success: { |
| icon: CheckCircle, |
| className: "border-green-500 bg-green-50 dark:bg-green-950/20", |
| iconColor: "text-green-600 dark:text-green-400", |
| }, |
| error: { |
| icon: AlertCircle, |
| className: "border-red-500 bg-red-50 dark:bg-red-950/20", |
| iconColor: "text-red-600 dark:text-red-400", |
| }, |
| warning: { |
| icon: AlertTriangle, |
| className: "border-yellow-500 bg-yellow-50 dark:bg-yellow-950/20", |
| iconColor: "text-yellow-600 dark:text-yellow-400", |
| }, |
| info: { |
| icon: Info, |
| className: "border-blue-500 bg-blue-50 dark:bg-blue-950/20", |
| iconColor: "text-blue-600 dark:text-blue-400", |
| }, |
| }; |
|
|
| export function NotificationToast() { |
| const { notifications, removeNotification } = useNotificationStore(); |
|
|
| |
| const visibleToasts = notifications |
| .filter((n) => n.autoClose) |
| .slice(0, 3); |
|
|
| return ( |
| <div className="fixed bottom-4 right-4 z-50 flex flex-col gap-2 w-80"> |
| {visibleToasts.map((notification) => { |
| const config = typeConfig[notification.type]; |
| const Icon = config.icon; |
| |
| return ( |
| <div |
| key={notification.id} |
| className={cn( |
| "flex items-start gap-3 p-4 rounded-lg border-l-4 shadow-lg backdrop-blur-sm animate-in slide-in-from-right", |
| config.className |
| )} |
| > |
| <Icon className={cn("h-5 w-5 mt-0.5 flex-shrink-0", config.iconColor)} /> |
| <div className="flex-1 min-w-0"> |
| <p className="font-medium text-sm">{notification.title}</p> |
| {notification.message && ( |
| <p className="text-sm text-muted-foreground mt-1"> |
| {notification.message} |
| </p> |
| )} |
| </div> |
| <button |
| onClick={() => removeNotification(notification.id)} |
| className="flex-shrink-0 rounded-full p-1 hover:bg-black/10 dark:hover:bg-white/10 transition-colors cursor-pointer" |
| > |
| <X className="h-4 w-4" /> |
| </button> |
| </div> |
| ); |
| })} |
| </div> |
| ); |
| } |
|
|