elk/components/common/CommonBlurhash.ts

50 lines
1.1 KiB
TypeScript
Raw Normal View History

2022-11-21 13:21:53 +00:00
import { decode } from 'blurhash'
2022-11-28 07:12:13 +00:00
import { getDataUrlFromArr } from '~/composables/utils'
2022-11-21 13:21:53 +00:00
export default defineComponent({
inheritAttrs: false,
props: {
blurhash: {
type: String,
required: true,
},
src: {
type: String,
required: true,
},
srcset: {
type: String,
required: false,
},
2022-11-21 13:21:53 +00:00
},
2022-12-12 22:07:56 +00:00
setup(props, { attrs, emit }) {
2022-11-21 13:21:53 +00:00
const placeholderSrc = ref<string>()
const isLoaded = ref(false)
onMounted(() => {
const img = document.createElement('img')
img.onload = () => {
isLoaded.value = true
}
2022-12-12 22:07:56 +00:00
img.onerror = (ev) => {
emit('onerror', ev)
}
2022-11-21 13:21:53 +00:00
img.src = props.src
if (props.srcset)
img.srcset = props.srcset
2022-11-24 04:13:13 +00:00
setTimeout(() => {
isLoaded.value = true
}, 3_000)
2022-11-21 13:21:53 +00:00
if (props.blurhash) {
const pixels = decode(props.blurhash, 32, 32)
placeholderSrc.value = getDataUrlFromArr(pixels, 32, 32)
}
})
return () => isLoaded.value || !placeholderSrc.value
? h('img', { ...attrs, src: props.src, srcset: props.srcset })
2022-11-21 13:21:53 +00:00
: h('img', { ...attrs, src: placeholderSrc.value })
},
})