xref: /MusicFree/src/pages/artistDetail/hooks/useQuery.ts (revision 2aa881935ca35b8fb1abc4206e0dc35149231456)
1import {errorLog} from '@/utils/log';
2import {RequestStateCode} from '@/constants/commonConst';
3import produce from 'immer';
4import {useAtom} from 'jotai';
5import {useCallback} from 'react';
6import {queryResultAtom} from '../store/atoms';
7import PluginManager from '@/core/pluginManager';
8
9export default function useQueryArtist(pluginHash: string) {
10    const [queryResults, setQueryResults] = useAtom(queryResultAtom);
11
12    const queryArtist = useCallback(
13        async (
14            artist: IArtist.IArtistItem,
15            page?: number,
16            type: IArtist.ArtistMediaType = 'music',
17        ) => {
18            const plugin = PluginManager.getByHash(pluginHash);
19
20            const prevResult = queryResults[type];
21            if (
22                prevResult?.state === RequestStateCode.PENDING ||
23                prevResult?.state === RequestStateCode.FINISHED
24            ) {
25                return;
26            }
27            page = page ?? (prevResult.page ?? 0) + 1;
28            try {
29                setQueryResults(
30                    produce(draft => {
31                        draft[type].state = RequestStateCode.PENDING;
32                    }),
33                );
34                const result = await plugin?.methods?.getArtistWorks?.(
35                    artist,
36                    page,
37                    type,
38                );
39                setQueryResults(
40                    produce(draft => {
41                        draft[type].page = page;
42                        draft[type].state =
43                            result?.isEnd === false
44                                ? RequestStateCode.PARTLY_DONE
45                                : RequestStateCode.FINISHED;
46                        draft[type].data = (draft[type].data ?? []).concat(
47                            result?.data ?? [],
48                        );
49                    }),
50                );
51            } catch (e) {
52                errorLog('拉取作者信息失败', e);
53                setQueryResults(
54                    produce(draft => {
55                        draft[type].state = RequestStateCode.PARTLY_DONE;
56                    }),
57                );
58            }
59        },
60        [queryResults],
61    );
62
63    return queryArtist;
64}
65