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 (pageRef.current === 1) { 23 setRequestState(RequestStateCode.PENDING_FIRST_PAGE); 24 } else { 25 setRequestState(RequestStateCode.PENDING_REST_PAGE); 26 } 27 const result = await PluginManager.getByHash( 28 pluginHash, 29 )?.methods?.getTopListDetail(topListItem, pageRef.current); 30 if (!result) { 31 throw new Error(); 32 } 33 const currentPage = pageRef.current; 34 setMergedTopListItem( 35 prev => 36 ({ 37 ...prev, 38 ...result.topListItem, 39 musicList: 40 currentPage === 1 41 ? result.musicList ?? [] 42 : [ 43 ...(prev?.musicList ?? []), 44 ...(result.musicList ?? []), 45 ], 46 } as IMusic.IMusicSheetItem), 47 ); 48 49 if (!result.isEnd) { 50 setRequestState(RequestStateCode.IDLE); 51 } else { 52 setRequestState(RequestStateCode.FINISHED); 53 } 54 pageRef.current++; 55 } catch { 56 setRequestState(RequestStateCode.FINISHED); 57 } 58 } 59 60 useEffect(() => { 61 if (topListItem === null) { 62 return; 63 } 64 loadMore(); 65 }, []); 66 return [mergedTopListItem, requestState, loadMore] as const; 67} 68