xref: /MusicFree/src/pages/pluginSheetDetail/hooks/usePluginSheetMusicList.ts (revision ddece18e7942a667c4a0b92c4f164e9a18b0ceee)
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,
28                )?.methods?.getMusicSheetInfo?.(
29                    originalSheetItem,
30                    currentPageRef.current,
31                );
32                console.log(result, 'ddd');
33                if (result === null || result === undefined) {
34                    throw new Error();
35                }
36                if (result?.sheetItem) {
37                    setSheetItem(prev => ({
38                        ...(prev ?? {}),
39                        ...(result.sheetItem as IMusic.IMusicSheetItem),
40                        platform: originalSheetItem.platform,
41                    }));
42                }
43                if (result?.musicList) {
44                    setMusicList(prev => {
45                        if (currentPageRef.current === 1) {
46                            return result?.musicList ?? prev;
47                        } else {
48                            return [...prev, ...(result.musicList ?? [])];
49                        }
50                    });
51                }
52                setLoadMore(result.isEnd ? 'done' : 'idle');
53                currentPageRef.current += 1;
54            } catch {
55                setLoadMore('idle');
56            }
57        },
58        [loadMore],
59    );
60
61    useEffect(() => {
62        getSheetDetail();
63    }, []);
64
65    return [loadMore, sheetItem, musicList, getSheetDetail] as const;
66}
67