1import PluginManager from '@/core/pluginManager'; 2import {useCallback, useEffect, useRef, useState} from 'react'; 3 4export default function useAlbumDetail( 5 originalAlbumItem: IAlbum.IAlbumItem | null, 6) { 7 const currentPageRef = useRef(1); 8 const [loadMore, setLoadMore] = useState<'idle' | 'loading' | 'done'>( 9 'idle', 10 ); 11 const [albumItem, setAlbumItem] = useState<IAlbum.IAlbumItemBase | null>( 12 originalAlbumItem, 13 ); 14 const [musicList, setMusicList] = useState<IMusic.IMusicItem[]>( 15 originalAlbumItem?.musicList ?? [], 16 ); 17 18 const getAlbumDetail = useCallback( 19 async function () { 20 if (originalAlbumItem === null || loadMore !== 'idle') { 21 return; 22 } 23 24 try { 25 setLoadMore('loading'); 26 const result = await PluginManager.getByMedia( 27 originalAlbumItem, 28 )?.methods?.getAlbumInfo?.( 29 originalAlbumItem, 30 currentPageRef.current, 31 ); 32 if (result === null || result === undefined) { 33 throw new Error(); 34 } 35 if (result?.albumItem) { 36 setAlbumItem(prev => ({ 37 ...(prev ?? {}), 38 ...(result.albumItem as IAlbum.IAlbumItemBase), 39 platform: originalAlbumItem.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 getAlbumDetail(); 62 }, []); 63 64 return [loadMore, albumItem, musicList, getAlbumDetail] as const; 65} 66