UNPKG

react-atom-toast

Version:
76 lines (73 loc) 2.46 kB
import { __spreadProps, __spreadValues } from '../chunk-5USKE2QT.js'; import { useState, Fragment } from 'react'; import { useMemoizedFn } from '../hooks/use-memoized-fn.js'; import { omit } from '../utils.js'; import Toast from './toast.js'; import { jsx } from 'react/jsx-runtime'; function ToastContainer(props) { const { toasts, onClosed, onOpenChange } = props; const [hoverState, setHoverState] = useState(false); const [heightMap, setHeightMap] = useState(/* @__PURE__ */ new Map()); const onEnter = useMemoizedFn((key, height) => { setHeightMap((prev) => { prev.set(key, height); return new Map(prev); }); }); const onUpdate = useMemoizedFn(onEnter); const onExited = useMemoizedFn((key) => { setHeightMap((prev) => { prev.delete(key); return new Map(prev); }); }); const offsetHeight = useMemoizedFn((toast) => { const index = toasts.findIndex((t) => t.key === toast.key); let offset = 0; const start = toasts.length - 1; for (let i = start; i > index; i--) { const currentToastHeight = heightMap.get(toasts[i].key) || 0; const nextToastHeight = heightMap.get(toasts[i - 1].key) || 0; offset += nextToastHeight / 2 + currentToastHeight / 2 + toasts[index].gap; } return offset; }); return /* @__PURE__ */ jsx( "div", { onMouseEnter: () => { setHoverState(true); }, onMouseLeave: () => { setHoverState(false); }, className: "toast__container", children: toasts.map((toast) => /* @__PURE__ */ jsx(Fragment, { children: toast.render( /* @__PURE__ */ jsx( Toast, __spreadProps(__spreadValues({}, omit(toast, ["key"])), { onOpenChange: (open) => onOpenChange(toast.key, open), onEnter: (height) => { onEnter(toast.key, height); }, onUpdate: (height) => { onUpdate(toast.key, height); }, onExited: () => { onExited(toast.key); }, onClosed: () => { var _a; (_a = toast.onClosed) == null ? void 0 : _a.call(toast); onClosed(toast.key); }, hover: hoverState, offsetHeight: offsetHeight(toast) }) ) ) }, toast.key)) } ); } var toast_container_default = ToastContainer; export { toast_container_default as default };