UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

87 lines (85 loc) 4.09 kB
'use client'; function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import { useTheme } from 'antd-style'; import { kebabCase } from 'lodash-es'; import { memo, useEffect, useId, useMemo, useState } from 'react'; import Image from "../../Image"; import { useMermaid } from "../../hooks/useMermaid"; import { mermaidThemes } from "../const"; import { jsx as _jsx } from "react/jsx-runtime"; var SyntaxMermaid = /*#__PURE__*/memo(function (_ref) { var ref = _ref.ref, children = _ref.children, customTheme = _ref.theme, variant = _ref.variant, enablePanZoom = _ref.enablePanZoom; var isDefaultTheme = customTheme === 'lobe-theme' || !customTheme; var background = useMemo(function () { var _mermaidThemes$find; if (isDefaultTheme) return; return (_mermaidThemes$find = mermaidThemes.find(function (item) { return item.id === customTheme; })) === null || _mermaidThemes$find === void 0 ? void 0 : _mermaidThemes$find.background; }, [isDefaultTheme, customTheme]); var id = useId(); var theme = useTheme(); var mermaidId = kebabCase("mermaid-".concat(id)); var _useMermaid = useMermaid(children, { id: mermaidId, theme: isDefaultTheme ? undefined : customTheme }), data = _useMermaid.data; var _useState = useState(), _useState2 = _slicedToArray(_useState, 2), blobUrl = _useState2[0], setBlobUrl = _useState2[1]; // 组件卸载时清理 Blob URL,避免内存泄漏 useEffect(function () { return function () { if (blobUrl) URL.revokeObjectURL(blobUrl); }; }, [blobUrl]); useEffect(function () { if (!data) return; // 创建Blob对象 var svgBlob = new Blob([data], { type: 'image/svg+xml' }); // 如果已有旧的URL,先释放它 if (blobUrl) URL.revokeObjectURL(blobUrl); // 创建并保存Blob URL var url = URL.createObjectURL(svgBlob); setBlobUrl(url); }, [data]); if (!data || !blobUrl) return null; return /*#__PURE__*/_jsx(Image, { alt: 'mermaid', maxHeight: 480, objectFit: 'contain', preview: enablePanZoom ? { mask: false, styles: { mask: { background: background || theme.colorBgContainerSecondary } } } : false, ref: ref, src: blobUrl, style: { background: variant === 'filled' ? background : undefined, borderRadius: 0, margin: 0, padding: variant === 'borderless' ? 0 : 16, position: 'relative' }, variant: 'borderless' }); }); SyntaxMermaid.displayName = 'SyntaxMermaid'; export default SyntaxMermaid;