1import PluginManager from '@/core/pluginManager'; 2import {useCallback, useEffect, useRef, useState} from 'react'; 3 4export default function usePluginSheetMusicList( 5 originalSheetItem: IMusic.IMusicSheetItem | null, 6) { 7 const currentPageRef = useRef(1); 8 const [loadMore, setLoadMore] = useState<'idle' | 'loading' | 'done'>( 9 'idle', 10 ); 11 const [sheetItem, setSheetItem] = useState<IMusic.IMusicSheetItem | null>( 12 originalSheetItem, 13 ); 14 const [musicList, setMusicList] = useState<IMusic.IMusicItem[]>( 15 originalSheetItem?.musicList ?? [], 16 ); 17 18 const getSheetDetail = useCallback( 19 async function () { 20 if (originalSheetItem === null || loadMore !== 'idle') { 21 return; 22 } 23 24 try { 25 setLoadMore('loading'); 26 const result = await PluginManager.getByMedia( 27 originalSheetItem, 28 )?.methods?.getMusicSheetInfo?.( 29 originalSheetItem, 30 currentPageRef.current, 31 ); 32 console.log(result, 'ddd'); 33 if (result === null || result === undefined) { 34 throw new Error(); 35 } 36 if (result?.sheetItem) { 37 setSheetItem(prev => ({ 38 ...(prev ?? {}), 39 ...(result.sheetItem as IMusic.IMusicSheetItem), 40 platform: originalSheetItem.platform, 41 })); 42 } 43 if (result?.musicList) { 44 setMusicList(prev => { 45 if (currentPageRef.current === 1) { 46 return result?.musicList ?? prev; 47 } else { 48 return [...prev, ...(result.musicList ?? [])]; 49 } 50 }); 51 } 52 setLoadMore(result.isEnd ? 'done' : 'idle'); 53 currentPageRef.current += 1; 54 } catch { 55 setLoadMore('idle'); 56 } 57 }, 58 [loadMore], 59 ); 60 61 useEffect(() => { 62 getSheetDetail(); 63 }, []); 64 65 return [loadMore, sheetItem, musicList, getSheetDetail] as const; 66} 67