dify/web/features/deployments/hooks/use-source-apps.ts
2026-04-30 09:56:50 +08:00

82 lines
2.4 KiB
TypeScript

'use client'
import type { AppInfo } from '../types'
import type { AppDeploymentSummary, EnvironmentOption } from '@/contract/console/deployments'
import { useQuery } from '@tanstack/react-query'
import { useMemo } from 'react'
import { consoleQuery } from '@/service/client'
import { toAppInfoFromSummary } from '../data'
const MAX_SOURCE_APPS = 100
type UseSourceAppsOptions = {
enabled?: boolean
environmentId?: string
keyword?: string
notDeployed?: boolean
}
type DeploymentEnvironmentFilter = {
id?: string
name?: string
kind?: string
disabled?: boolean
disabledReason?: string
}
export function useSourceApps(options: UseSourceAppsOptions = {}) {
const { enabled = true, environmentId, keyword, notDeployed } = options
const query = useMemo(() => ({
pageNumber: 1,
resultsPerPage: MAX_SOURCE_APPS,
...(environmentId ? { environmentId } : {}),
...(notDeployed ? { notDeployed: true } : {}),
...(keyword?.trim() ? { query: keyword.trim() } : {}),
}), [environmentId, keyword, notDeployed])
const listQuery = useQuery(consoleQuery.deployments.list.queryOptions({
input: { query },
enabled,
staleTime: 30 * 1000,
}))
const apps = useMemo<AppInfo[]>(() => {
return (listQuery.data?.data ?? [])
.map(toAppInfoFromSummary)
.filter((app): app is AppInfo => Boolean(app))
}, [listQuery.data?.data])
const appMap = useMemo<Map<string, AppInfo>>(() => {
return new Map(apps.map(a => [a.id, a]))
}, [apps])
const summaries = useMemo<Record<string, AppDeploymentSummary>>(() => {
return Object.fromEntries(
(listQuery.data?.data ?? [])
.filter(summary => summary.id)
.map(summary => [summary.id!, summary]),
)
}, [listQuery.data?.data])
const environmentOptions = useMemo<EnvironmentOption[]>(() => {
return ((listQuery.data?.filters ?? []) as DeploymentEnvironmentFilter[])
.filter(filter => filter.kind === 'environment' && filter.id)
.map(filter => ({
id: filter.id,
name: filter.name,
disabled: filter.disabled,
disabledReason: filter.disabledReason,
}))
}, [listQuery.data?.filters])
return {
apps,
appMap,
summaries,
environmentOptions,
isLoading: listQuery.isLoading,
isFetching: listQuery.isFetching,
isError: listQuery.isError,
isEmpty: !listQuery.isLoading && apps.length === 0,
}
}