xref: /MusicFree/src/pages/albumDetail/hooks/useAlbumMusicList.ts (revision ceb900cd812eb1b086ac040a306ddf325339e920)
1927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
2f9afcc0dS猫头猫import {useCallback, useEffect, useRef, useState} from 'react';
3bf6e62f2S猫头猫
4f9afcc0dS猫头猫export default function useAlbumDetail(
5f9afcc0dS猫头猫    originalAlbumItem: IAlbum.IAlbumItem | null,
6f9afcc0dS猫头猫) {
7f9afcc0dS猫头猫    const currentPageRef = useRef(1);
8*ceb900cdS猫头猫    const [loadMore, setLoadMore] = useState<'idle' | 'loading' | 'done'>(
9*ceb900cdS猫头猫        'idle',
10f9afcc0dS猫头猫    );
11f9afcc0dS猫头猫    const [albumItem, setAlbumItem] = useState<IAlbum.IAlbumItemBase | null>(
12f9afcc0dS猫头猫        originalAlbumItem,
13f9afcc0dS猫头猫    );
14f9afcc0dS猫头猫    const [musicList, setMusicList] = useState<IMusic.IMusicItem[]>(
15f9afcc0dS猫头猫        originalAlbumItem?.musicList ?? [],
16f9afcc0dS猫头猫    );
17f9afcc0dS猫头猫
18f9afcc0dS猫头猫    const getAlbumDetail = useCallback(
19f9afcc0dS猫头猫        async function () {
20*ceb900cdS猫头猫            if (originalAlbumItem === null || loadMore !== 'idle') {
21bf6e62f2S猫头猫                return;
22bf6e62f2S猫头猫            }
23f9afcc0dS猫头猫
24f9afcc0dS猫头猫            try {
25f9afcc0dS猫头猫                setLoadMore('loading');
26f9afcc0dS猫头猫                const result = await PluginManager.getByMedia(
27f9afcc0dS猫头猫                    originalAlbumItem,
28f9afcc0dS猫头猫                )?.methods?.getAlbumInfo?.(
29f9afcc0dS猫头猫                    originalAlbumItem,
30f9afcc0dS猫头猫                    currentPageRef.current,
31f9afcc0dS猫头猫                );
32f9afcc0dS猫头猫                if (result === null || result === undefined) {
33f9afcc0dS猫头猫                    throw new Error();
34f9afcc0dS猫头猫                }
35f9afcc0dS猫头猫                if (result?.albumItem) {
36f9afcc0dS猫头猫                    setAlbumItem(prev => ({
37efb9da24S猫头猫                        ...(prev ?? {}),
38f9afcc0dS猫头猫                        ...(result.albumItem as IAlbum.IAlbumItemBase),
39f9afcc0dS猫头猫                        platform: originalAlbumItem.platform,
40efb9da24S猫头猫                    }));
41efb9da24S猫头猫                }
42f9afcc0dS猫头猫                if (result?.musicList) {
43f9afcc0dS猫头猫                    setMusicList(prev => {
44f9afcc0dS猫头猫                        if (currentPageRef.current === 1) {
45f9afcc0dS猫头猫                            return result?.musicList ?? prev;
46f9afcc0dS猫头猫                        } else {
47f9afcc0dS猫头猫                            return [...prev, ...(result.musicList ?? [])];
48f9afcc0dS猫头猫                        }
497d7e864fS猫头猫                    });
50f9afcc0dS猫头猫                }
51*ceb900cdS猫头猫                setLoadMore(result.isEnd ? 'done' : 'idle');
52f9afcc0dS猫头猫                currentPageRef.current += 1;
53f9afcc0dS猫头猫            } catch {
54*ceb900cdS猫头猫                setLoadMore('idle');
55f9afcc0dS猫头猫            }
56f9afcc0dS猫头猫        },
57f9afcc0dS猫头猫        [loadMore],
58f9afcc0dS猫头猫    );
59f9afcc0dS猫头猫
60f9afcc0dS猫头猫    useEffect(() => {
61f9afcc0dS猫头猫        getAlbumDetail();
62bf6e62f2S猫头猫    }, []);
63f9afcc0dS猫头猫
64f9afcc0dS猫头猫    return [loadMore, albumItem, musicList, getAlbumDetail] as const;
65bf6e62f2S猫头猫}
66