mirror of
https://github.com/nuxt/ui.git
synced 2026-09-14 19:51:10 +08:00
38765c367d
Co-authored-by: Baptiste Leproux <leproux.baptiste@gmail.com>
65 lines
1.4 KiB
Vue
65 lines
1.4 KiB
Vue
<script setup lang="ts">
|
|
import type { NodeViewProps } from '@tiptap/vue-3'
|
|
import { NodeViewWrapper } from '@tiptap/vue-3'
|
|
|
|
const props = defineProps<NodeViewProps>()
|
|
|
|
const file = ref<File | null>(null)
|
|
const loading = ref(false)
|
|
|
|
watch(file, async (newFile) => {
|
|
if (!newFile) return
|
|
|
|
loading.value = true
|
|
|
|
const reader = new FileReader()
|
|
reader.onload = async (e) => {
|
|
const dataUrl = e.target?.result as string
|
|
if (!dataUrl) {
|
|
loading.value = false
|
|
return
|
|
}
|
|
|
|
// Simulate upload delay
|
|
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
|
|
const pos = props.getPos()
|
|
if (typeof pos !== 'number') {
|
|
loading.value = false
|
|
return
|
|
}
|
|
|
|
props.editor
|
|
.chain()
|
|
.focus()
|
|
.deleteRange({ from: pos, to: pos + 1 })
|
|
.setImage({ src: dataUrl })
|
|
.run()
|
|
|
|
loading.value = false
|
|
}
|
|
reader.readAsDataURL(newFile)
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<NodeViewWrapper>
|
|
<UFileUpload
|
|
v-model="file"
|
|
accept="image/*"
|
|
label="Upload an image"
|
|
description="SVG, PNG, JPG or GIF (max. 2MB)"
|
|
:preview="false"
|
|
class="min-h-48"
|
|
>
|
|
<template #leading>
|
|
<UAvatar
|
|
:icon="loading ? 'i-lucide-loader-circle' : 'i-lucide-image'"
|
|
size="xl"
|
|
:class="[loading && 'animate-spin']"
|
|
/>
|
|
</template>
|
|
</UFileUpload>
|
|
</NodeViewWrapper>
|
|
</template>
|