feat: convert upload templat component to composition API

This commit is contained in:
IchliebedichZhu 2024-03-07 15:06:18 +00:00
parent 372810e19f
commit 7eb44396b4

View File

@ -11,60 +11,81 @@
<SaveImage ref="canvasImage" />
</template>
<script lang="ts">
<script lang="ts" setup>
import api from '@/api'
import { defineComponent, reactive, toRefs, getCurrentInstance, ComponentInternalInstance } from 'vue'
import { mapGetters, useStore } from 'vuex'
import { reactive, ref } from 'vue'
import { useStore } from 'vuex'
import { useRoute, useRouter } from 'vue-router'
import useNotification from '@/common/methods/notification'
import SaveImage from '@/components/business/save-download/CreateCover.vue'
import { useFontStore } from '@/common/methods/fonts'
import _config from '@/config'
import github from '@/api/github'
import { useSetupMapGetters } from '@/common/hooks/mapGetters'
export default defineComponent({
components: { SaveImage },
props: ['modelValue', 'isDone'],
emits: ['change', 'update:modelValue'],
setup(props, context) {
const { proxy }: any = getCurrentInstance() as ComponentInternalInstance
const route = useRoute()
const router = useRouter()
const store = useStore()
const state: any = reactive({
type TProps = {
modelValue?: string
isDone?: boolean
}
type TEmits = {
(event: 'change', data: { downloadPercent: number | null, downloadText: string, downloadMsg?: string, cancelText?: string }): void
(event: 'update:modelValue', data: string): void
}
type TState = {
stateBollean: false,
title: '',
loading: false,
canvasImage: null,
})
}
useFontStore.init() //
const { dPage, dWidgets } = useSetupMapGetters(['dPage', 'dWidgets'])
//
const draw = () => {
const props = defineProps<TProps>()
const emit = defineEmits<TEmits>()
const route = useRoute()
const router = useRouter()
const store = useStore()
const canvasImage = ref<typeof SaveImage | null>(null)
const state = reactive<TState>({
stateBollean: false,
title: '',
loading: false,
})
useFontStore.init() //
//
const draw = () => {
return new Promise((resolve) => {
state.canvasImage.createCover(({ key }: any) => {
if (!canvasImage.value) {
resolve('')
} else {
canvasImage.value.createCover(({ key }: { key: string }) => {
resolve(_config.IMG_URL + key)
})
})
}
})
}
let addition = 0 //
let lenCount = 0 //
let lens = 0 //
const queue: any[] = [] //
let widgets: any = []
let page: any = {}
let addition = 0 //
let lenCount = 0 //
let lens = 0 //
const queue: { type: string, imgUrl: string }[] = [] //
let widgets: { type: string, imgUrl: string }[] = []
let page: Record<string, any> = {}
async function prepare() {
async function prepare() {
store.commit('setShowMoveable', false) //
addition = 0
lenCount = 0
widgets = proxy.dWidgets
page = proxy.dPage
widgets = dWidgets.value
page = dPage.value
if (page.backgroundImage) {
context.emit('change', { downloadPercent: 1, downloadText: '正在准备上传', downloadMsg: '请等待..' })
emit('change', { downloadPercent: 1, downloadText: '正在准备上传', downloadMsg: '请等待..' })
page.backgroundImage = await github.putPic(page.backgroundImage.split(',')[1])
}
@ -76,40 +97,35 @@ export default defineComponent({
}
lens = queue.length
uploadImgs()
}
}
async function uploadImgs() {
async function uploadImgs() {
if (queue.length > 0) {
const item = queue.pop()
if (!item) return
const url = await github.putPic(item.imgUrl.split(',')[1])
addition += item.imgUrl.length
let downloadPercent: any = (addition / lenCount) * 100
let downloadPercent: number | null = (addition / lenCount) * 100
downloadPercent >= 100 && (downloadPercent = null)
context.emit('change', { downloadPercent, downloadText: '上传资源中', downloadMsg: `已完成:${lens - queue.length} / ${lens}` })
emit('change', { downloadPercent, downloadText: '上传资源中', downloadMsg: `已完成:${lens - queue.length} / ${lens}` })
item.imgUrl = url
uploadImgs()
} else {
uploadTemplate()
}
}
}
const uploadTemplate = async () => {
context.emit('change', { downloadPercent: 95, downloadText: '正在处理封面', downloadMsg: '即将结束...' })
emit('change', { downloadPercent: 95, downloadText: '正在处理封面', downloadMsg: '即将结束...' })
const cover = await draw()
const { id, stat, msg } = await api.home.saveWorks({ cover, title: '自设计模板', data: JSON.stringify({ page, widgets }), width: page.width, height: page.height })
stat !== 0 ? useNotification('保存成功', '可在"我的模板"中查看') : useNotification('保存失败', msg, { type: 'error' })
router.push({ path: '/psd', query: { id }, replace: true })
context.emit('change', { downloadPercent: 99.99, downloadText: '上传完成', cancelText: '查看我的作品' }) //
emit('change', { downloadPercent: 99.99, downloadText: '上传完成', cancelText: '查看我的作品' }) //
}
return {
...toRefs(state),
defineExpose({
prepare,
}
},
computed: {
...mapGetters(['dPage', 'dWidgets']),
},
})
</script>