import { promisefiyPostMessage } from '@/helpers/native-message' import html2canvas from 'html2canvas' import { closeToast, Icon, showFailToast, showLoadingToast, showSuccessToast } from 'vant' import { defineComponent, toRefs, ref, reactive, onMounted, onUnmounted, nextTick } from 'vue' import styles from './pen.module.less' export default defineComponent({ name: 'pen', props: { show: { type: Boolean, default: false }, close: { type: Function, default: () => {} } }, setup(props) { const { show } = toRefs(props) const firstRender = ref(true) const src = /(localhost|192)/.test(location.host) ? 'https://test.lexiaoya.cn/whiteboard-noCollab' : `${location.origin}/whiteboard-noCollab` const exportImg = (event: MessageEvent) => { const data = event.data // console.log('🚀 ~ event:', data) if (data.api === 'excalidraw_exportImg') { imgs.base64 = data.base64 imgs.exported = true nextTick(() => { onSaveImg() }) } } onMounted(() => { window.addEventListener('message', exportImg) }) onUnmounted(() => { window.removeEventListener('message', exportImg) }) const imgs = reactive({ exported: false, saveLoading: false, base64: '', image: '' }) const saveImg = async () => { showLoadingToast({ message: '图片生成中...', forbidClick: true }) setTimeout(() => { imgs.saveLoading = false }, 100) const res = await promisefiyPostMessage({ api: 'savePicture', content: { base64: imgs.image } }) if (res?.content?.status === 'success') { showSuccessToast('已保存到相册') } else { showFailToast('保存失败') } imgs.exported = false } const onSaveImg = async () => { // 判断是否在保存中... if (imgs.saveLoading) { return } console.log('开始') imgs.saveLoading = true const container: any = document.getElementById(`app`) html2canvas(container, { allowTaint: true, useCORS: true, backgroundColor: null }) .then(async (canvas) => { // console.log("🚀 ~ canvas:", canvas) // document.body.appendChild(canvas) // const url = await canvas.toDataURL() try { imgs.image = canvas.toDataURL() } catch (error) { console.log(error) } console.log("🚀 ~ imgs.image:", imgs.image) saveImg() }) .catch((error) => { console.log("🚀 ~ error:", error) closeToast() imgs.saveLoading = false imgs.exported = false }) } return () => (
{imgs.exported ? ( ) : (
props.close()} >
)}
) } })