import React from "react"; import { Toast, ToastPosition, toast } from "react-hot-toast"; import { XMarkIcon } from "@heroicons/react/20/solid"; import { CheckCircleIcon, ExclamationCircleIcon, ExclamationTriangleIcon, InformationCircleIcon, } from "@heroicons/react/24/solid"; type NotificationProps = { content: React.ReactNode; status: "success" | "info" | "loading" | "error" | "warning"; duration?: number; icon?: string; position?: ToastPosition; }; type NotificationOptions = { duration?: number; icon?: string; position?: ToastPosition; }; const ENUM_STATUSES = { success: , loading: , error: , info: , warning: , }; const DEFAULT_DURATION = 3000; const DEFAULT_POSITION: ToastPosition = "top-center"; /** * Custom Notification */ const Notification = ({ content, status, duration = DEFAULT_DURATION, icon, position = DEFAULT_POSITION, }: NotificationProps) => { return toast.custom( (t: Toast) => (
{icon ? icon : ENUM_STATUSES[status]}
{content}
toast.dismiss(t.id)}> toast.remove(t.id)} />
), { duration: status === "loading" ? Infinity : duration, position, }, ); }; export const notification = { success: (content: React.ReactNode, options?: NotificationOptions) => { return Notification({ content, status: "success", ...options }); }, info: (content: React.ReactNode, options?: NotificationOptions) => { return Notification({ content, status: "info", ...options }); }, warning: (content: React.ReactNode, options?: NotificationOptions) => { return Notification({ content, status: "warning", ...options }); }, error: (content: React.ReactNode, options?: NotificationOptions) => { return Notification({ content, status: "error", ...options }); }, loading: (content: React.ReactNode, options?: NotificationOptions) => { return Notification({ content, status: "loading", ...options }); }, remove: (toastId: string) => { toast.remove(toastId); }, };