// @ts-nocheck import { defineComponent, markRaw } from "vue"; import { xU } from "../ventoseUtils"; import InsideDeleteOutlined from "../../assets/svg/DeleteOutlined.svg"; import InsideExclamationCircleOutlined from "../../assets/svg/ExclamationCircleOutlined.svg"; import InsideLoadingOutlined from "../../assets/svg/LoadingOutlined.svg"; import InsideSaveOutlined from "../../assets/svg/SaveOutlined.svg"; import InsideSearchOutlined from "../../assets/svg/SearchOutlined.svg"; import InsideSyncOutlined from "../../assets/svg/SyncOutlined.svg"; import InsideUploadOutlined from "../../assets/svg/UploadOutlined.svg"; import Insidetips from "../../assets/svg/tips.svg"; import InsideEmpty from "../../assets/svg/empty.svg"; import InsideCopy from "../../assets/svg/copy.svg"; import insideSettingOutlined from "../../assets/svg/SettingOutlined.svg"; import { iStorage } from "../tools/storage"; import "./xIcon.less"; import { State_UI } from ".."; /* const icons = import.meta.glob("../../assets/svg/*.svg"); */ const insideIcons = { InsideDeleteOutlined, InsideExclamationCircleOutlined, InsideLoadingOutlined, InsideSaveOutlined, InsideSearchOutlined, InsideSyncOutlined, InsideUploadOutlined, Insidetips, InsideEmpty, InsideCopy, insideSettingOutlined }; export default defineComponent( markRaw({ name: "xIcon", props: ["icon"], data() { const id = "lazy-svg_" + this._.uid; return { id, svgIcon: null }; }, computed: { baseAttrs() { return { id: this.id, role: "img", ariaLabel: this.icon, class: "xIcon anticon" }; }, iconKey() { const _iconKey = xU.camelCase(this.getIconPath()).replace(/\s/, ""); return _iconKey; } }, methods: { getIconPath() { if (!State_UI.assetsSvgPath) { debugger; } const iconPath = `${State_UI.assetsSvgPath}/${this.icon}.svg`; return iconPath; }, async setIcon() { if (!this.icon) return; try { let SvgIconAny = await (async () => { /* 已缓存为组件 */ let _SvgIconAny = insideIcons[this.icon]; if (_SvgIconAny) { xU(this.icon); return _SvgIconAny; } if (!State_UI.isDev) { /* indexedDB 缓存成字符串 */ _SvgIconAny = await iStorage(this.iconKey); if (_SvgIconAny) { return _SvgIconAny; } } try { /* public asset remote 加载 svg 字符串 */ _SvgIconAny = await xU.asyncLoadText(this.getIconPath()); } catch (error) { console.error(error); } return _SvgIconAny; })(); if (xU.isString(SvgIconAny) && SvgIconAny.length > 0) { const SvgComponentByString = { name: this.icon, template: SvgIconAny }; /* indexedDB 缓存 字符串*/ await iStorage(this.iconKey, SvgIconAny); /* 内存 缓存 */ insideIcons[this.icon] = SvgComponentByString; this.svgIcon = ; } else if (SvgIconAny?.render || SvgIconAny?.template) { /* SvgIconAny是loader处理过的 */ this.svgIcon = ; } else { console.error("component xIcon miss svg: " + this.icon); } } catch (error) { console.error(error); } } }, render() { if (this.svgIcon) { return this.svgIcon; } return ; }, watch: { icon: { immediate: true, handler() { this.setIcon(); } } } }) );