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