UNPKG

@veracity/vui

Version:

Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.

106 lines (104 loc) 3.11 kB
import { uid } from "../utils/uid.js"; import { useVuiContext } from "../core/vuiProvider/context.js"; import { ToastItem } from "./ToastItem.js"; import { useCallback, useEffect, useRef } from "react"; import { jsx } from "react/jsx-runtime"; //#region src/toast/useToast.tsx const defaultDuration = "fast"; const fastToastDuration = 4e3; const slowToastDuration = 8e3; const DEFAULT_DURATION_BY_STATUS = { info: "fast", success: "fast", warning: "fast", danger: "slow", error: "slow", loading: "sticky" }; const getDurationTime = (duration) => { switch (duration) { case "fast": return fastToastDuration; case "slow": return slowToastDuration; default: throw new Error(`[VUI] useToast: unhandled duration "${duration}"`); } }; const useToast = () => { const { addToast, removeToast } = useVuiContext(); const timeoutMapRef = useRef(/* @__PURE__ */ new Map()); useEffect(() => { const timeouts = timeoutMapRef.current; return () => { timeouts.forEach(clearTimeout); timeouts.clear(); }; }, []); const showToast = useCallback((options) => { if (options?.dismissible !== void 0) console.warn("[VUI] Toast: `dismissible` is deprecated. Use `showDismissButton` to control dismiss button visibility."); const id = options?.id ? options.id : uid("toast"); const showDismissButton = options?.showDismissButton ?? options?.dismissible ?? true; const status = options?.status === "error" ? "danger" : options?.status ?? "info"; const { duration = DEFAULT_DURATION_BY_STATUS[status], action, icon, size, text, textLayout, title } = options || {}; const handleClose = () => { const timeoutId = timeoutMapRef.current.get(id); if (timeoutId !== void 0) clearTimeout(timeoutId); timeoutMapRef.current.delete(id); removeToast(id); }; addToast({ id, component: /* @__PURE__ */ jsx(ToastItem, { action, icon, showDismissButton, size, status, text, textLayout, title, onClose: handleClose }) }); if (duration && duration !== "sticky") timeoutMapRef.current.set(id, setTimeout(() => { timeoutMapRef.current.delete(id); removeToast(id); }, getDurationTime(duration))); }, [addToast, removeToast]); const showInfo = useCallback((text, options) => showToast({ text, status: "info", ...options }), [showToast]); const showSuccess = useCallback((text, options) => showToast({ text, status: "success", ...options }), [showToast]); const showWarning = useCallback((text, options) => showToast({ text, status: "warning", ...options }), [showToast]); const showDanger = useCallback((text, options) => showToast({ text, status: "danger", ...options }), [showToast]); return { showToast, hideToast: removeToast, showInfo, showSuccess, showWarning, showDanger, showError: showDanger, showLoading: useCallback((text, options) => showToast({ text, status: "loading", ...options }), [showToast]) }; }; //#endregion export { defaultDuration, fastToastDuration, slowToastDuration, useToast }; globalThis.__vuiVersion__ = "5.3.1" //# sourceMappingURL=useToast.js.map