geo/frontend/lib/hooks/use-content-data.ts

66 lines
1.7 KiB
TypeScript

/**
* 内容工坊页面数据获取 Hook
*
* 封装内容列表 + 知识库列表的 SWR 请求,替代手动 useState + useEffect 模式。
* 两个请求并行发出,无数据依赖。
*/
import { useApi } from "./use-api";
import type { SWRConfiguration } from "swr";
import type { Content } from "@/lib/api/contents";
import type { KnowledgeBase } from "@/lib/api/knowledge";
export interface UseContentDataReturn {
/** 内容列表 */
contents: Content[] | undefined;
/** 知识库列表 */
knowledgeBases: KnowledgeBase[] | undefined;
/** 是否正在加载(任一请求加载中) */
isLoading: boolean;
/** 错误信息 */
error: Error | undefined;
/** 刷新内容列表 */
refreshContents: () => void;
/** 刷新知识库列表 */
refreshKnowledgeBases: () => void;
}
export interface UseContentDataOptions {
/** SWR 配置(用于测试时禁用重试等) */
swrOptions?: SWRConfiguration;
}
export function useContentData(
options?: UseContentDataOptions
): UseContentDataReturn {
const swrOptions = options?.swrOptions;
// 内容列表
const {
data: contents,
isLoading: contentsLoading,
error: contentsError,
refresh: refreshContents,
} = useApi<Content[]>("/api/v1/contents/", swrOptions);
// 知识库列表(仅获取 enterprise 类型)
const {
data: knowledgeBases,
isLoading: kbLoading,
error: kbError,
refresh: refreshKnowledgeBases,
} = useApi<KnowledgeBase[]>("/api/v1/knowledge/bases/?type=enterprise", swrOptions);
const isLoading = contentsLoading || kbLoading;
const error = contentsError || kbError;
return {
contents,
knowledgeBases,
isLoading,
error,
refreshContents,
refreshKnowledgeBases,
};
}