1import PluginManager from '@/core/pluginManager'; 2import {resetMediaItem} from '@/utils/mediaItem'; 3import {useCallback, useEffect, useRef, useState} from 'react'; 4 5export default function (pluginHash: string, tag: ICommon.IUnique) { 6 const [sheets, setSheets] = useState<IMusic.IMusicSheetItemBase[]>([]); 7 const [status, setStatus] = useState<'loading' | 'idle' | 'done'>('idle'); 8 const currentTagRef = useRef<string>(); 9 const pageRef = useRef(0); 10 11 const query = useCallback(async () => { 12 if ( 13 (status === 'loading' || status === 'done') && 14 currentTagRef.current === tag.id 15 ) { 16 return; 17 } 18 if (currentTagRef.current !== tag.id) { 19 setSheets([]); 20 pageRef.current = 0; 21 } 22 pageRef.current++; 23 currentTagRef.current = tag.id; 24 const plugin = PluginManager.getByHash(pluginHash); 25 if (plugin) { 26 setStatus('loading'); 27 const res = await plugin.methods?.getRecommendSheetsByTag?.( 28 tag, 29 pageRef.current, 30 ); 31 console.log(res.isEnd); 32 if (tag.id === currentTagRef.current) { 33 setSheets(prev => [ 34 ...prev, 35 ...res.data!.map(item => 36 resetMediaItem(item, plugin.instance.platform), 37 ), 38 ]); 39 } 40 41 if (res.isEnd) { 42 setStatus('done'); 43 } else { 44 setStatus('idle'); 45 } 46 } else { 47 setStatus('done'); 48 setSheets([]); 49 } 50 }, [tag, status]); 51 52 useEffect(() => { 53 query(); 54 }, [tag]); 55 56 return [query, sheets, status] as const; 57} 58