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 as any, 28 )?.methods?.getMusicSheetInfo?.( 29 originalSheetItem, 30 currentPageRef.current, 31 ); 32 if (result === null || result === undefined) { 33 throw new Error(); 34 } 35 if (result?.sheetItem) { 36 setSheetItem(prev => ({ 37 ...(prev ?? {}), 38 ...(result.sheetItem as IMusic.IMusicSheetItem), 39 platform: originalSheetItem.platform, 40 })); 41 } 42 if (result?.musicList) { 43 setMusicList(prev => { 44 if (currentPageRef.current === 1) { 45 return result?.musicList ?? prev; 46 } else { 47 return [...prev, ...(result.musicList ?? [])]; 48 } 49 }); 50 } 51 setLoadMore(result.isEnd ? 'done' : 'idle'); 52 currentPageRef.current += 1; 53 } catch { 54 setLoadMore('idle'); 55 } 56 }, 57 [loadMore], 58 ); 59 60 useEffect(() => { 61 getSheetDetail(); 62 }, []); 63 64 return [loadMore, sheetItem, musicList, getSheetDetail] as const; 65} 66