import { AudioActionType, audioStatePubSub } from "../utils/audiomodule.js"; import { CloseSVG } from "./svg.js"; const { useRef, useEffect, useCallback } = React; interface ILoadAudioDialogRef extends React.RefObject { readonly isOpen: boolean; open: () => void; close: () => void; } // let supportDialog = (window as any).HTMLDialogElement !== undefined; export const loadAudioDialogRef: ILoadAudioDialogRef = { current: null, get isOpen() { return this.current !== null && this.current.open; }, open() { if (this.current === null || this.current.open) { return; } this.current.open = true; }, close() { if (this.current === null || !this.current.open) { return; } this.current.open = false; }, }; interface ILoadAudioOptions { setAudioSrc: (src: string) => void; lang: Language; } export const LoadAudio: React.FC = ({ setAudioSrc, lang }) => { const self = useRef(Symbol(LoadAudio.name)); useEffect(() => { return audioStatePubSub.sub(self.current, (data) => { if (data.type === AudioActionType.getDuration) { loadAudioDialogRef.close(); } }); }, []); const onToggle = useCallback(() => { const onEscapeKeyDown = (ev: KeyboardEvent): void => { if (ev.code === "Escape" || ev.key === "Escape") { loadAudioDialogRef.close(); } }; if (loadAudioDialogRef.isOpen) { window.addEventListener("keydown", onEscapeKeyDown); } else { window.removeEventListener("keydown", onEscapeKeyDown); } }, []); const onSubmit = useCallback( (ev: React.FormEvent) => { ev.preventDefault(); const form = ev.target as HTMLFormElement; const urlInput = form.elements.namedItem("url") as HTMLInputElement; const url = nec(urlInput.value); sessionStorage.setItem(SSK.audioSrc, url); setAudioSrc(url); }, [setAudioSrc], ); const onFocus = useCallback((ev: React.FocusEvent) => { ev.target.select(); }, []); return ReactDOM.createPortal(
, document.body, ); }; export const nec = (url: string): string => { if (url.includes("music.163.com")) { const result = url.match(/\d{4,}/); if (result !== null) { const id = result[0]; return `https://music.163.com/song/media/outer/url?id=${id}.mp3`; } } return url; };