xref: /MusicFree/src/pages/topListDetail/hooks/useTopListDetail.ts (revision 26421379c94d61588ef6dd92863329eaaccc6e3c)
1956ee1b7S猫头猫import {RequestStateCode} from '@/constants/commonConst';
2d384662fS猫头猫import PluginManager from '@/core/pluginManager';
3956ee1b7S猫头猫import {useEffect, useRef, useState} from 'react';
4d384662fS猫头猫
5d384662fS猫头猫export default function useTopListDetail(
692b6c95aS猫头猫    topListItem: IMusic.IMusicSheetItemBase | null,
7d384662fS猫头猫    pluginHash: string,
8d384662fS猫头猫) {
9d384662fS猫头猫    const [mergedTopListItem, setMergedTopListItem] =
1092b6c95aS猫头猫        useState<ICommon.WithMusicList<IMusic.IMusicSheetItemBase> | null>(
11d384662fS猫头猫            topListItem,
12d384662fS猫头猫        );
13956ee1b7S猫头猫
14956ee1b7S猫头猫    const pageRef = useRef(1);
15956ee1b7S猫头猫    const [requestState, setRequestState] = useState(RequestStateCode.IDLE);
16956ee1b7S猫头猫
17956ee1b7S猫头猫    async function loadMore() {
18956ee1b7S猫头猫        if (!topListItem) {
19956ee1b7S猫头猫            return;
20956ee1b7S猫头猫        }
21956ee1b7S猫头猫        try {
22*26421379S猫头猫            if (
23*26421379S猫头猫                requestState & RequestStateCode.LOADING ||
24*26421379S猫头猫                requestState === RequestStateCode.FINISHED
25*26421379S猫头猫            ) {
26*26421379S猫头猫                return;
27*26421379S猫头猫            }
28956ee1b7S猫头猫            if (pageRef.current === 1) {
29956ee1b7S猫头猫                setRequestState(RequestStateCode.PENDING_FIRST_PAGE);
30956ee1b7S猫头猫            } else {
31956ee1b7S猫头猫                setRequestState(RequestStateCode.PENDING_REST_PAGE);
32956ee1b7S猫头猫            }
33956ee1b7S猫头猫            const result = await PluginManager.getByHash(
34956ee1b7S猫头猫                pluginHash,
35956ee1b7S猫头猫            )?.methods?.getTopListDetail(topListItem, pageRef.current);
36956ee1b7S猫头猫            if (!result) {
37956ee1b7S猫头猫                throw new Error();
38956ee1b7S猫头猫            }
39956ee1b7S猫头猫            const currentPage = pageRef.current;
40956ee1b7S猫头猫            setMergedTopListItem(
41956ee1b7S猫头猫                prev =>
42956ee1b7S猫头猫                    ({
43956ee1b7S猫头猫                        ...prev,
44956ee1b7S猫头猫                        ...result.topListItem,
45956ee1b7S猫头猫                        musicList:
46956ee1b7S猫头猫                            currentPage === 1
47956ee1b7S猫头猫                                ? result.musicList ?? []
48956ee1b7S猫头猫                                : [
49956ee1b7S猫头猫                                      ...(prev?.musicList ?? []),
50956ee1b7S猫头猫                                      ...(result.musicList ?? []),
51956ee1b7S猫头猫                                  ],
52956ee1b7S猫头猫                    } as IMusic.IMusicSheetItem),
53956ee1b7S猫头猫            );
54956ee1b7S猫头猫
55*26421379S猫头猫            if (result.isEnd === false) {
56956ee1b7S猫头猫                setRequestState(RequestStateCode.IDLE);
57956ee1b7S猫头猫            } else {
58956ee1b7S猫头猫                setRequestState(RequestStateCode.FINISHED);
59956ee1b7S猫头猫            }
60956ee1b7S猫头猫            pageRef.current++;
61956ee1b7S猫头猫        } catch {
62956ee1b7S猫头猫            setRequestState(RequestStateCode.FINISHED);
63956ee1b7S猫头猫        }
64956ee1b7S猫头猫    }
65956ee1b7S猫头猫
66d384662fS猫头猫    useEffect(() => {
67d384662fS猫头猫        if (topListItem === null) {
68d384662fS猫头猫            return;
69d384662fS猫头猫        }
70956ee1b7S猫头猫        loadMore();
71d384662fS猫头猫    }, []);
72956ee1b7S猫头猫    return [mergedTopListItem, requestState, loadMore] as const;
73d384662fS猫头猫}
74