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.

99 lines (97 loc) 3.08 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 mediumToastDuration = 6e3; const slowToastDuration = 8e3; const getDurationTime = (duration) => { switch (duration) { case "fast": return fastToastDuration; case "medium": return mediumToastDuration; 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 { duration = defaultDuration, status = "info", 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]); return { showToast, hideToast: removeToast, showInfo: useCallback((text, duration = defaultDuration, options) => showToast({ text, status: "info", duration, ...options }), [showToast]), showSuccess: useCallback((text, duration = defaultDuration, options) => showToast({ text, status: "success", duration, ...options }), [showToast]), showWarning: useCallback((text, duration = "medium", options) => showToast({ text, status: "warning", duration, ...options }), [showToast]), showError: useCallback((text, duration = "slow", options) => showToast({ text, status: "error", duration, ...options }), [showToast]), showLoading: useCallback((text, duration = "sticky", options) => showToast({ text, status: "loading", duration, ...options }), [showToast]) }; }; //#endregion export { defaultDuration, fastToastDuration, mediumToastDuration, slowToastDuration, useToast }; globalThis.__vuiVersion__ = "5.3.0-alpha.2" //# sourceMappingURL=useToast.js.map