UNPKG

nuxt

Version:

Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.

54 lines (53 loc) 1.77 kB
import { useRoute, useRouter } from "./router.js"; import { refreshNuxtData } from "./asyncData.js"; import { useState } from "./state.js"; import { toRef, watch } from "vue"; //#region src/app/composables/preview.ts let unregisterRefreshHook; /** @since 3.11.0 */ function usePreviewMode(options = {}) { const preview = useState("_preview-state", () => ({ enabled: false, state: {} })); if (preview.value._initialized) return { enabled: toRef(preview.value, "enabled"), state: preview.value.state }; if (import.meta.client) preview.value._initialized = true; if (!preview.value.enabled) { const result = (options.shouldEnable ?? defaultShouldEnable)(preview.value.state); if (typeof result === "boolean") preview.value.enabled = result; } watch(() => preview.value.enabled, (value) => { if (value) { const newState = (options.getState ?? getDefaultState)(preview.value.state); if (newState !== preview.value.state) Object.assign(preview.value.state, newState); if (import.meta.client && !unregisterRefreshHook) { (options.onEnable ?? refreshNuxtData)(); unregisterRefreshHook = options.onDisable ?? useRouter().afterEach(() => refreshNuxtData()); } } else if (unregisterRefreshHook) { unregisterRefreshHook(); unregisterRefreshHook = void 0; } }, { immediate: true, flush: "sync" }); return { enabled: toRef(preview.value, "enabled"), state: preview.value.state }; } function defaultShouldEnable() { return useRoute().query["preview"] === "true"; } function getDefaultState(state) { if (state.token !== void 0) return state; const route = useRoute(); state.token = Array.isArray(route.query.token) ? route.query.token[0] : route.query.token; return state; } //#endregion export { usePreviewMode };