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