37 lines
932 B
TypeScript
37 lines
932 B
TypeScript
/**
|
|
* Copyright 2025 Beijing Volcano Engine Technology Co., Ltd. All Rights Reserved.
|
|
* SPDX-license-identifier: BSD-3-Clause
|
|
*/
|
|
|
|
import { useEffect, useRef } from 'react';
|
|
|
|
const getDom = async (url: string) => {
|
|
const res = await fetch(url);
|
|
if (res) {
|
|
const text = await res.text();
|
|
// https://developer.mozilla.org/zh-CN/docs/Web/API/DOMParser
|
|
return new window.DOMParser().parseFromString(text, 'text/xml');
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
function MenuIcon({ src, className = '' }: { src: string; className?: string }) {
|
|
const wrapper = useRef<HTMLDivElement>(null);
|
|
|
|
const renderSVG = async () => {
|
|
const svg = await getDom(src);
|
|
|
|
if (svg?.documentElement instanceof SVGSVGElement) {
|
|
wrapper.current?.replaceChildren(svg.documentElement);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
src && renderSVG();
|
|
}, [src]);
|
|
|
|
return <span ref={wrapper} className={className} />;
|
|
}
|
|
|
|
export default MenuIcon;
|