xref: /MusicFree/src/pages/albumDetail/hooks/useAlbumMusicList.ts (revision ddece18e7942a667c4a0b92c4f164e9a18b0ceee)
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