xref: /MusicFree/src/pages/topListDetail/hooks/useTopListDetail.ts (revision 410a159129b1f6a7a1f44fde7bfad9a46f91e161)
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 (
23                requestState & RequestStateCode.LOADING ||
24                requestState === RequestStateCode.FINISHED
25            ) {
26                return;
27            }
28            if (pageRef.current === 1) {
29                setRequestState(RequestStateCode.PENDING_FIRST_PAGE);
30            } else {
31                setRequestState(RequestStateCode.PENDING_REST_PAGE);
32            }
33            const result = await PluginManager.getByHash(
34                pluginHash,
35            )?.methods?.getTopListDetail(topListItem, pageRef.current);
36            if (!result) {
37                throw new Error();
38            }
39            const currentPage = pageRef.current;
40            setMergedTopListItem(
41                prev =>
42                    ({
43                        ...prev,
44                        ...result.topListItem,
45                        musicList:
46                            currentPage === 1
47                                ? result.musicList ?? []
48                                : [
49                                      ...(prev?.musicList ?? []),
50                                      ...(result.musicList ?? []),
51                                  ],
52                    } as IMusic.IMusicSheetItem),
53            );
54
55            if (result.isEnd === false) {
56                setRequestState(RequestStateCode.IDLE);
57            } else {
58                setRequestState(RequestStateCode.FINISHED);
59            }
60            pageRef.current++;
61        } catch {
62            setRequestState(RequestStateCode.FINISHED);
63        }
64    }
65
66    useEffect(() => {
67        if (topListItem === null) {
68            return;
69        }
70        loadMore();
71    }, []);
72    return [mergedTopListItem, requestState, loadMore] as const;
73}
74