import { createContext } from "../shared/createContext.js"; import { useCollection } from "../Collection/Collection.js"; import { TOAST_MANAGER_SUBSCRIBE } from "./createToastManager.js"; import { useToastStore } from "./useToastStore.js"; import { computed, defineComponent, onMounted, ref, renderSlot, shallowReactive, toRefs, watch } from "vue"; //#region src/Toast/ToastProvider.vue?vue&type=script&setup=true&lang.ts const [injectToastProviderContext, provideToastProviderContext] = /*#__PURE__*/ createContext("ToastProvider"); var ToastProvider_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ inheritAttrs: false, __name: "ToastProvider", props: { label: { type: String, required: false, default: "Notification" }, duration: { type: Number, required: false, default: 5e3 }, disableSwipe: { type: Boolean, required: false }, swipeDirection: { type: String, required: false, default: "right" }, swipeThreshold: { type: Number, required: false, default: 50 }, limit: { type: Number, required: false }, toastManager: { type: Object, required: false } }, setup(__props) { const props = __props; const { label, duration, disableSwipe, swipeDirection, swipeThreshold } = toRefs(props); useCollection({ isProvider: true }); const viewport = ref(); const toastCount = ref(0); const isFocusedToastEscapeKeyDownRef = ref(false); const isClosePausedRef = ref(false); const toastStore = useToastStore(); onMounted(() => { watch(() => props.toastManager, (manager, _, onCleanup) => { if (!manager) return; const unsubscribe = manager[TOAST_MANAGER_SUBSCRIBE]((event) => { if (event.action === "add") toastStore.add(event.options); else if (event.action === "close") toastStore.close(event.id); else toastStore.update(event.id, event.updates); }); onCleanup(unsubscribe); }, { immediate: true }); }); const entries = shallowReactive([]); let seq = 0; const stack = computed(() => { const ordered = [...entries].sort((a, b) => b.seq - a.seq); const states = /* @__PURE__ */ new Map(); let visibleIndex = 0; let offsetY = 0; ordered.forEach((entry, index) => { const closing = !entry.open; states.set(entry, { index: closing ? index : visibleIndex, offsetY, limited: !closing && props.limit !== void 0 && visibleIndex >= props.limit }); if (!closing) { offsetY += entry.height; visibleIndex++; } }); return { ordered, states }; }); const hovering = ref(false); const focused = ref(false); if (props.label && typeof props.label === "string" && !props.label.trim()) { const error = "Invalid prop `label` supplied to `ToastProvider`. Expected non-empty `string`."; throw new Error(error); } provideToastProviderContext({ label, duration, disableSwipe, swipeDirection, swipeThreshold, toastCount, viewport, onViewportChange(el) { viewport.value = el; }, onToastAdd() { toastCount.value++; }, onToastRemove() { toastCount.value--; }, isFocusedToastEscapeKeyDownRef, isClosePausedRef, toastStore, hovering, focused, expanded: computed(() => hovering.value || focused.value), frontmostHeight: computed(() => stack.value.ordered.find((entry) => entry.open)?.height || void 0), closingCount: computed(() => entries.filter((entry) => !entry.open).length), registerToast(entry) { entry.seq = ++seq; entries.push(entry); return () => { const index = entries.indexOf(entry); if (index !== -1) entries.splice(index, 1); }; }, reopenToast(entry) { entry.seq = ++seq; }, getToastStack(entry) { return stack.value.states.get(entry) ?? { index: 0, offsetY: 0, limited: false }; } }); return (_ctx, _cache) => { return renderSlot(_ctx.$slots, "default"); }; } }); //#endregion //#region src/Toast/ToastProvider.vue var ToastProvider_default = ToastProvider_vue_vue_type_script_setup_true_lang_default; //#endregion export { ToastProvider_default, injectToastProviderContext }; //# sourceMappingURL=ToastProvider.js.map