xref: /MusicFree/src/pages/topListDetail/hooks/useTopListDetail.ts (revision 316c909695af8978fd54ffb10af86d9214d66fef)
1import {RequestStateCode} from '@/constants/commonConst';
2import PluginManager from '@/core/pluginManager';
3import {useEffect, useRef, useState} from 'react';
4
5export default function useTopListDetail(
6    topListItem: IMusic.IMusicSheetItemBase | null,
7    pluginHash: string,
8) {
9    const [mergedTopListItem, setMergedTopListItem] =
10        useState<ICommon.WithMusicList<IMusic.IMusicSheetItemBase> | null>(
11            topListItem,
12        );
13
14    const pageRef = useRef(1);
15    const [requestState, setRequestState] = useState(RequestStateCode.IDLE);
16
17    async function loadMore() {
18        if (!topListItem) {
19            return;
20        }
21        try {
22            if (pageRef.current === 1) {
23                setRequestState(RequestStateCode.PENDING_FIRST_PAGE);
24            } else {
25                setRequestState(RequestStateCode.PENDING_REST_PAGE);
26            }
27            const result = await PluginManager.getByHash(
28                pluginHash,
29            )?.methods?.getTopListDetail(topListItem, pageRef.current);
30            if (!result) {
31                throw new Error();
32            }
33            const currentPage = pageRef.current;
34            setMergedTopListItem(
35                prev =>
36                    ({
37                        ...prev,
38                        ...result.topListItem,
39                        musicList:
40                            currentPage === 1
41                                ? result.musicList ?? []
42                                : [
43                                      ...(prev?.musicList ?? []),
44                                      ...(result.musicList ?? []),
45                                  ],
46                    } as IMusic.IMusicSheetItem),
47            );
48
49            if (!result.isEnd) {
50                setRequestState(RequestStateCode.IDLE);
51            } else {
52                setRequestState(RequestStateCode.FINISHED);
53            }
54            pageRef.current++;
55        } catch {
56            setRequestState(RequestStateCode.FINISHED);
57        }
58    }
59
60    useEffect(() => {
61        if (topListItem === null) {
62            return;
63        }
64        loadMore();
65    }, []);
66    return [mergedTopListItem, requestState, loadMore] as const;
67}
68