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