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 console.log(currentTagRef, tag, pageRef.current, status); 13 if ( 14 (status === 'loading' || status === 'done') && 15 currentTagRef.current === tag.id 16 ) { 17 return; 18 } 19 if (currentTagRef.current !== tag.id) { 20 setSheets([]); 21 pageRef.current = 0; 22 } 23 pageRef.current++; 24 currentTagRef.current = tag.id; 25 const plugin = PluginManager.getByHash(pluginHash); 26 if (plugin) { 27 setStatus('loading'); 28 const res = await plugin.methods?.getRecommendSheetsByTag?.( 29 tag, 30 pageRef.current, 31 ); 32 console.log(res.isEnd); 33 if (tag.id === currentTagRef.current) { 34 setSheets(prev => [ 35 ...prev, 36 ...res.data!.map(item => 37 resetMediaItem(item, plugin.instance.platform), 38 ), 39 ]); 40 } 41 42 if (res.isEnd) { 43 setStatus('done'); 44 } else { 45 setStatus('idle'); 46 } 47 } else { 48 setStatus('done'); 49 setSheets([]); 50 } 51 }, [tag, status]); 52 53 useEffect(() => { 54 query(); 55 }, [tag]); 56 57 return [query, sheets, status] as const; 58} 59