xref: /MusicFree/src/pages/artistDetail/hooks/useQuery.ts (revision 6704747af84cebd842b258efac7143542722fac5)
1import {errorLog, trace} 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