import { get, post } from './base' import type { ApiKeysListResponse, AppDailyConversationsResponse, AppDailyEndUsersResponse, AppDailyMessagesResponse, AppListResponse, AppStatisticsResponse, AppTokenCostsResponse, AppVoicesListResponse, WorkflowDailyConversationsResponse, } from '@/models/app' import type { App, AppModeEnum } from '@/types/app' import { useInvalid } from './use-base' import { useInfiniteQuery, useQuery, useQueryClient, } from '@tanstack/react-query' import type { GeneratorType } from '@/app/components/app/configuration/config/automatic/types' const NAME_SPACE = 'apps' type AppListParams = { page?: number limit?: number name?: string mode?: AppModeEnum | 'all' tag_ids?: string[] is_created_by_me?: boolean } type DateRangeParams = { start?: string end?: string } const normalizeAppListParams = (params: AppListParams) => { const { page = 1, limit = 30, name = '', mode, tag_ids, is_created_by_me, } = params return { page, limit, name, ...(mode && mode !== 'all' ? { mode } : {}), ...(tag_ids?.length ? { tag_ids } : {}), ...(is_created_by_me ? { is_created_by_me } : {}), } } const appListKey = (params: AppListParams) => [NAME_SPACE, 'list', params] const useAppFullListKey = [NAME_SPACE, 'full-list'] export const useGenerateRuleTemplate = (type: GeneratorType, disabled?: boolean) => { return useQuery({ queryKey: [NAME_SPACE, 'generate-rule-template', type], queryFn: () => post<{ data: string }>('instruction-generate/template', { body: { type, }, }), enabled: !disabled, retry: 0, }) } export const useAppDetail = (appID: string) => { return useQuery({ queryKey: [NAME_SPACE, 'detail', appID], queryFn: () => get(`/apps/${appID}`), enabled: !!appID, }) } export const useAppList = (params: AppListParams, options?: { enabled?: boolean }) => { const normalizedParams = normalizeAppListParams(params) return useQuery({ queryKey: appListKey(normalizedParams), queryFn: () => get('/apps', { params: normalizedParams }), ...options, }) } export const useAppFullList = () => { return useQuery({ queryKey: useAppFullListKey, queryFn: () => get('/apps', { params: { page: 1, limit: 100, name: '' } }), }) } export const useInvalidateAppFullList = () => { return useInvalid(useAppFullListKey) } export const useInfiniteAppList = (params: AppListParams, options?: { enabled?: boolean }) => { const normalizedParams = normalizeAppListParams(params) return useInfiniteQuery({ queryKey: appListKey(normalizedParams), queryFn: ({ pageParam = normalizedParams.page }) => get('/apps', { params: { ...normalizedParams, page: pageParam } }), getNextPageParam: lastPage => lastPage.has_more ? lastPage.page + 1 : undefined, initialPageParam: normalizedParams.page, ...options, }) } export const useInvalidateAppList = () => { const queryClient = useQueryClient() return () => { queryClient.invalidateQueries({ queryKey: [NAME_SPACE, 'list'], }) } } const useAppStatisticsQuery = (metric: string, appId: string, params?: DateRangeParams) => { return useQuery({ queryKey: [NAME_SPACE, 'statistics', metric, appId, params], queryFn: () => get(`/apps/${appId}/statistics/${metric}`, { params }), enabled: !!appId, }) } const useWorkflowStatisticsQuery = (metric: string, appId: string, params?: DateRangeParams) => { return useQuery({ queryKey: [NAME_SPACE, 'workflow-statistics', metric, appId, params], queryFn: () => get(`/apps/${appId}/workflow/statistics/${metric}`, { params }), enabled: !!appId, }) } export const useAppDailyMessages = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('daily-messages', appId, params) } export const useAppDailyConversations = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('daily-conversations', appId, params) } export const useAppDailyEndUsers = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('daily-end-users', appId, params) } export const useAppAverageSessionInteractions = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('average-session-interactions', appId, params) } export const useAppAverageResponseTime = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('average-response-time', appId, params) } export const useAppTokensPerSecond = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('tokens-per-second', appId, params) } export const useAppSatisfactionRate = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('user-satisfaction-rate', appId, params) } export const useAppTokenCosts = (appId: string, params?: DateRangeParams) => { return useAppStatisticsQuery('token-costs', appId, params) } export const useWorkflowDailyConversations = (appId: string, params?: DateRangeParams) => { return useWorkflowStatisticsQuery('daily-conversations', appId, params) } export const useWorkflowDailyTerminals = (appId: string, params?: DateRangeParams) => { return useWorkflowStatisticsQuery('daily-terminals', appId, params) } export const useWorkflowTokenCosts = (appId: string, params?: DateRangeParams) => { return useWorkflowStatisticsQuery('token-costs', appId, params) } export const useWorkflowAverageInteractions = (appId: string, params?: DateRangeParams) => { return useWorkflowStatisticsQuery('average-app-interactions', appId, params) } export const useAppVoices = (appId?: string, language?: string) => { return useQuery({ queryKey: [NAME_SPACE, 'voices', appId, language || 'en-US'], queryFn: () => get(`/apps/${appId}/text-to-audio/voices`, { params: { language: language || 'en-US' } }), enabled: !!appId, }) } export const useAppApiKeys = (appId?: string, options?: { enabled?: boolean }) => { return useQuery({ queryKey: [NAME_SPACE, 'api-keys', appId], queryFn: () => get(`/apps/${appId}/api-keys`), enabled: !!appId && (options?.enabled ?? true), }) } export const useInvalidateAppApiKeys = () => { const queryClient = useQueryClient() return (appId?: string) => { if (!appId) return queryClient.invalidateQueries({ queryKey: [NAME_SPACE, 'api-keys', appId], }) } }