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