1import {RequestStateCode} from '@/constants/commonConst'; 2import PluginManager from '@/core/pluginManager'; 3import {useEffect, useRef, useState} from 'react'; 4 5export default function useTopListDetail( 6 topListItem: IMusic.IMusicSheetItemBase | null, 7 pluginHash: string, 8) { 9 const [mergedTopListItem, setMergedTopListItem] = 10 useState<ICommon.WithMusicList<IMusic.IMusicSheetItemBase> | null>( 11 topListItem, 12 ); 13 14 const pageRef = useRef(1); 15 const [requestState, setRequestState] = useState(RequestStateCode.IDLE); 16 17 async function loadMore() { 18 if (!topListItem) { 19 return; 20 } 21 try { 22 if ( 23 requestState & RequestStateCode.LOADING || 24 requestState === RequestStateCode.FINISHED 25 ) { 26 return; 27 } 28 if (pageRef.current === 1) { 29 setRequestState(RequestStateCode.PENDING_FIRST_PAGE); 30 } else { 31 setRequestState(RequestStateCode.PENDING_REST_PAGE); 32 } 33 const result = await PluginManager.getByHash( 34 pluginHash, 35 )?.methods?.getTopListDetail(topListItem, pageRef.current); 36 if (!result) { 37 throw new Error(); 38 } 39 const currentPage = pageRef.current; 40 setMergedTopListItem( 41 prev => 42 ({ 43 ...prev, 44 ...result.topListItem, 45 musicList: 46 currentPage === 1 47 ? result.musicList ?? [] 48 : [ 49 ...(prev?.musicList ?? []), 50 ...(result.musicList ?? []), 51 ], 52 } as IMusic.IMusicSheetItem), 53 ); 54 55 if (result.isEnd === false) { 56 setRequestState(RequestStateCode.IDLE); 57 } else { 58 setRequestState(RequestStateCode.FINISHED); 59 } 60 pageRef.current++; 61 } catch { 62 setRequestState(RequestStateCode.FINISHED); 63 } 64 } 65 66 useEffect(() => { 67 if (topListItem === null) { 68 return; 69 } 70 loadMore(); 71 }, []); 72 return [mergedTopListItem, requestState, loadMore] as const; 73} 74