Nuxt/packages/nuxt/src/app/components/client-fallback.client.ts
renovate[bot] 754955545e
chore(deps): update all non-major dependencies (main) (#22866)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-09-05 12:27:41 +01:00

54 lines
1.3 KiB
TypeScript

import { createElementBlock, defineComponent, onMounted, ref } from 'vue'
import { useState } from '../composables/state'
export default defineComponent({
name: 'NuxtClientFallback',
inheritAttrs: false,
props: {
uid: {
type: String
},
fallbackTag: {
type: String,
default: () => 'div'
},
fallback: {
type: String,
default: () => ''
},
placeholder: {
type: String
},
placeholderTag: {
type: String
},
keepFallback: {
type: Boolean,
default: () => false
}
},
emits: ['ssr-error'],
setup (props, ctx) {
const mounted = ref(false)
// This is deliberate - `uid` should not be provided by user but by a transform plugin and will not be reactive.
const ssrFailed = useState(`${props.uid}`)
if (ssrFailed.value) {
onMounted(() => { mounted.value = true })
}
return () => {
if (ssrFailed.value) {
if (!mounted.value || props.keepFallback) {
const slot = ctx.slots.placeholder || ctx.slots.fallback
if (slot) { return slot() }
const fallbackStr = props.placeholder || props.fallback
const fallbackTag = props.placeholderTag || props.fallbackTag
return createElementBlock(fallbackTag, null, fallbackStr)
}
}
return ctx.slots.default?.()
}
}
})