rayine-ui/docs/composables/useComponentMeta.ts

40 lines
941 B
TypeScript

interface ComponentMetaState {
[key: string]: any
}
const useComponentsMetaState = () =>
useState<ComponentMetaState>('components-meta', () => ({}))
export const fetchComponentMeta = async (name: string) => {
const state = useComponentsMetaState()
if (state.value[name]?.then) {
await state.value[name]
return state.value[name]
}
if (state.value[name]) {
return state.value[name]
}
if (import.meta.server) {
const event = useRequestEvent()
if (event && event.node && event.node.res) {
event.node.res.setHeader(
'x-nitro-prerender',
[
event.node.res.getHeader('x-nitro-prerender'),
`/api/component-meta/${name}.json`,
].filter(Boolean) as string[],
)
}
}
state.value[name] = $fetch(`/api/component-meta/${name}.json`).then(
(meta) => {
state.value[name] = meta
},
)
await state.value[name]
return state.value[name]
}