import type { ExternalToast } from "sonner"; import { toast } from "sonner"; type ToastType = | "default" | "description" | "success" | "warning" | "info" | "error" | "promise"; const config = { error: { type: "error", title: "Something went wrong", description: "Please try again", action: { label: "Discord", onClick: () => { if (typeof window === "undefined") return; window.open("/discord", "_blank"); }, }, }, "unique-slug": { type: "warning", title: "Slug is already taken", description: "Please select another slug. Every slug is unique.", }, success: { type: "success", title: "Success" }, deleted: { type: "success", title: "Deleted successfully" }, // TODO: we are not informing the user besides the visual changes when an entry has been deleted removed: { type: "success", title: "Removed successfully" }, saved: { type: "success", title: "Saved successfully" }, "test-error": { type: "error", title: "Connection Failed", description: "Please enter a correct URL", }, "test-warning-empty-url": { type: "warning", title: "URL is Empty", description: "Please enter a valid, non-empty URL", }, "test-success": { type: "success", title: "Connection Established", }, } as const; const _config: Record< string, Pick & { type: ToastType; title: string; } > = config; type ToastAction = keyof typeof config; export function toastAction(action: ToastAction) { const { title, type, ...props } = _config[action]; if (type === "default") return toast(title, props); if (type === "success") return toast.success(title, props); if (type === "error") return toast.error(title, props); if (type === "warning") return toast.warning(title, props); if (type === "description") return toast.message(title, props); if (type === "info") return toast.info(title, props); } export { toast };