xref: /MusicFree/src/pages/artistDetail/hooks/useQuery.ts (revision b882a19d884fffa32f7c8cef31652b909dceaa0f)
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
35                const result = await plugin?.methods?.queryArtistWorks?.(
36                    artist,
37                    page,
38                    type,
39                );
40                setQueryResults(
41                    produce(draft => {
42                        draft[type].page = page;
43                        draft[type].state =
44                            result?.isEnd === false
45                                ? RequestStateCode.PARTLY_DONE
46                                : RequestStateCode.FINISHED;
47                        draft[type].data = (draft[type].data ?? []).concat(
48                            result?.data ?? [],
49                        );
50                    }),
51                );
52            } catch (e) {
53                errorLog('拉取作者信息失败', e);
54                setQueryResults(
55                    produce(draft => {
56                        draft[type].state = RequestStateCode.PARTLY_DONE;
57                    }),
58                );
59            }
60        },
61        [queryResults],
62    );
63
64    return queryArtist;
65}
66