diff --git a/src/hooks/use-api.ts b/src/hooks/use-api.ts index 97ea0c9..667fae7 100644 --- a/src/hooks/use-api.ts +++ b/src/hooks/use-api.ts @@ -12,21 +12,21 @@ // - 用户可读错误信息(errorMessage) // ============================================================ -import { useMemo } from 'react'; -import { useAppContext } from '@/contexts/app-context'; +import {useMemo} from 'react'; +import {useAppContext} from '@/contexts/app-context'; import { - TaskAPI, - ModelAPI, - fetchBanners, - MODEL_CATEGORY_LABELS, - type TaskListRequestParams, - type TaskInfoItemResponseBody, - type CreatTaskRequestBody, - type ModelsListResponseBody, - type Banner, - type ModelCategory, + TaskAPI, + ModelAPI, + fetchBanners, + MODEL_CATEGORY_LABELS, + type TaskListRequestParams, + type TaskInfoItemResponseBody, + type CreatTaskRequestBody, + type ModelsListResponseBody, + type Banner, + type ModelCategory, } from '@/services/modules'; -import { useAsyncData, useAsyncMutation } from './use-async'; +import {useAsyncData, useAsyncMutation} from './use-async'; // ============================================================ // Banner @@ -34,13 +34,13 @@ import { useAsyncData, useAsyncMutation } from './use-async'; /** 首页轮播图数据 Hook */ export function useBannerList() { - const { isLoggedIn } = useAppContext(); + const {isLoggedIn} = useAppContext(); - return useAsyncData( - fetchBanners, - [], - { enabled: isLoggedIn, label: 'banner-list' }, - ); + return useAsyncData( + fetchBanners, + [], + {enabled: isLoggedIn, label: 'banner-list'}, + ); } // ============================================================ @@ -49,53 +49,53 @@ export function useBannerList() { /** 模型列表数据 Hook(按类别分别请求后合并) */ export function useModelList() { - const { isLoggedIn } = useAppContext(); + const {isLoggedIn} = useAppContext(); - // 使用单个 fetcher 返回合并后的结果 - const result = useAsyncData( - async () => { - const categories: ModelCategory[] = ['txt2img', 'img2img', 'img2video', 'txt2audio']; - const results = await Promise.allSettled( - categories.map((category) => - ModelAPI.fetchModels({ - provider_name: '', - category, - page: 1, - page_size: 50, - }), - ), - ); + // 使用单个 fetcher 返回合并后的结果 + const result = useAsyncData( + async () => { + const categories: ModelCategory[] = ["image_to_image", "text_to_image", "image_to_video", "text_to_audio"]; + const results = await Promise.allSettled( + categories.map((category) => + ModelAPI.fetchModels({ + provider_name: '', + category, + page: 1, + page_size: 50, + }), + ), + ); - const allModels: ModelsListResponseBody[] = []; - results.forEach((r) => { - if (r.status === 'fulfilled') { - allModels.push(...r.value); - } - }); - // 按优先级降序排列 - allModels.sort((a, b) => b.priority - a.priority); - return allModels; - }, - [], - { enabled: isLoggedIn, label: 'model-list' }, - ); + const allModels: ModelsListResponseBody[] = []; + results.forEach((r) => { + if (r.status === 'fulfilled') { + allModels.push(...r.value); + } + }); + // 按优先级降序排列 + allModels.sort((a, b) => b.priority - a.priority); + return allModels; + }, + [], + {enabled: isLoggedIn, label: 'model-list'}, + ); - // 按类别分组 - const groupedModels = useMemo(() => { - const groups = new Map(); - result.data?.forEach((model) => { - const cat = model.category_name || 'other'; - if (!groups.has(cat)) groups.set(cat, []); - groups.get(cat)!.push(model); - }); - return groups; - }, [result.data]); + // 按类别分组 + const groupedModels = useMemo(() => { + const groups = new Map(); + result.data?.forEach((model) => { + const cat = model.category_name || 'other'; + if (!groups.has(cat)) groups.set(cat, []); + groups.get(cat)!.push(model); + }); + return groups; + }, [result.data]); - return { - ...result, - /** 按类别分组后的模型 */ - groupedModels, - }; + return { + ...result, + /** 按类别分组后的模型 */ + groupedModels, + }; } // ============================================================ @@ -103,10 +103,10 @@ export function useModelList() { // ============================================================ export interface UseTaskListParams { - /** 完整的 API 请求参数(由调用方根据 antd Table onChange 构建) */ - requestParams: TaskListRequestParams; - /** 外部传入的刷新信号(任意变化触发重新请求) */ - refreshSignal?: number; + /** 完整的 API 请求参数(由调用方根据 antd Table onChange 构建) */ + requestParams: TaskListRequestParams; + /** 外部传入的刷新信号(任意变化触发重新请求) */ + refreshSignal?: number; } /** @@ -116,14 +116,14 @@ export interface UseTaskListParams { * 本 Hook 仅负责数据获取、竞态控制、错误日志。 */ export function useTaskList(params: UseTaskListParams) { - const { isLoggedIn } = useAppContext(); - const { requestParams, refreshSignal = 0 } = params; + const {isLoggedIn} = useAppContext(); + const {requestParams, refreshSignal = 0} = params; - return useAsyncData( - () => TaskAPI.getTaskList(requestParams), - [requestParams, refreshSignal], - { enabled: isLoggedIn, label: 'task-list' }, - ); + return useAsyncData( + () => TaskAPI.getTaskList(requestParams), + [requestParams, refreshSignal], + {enabled: isLoggedIn, label: 'task-list'}, + ); } // ============================================================ @@ -132,13 +132,13 @@ export function useTaskList(params: UseTaskListParams) { /** 任务详情 Hook(taskId 为 null 时不请求) */ export function useTaskDetail(taskId: string | null | undefined) { - const { isLoggedIn } = useAppContext(); + const {isLoggedIn} = useAppContext(); - return useAsyncData( - () => TaskAPI.getTaskInfo(taskId!), - [taskId], - { enabled: isLoggedIn && !!taskId, label: 'task-detail' }, - ); + return useAsyncData( + () => TaskAPI.getTaskInfo(taskId!), + [taskId], + {enabled: isLoggedIn && !!taskId, label: 'task-detail'}, + ); } // ============================================================ @@ -147,20 +147,20 @@ export function useTaskDetail(taskId: string | null | undefined) { /** 提交任务 Mutation Hook */ export function useSubmitTask(options?: { - onSuccess?: (data: TaskInfoItemResponseBody) => void; - onError?: (err: Error) => void; + onSuccess?: (data: TaskInfoItemResponseBody) => void; + onError?: (err: Error) => void; }) { - return useAsyncMutation( - (body) => TaskAPI.submitTask(body), - { - label: 'submit-task', - onSuccess: options?.onSuccess, - onError: options?.onError, - }, - ); + return useAsyncMutation( + (body) => TaskAPI.submitTask(body), + { + label: 'submit-task', + onSuccess: options?.onSuccess, + onError: options?.onError, + }, + ); } // ---------- 重新导出类型和工具 ---------- -export { MODEL_CATEGORY_LABELS }; -export type { ModelCategory, ModelsListResponseBody, TaskInfoItemResponseBody, Banner }; +export {MODEL_CATEGORY_LABELS}; +export type {ModelCategory, ModelsListResponseBody, TaskInfoItemResponseBody, Banner};