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);
},
};