import type { GeneratorType } from '@/app/components/app/configuration/config/automatic/types' import type { ApiKeysListResponse, AppDailyConversationsResponse, AppDailyEndUsersResponse, AppDailyMessagesResponse, AppStatisticsResponse, AppTokenCostsResponse, AppVoicesListResponse, WorkflowDailyConversationsResponse, } from '@/models/app' import type { App } from '@/types/app' import { useMutation, useQuery, useQueryClient, } from '@tanstack/react-query' import { consoleClient, consoleQuery } from '@/service/client' import { get, post } from './base' const NAME_SPACE = 'apps' type DateRangeParams = { start?: string end?: string } 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 useInvalidateAppList = () => { const queryClient = useQueryClient() return () => { queryClient.invalidateQueries({ queryKey: consoleQuery.apps.list.key(), }) } } export const useDeleteAppMutation = () => { const queryClient = useQueryClient() return useMutation({ mutationKey: consoleQuery.apps.deleteApp.mutationKey(), mutationFn: (appId: string) => { return consoleClient.apps.deleteApp({ params: { appId }, }) }, onSuccess: async () => { await Promise.all([ queryClient.invalidateQueries({ queryKey: consoleQuery.apps.list.key(), }), queryClient.invalidateQueries({ queryKey: useAppFullListKey, }), ]) }, }) } 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], }) } }