@nuxt/ui
Version:
A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.
86 lines (85 loc) • 2.37 kB
JavaScript
import { reactive, markRaw, shallowReactive } from "vue";
import { createSharedComposable } from "@vueuse/core";
function _useOverlay() {
const overlays = shallowReactive([]);
const create = (component, _options) => {
const { props, defaultOpen, destroyOnClose } = _options || {};
const options = reactive({
id: Symbol(import.meta.dev ? "useOverlay" : ""),
isOpen: !!defaultOpen,
component: markRaw(component),
isMounted: !!defaultOpen,
destroyOnClose: !!destroyOnClose,
originalProps: props || {},
props: { ...props || {} }
});
overlays.push(options);
return {
...options,
open: (props2) => open(options.id, props2),
close: (value) => close(options.id, value),
patch: (props2) => patch(options.id, props2)
};
};
const open = (id, props) => {
const overlay = getOverlay(id);
if (props) {
patch(overlay.id, props);
} else {
patch(overlay.id, overlay.originalProps);
}
overlay.isOpen = true;
overlay.isMounted = true;
return {
id,
isMounted: overlay.isMounted,
isOpen: overlay.isOpen,
result: new Promise((resolve) => overlay.resolvePromise = resolve)
};
};
const close = (id, value) => {
const overlay = getOverlay(id);
overlay.isOpen = false;
if (overlay.resolvePromise) {
overlay.resolvePromise(value);
overlay.resolvePromise = void 0;
}
};
const closeAll = () => {
overlays.forEach((overlay) => close(overlay.id));
};
const unmount = (id) => {
const overlay = getOverlay(id);
overlay.isMounted = false;
if (overlay.destroyOnClose) {
const index = overlays.findIndex((overlay2) => overlay2.id === id);
overlays.splice(index, 1);
}
};
const patch = (id, props) => {
const overlay = getOverlay(id);
overlay.props = { ...props };
};
const getOverlay = (id) => {
const overlay = overlays.find((overlay2) => overlay2.id === id);
if (!overlay) {
throw new Error("Overlay not found");
}
return overlay;
};
const isOpen = (id) => {
const overlay = getOverlay(id);
return overlay.isOpen;
};
return {
overlays,
open,
close,
closeAll,
create,
patch,
unmount,
isOpen
};
}
export const useOverlay = /* @__PURE__ */ createSharedComposable(_useOverlay);