@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
JavaScript
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