'use client' import type { AccessChannels, ApiKey, Environment, } from '@dify/contracts/enterprise/types.gen' import type { ReactNode } from 'react' import { Button } from '@langgenius/dify-ui/button' import { Switch, SwitchSkeleton } from '@langgenius/dify-ui/switch' import { useMutation } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { consoleQuery } from '@/service/client' import { DeploymentEmptyState, DeploymentStateMessage } from '../../../components/empty-state' import { DeveloperApiDocsDrawer } from './api-docs-drawer' import { ApiKeyGenerateMenu } from './api-key-generate-menu' import { ApiKeyList } from './api-key-list' import { CopyPill } from './common' import { CreatedApiTokenDialog } from './developer-api-created-token-dialog' import { DeveloperApiSkeleton } from './developer-api-skeleton' import { developerApiSettingsQueryAtom } from './state' type CreatedApiToken = { appInstanceId: string token: string } function useDeveloperApiSettings() { const developerApiSettingsQuery = useAtomValue(developerApiSettingsQueryAtom) const accessChannels = developerApiSettingsQuery.data?.accessChannels const apiEnabled = accessChannels?.developerApiEnabled ?? false const environments = developerApiSettingsQuery.data?.environments ?? [] const apiKeys: ApiKey[] = developerApiSettingsQuery.data?.apiKeys ?? [] const apiUrl = developerApiSettingsQuery.data?.developerApiUrl.apiUrl return { apiEnabled, accessChannels, apiUrl, environments, apiKeys, isLoading: developerApiSettingsQuery.isLoading, isError: developerApiSettingsQuery.isError, } } function DeveloperApiSwitch({ appInstanceId, checked, accessChannels, disabled }: { appInstanceId: string checked: boolean accessChannels?: AccessChannels disabled?: boolean }) { const { t } = useTranslation('deployments') const toggleDeveloperAPI = useMutation(consoleQuery.enterprise.accessService.updateAccessChannels.mutationOptions()) return ( { toggleDeveloperAPI.mutate({ params: { appInstanceId }, body: { appInstanceId, webAppEnabled: accessChannels?.webAppEnabled ?? false, developerApiEnabled: enabled, }, }) }} /> ) } export function DeveloperApiHeaderSwitch({ appInstanceId }: { appInstanceId: string }) { const { t } = useTranslation('deployments') const { apiEnabled, accessChannels, isLoading, isError, } = useDeveloperApiSettings() if (isLoading) return return (
{apiEnabled ? t('overview.enabled') : t('overview.disabled')}
) } function ApiKeyListSection({ apiKeys, environments, action }: { apiKeys: ApiKey[] environments: Environment[] action?: ReactNode }) { const { t } = useTranslation('deployments') const hasAction = Boolean(action) return (
{t('access.api.keyList')}
{hasAction && (
{action}
)}
) } function DeveloperApiEndpoint({ appInstanceId, apiUrl }: { appInstanceId: string apiUrl: string }) { const { t } = useTranslation('deployments') const [apiDocsOpen, setApiDocsOpen] = useState(false) return (
) } export function DeveloperApiSection({ appInstanceId, }: { appInstanceId: string }) { const { t } = useTranslation('deployments') const [createdApiToken, setCreatedApiToken] = useState() const { apiEnabled, apiUrl, apiKeys, environments, isLoading, isError, } = useDeveloperApiSettings() const visibleCreatedApiToken = createdApiToken?.appInstanceId === appInstanceId ? createdApiToken.token : undefined const hasSelectableEnvironment = environments.some(environment => Boolean(environment.id)) if (isLoading) return if (isError) return {t('common.loadFailed')} if (!apiEnabled) { return ( ) } return (
{apiUrl && ( )} {hasSelectableEnvironment ? ( setCreatedApiToken({ appInstanceId, token })} > {({ trigger }) => apiKeys.length === 0 ? ( ) : ( )} ) : apiKeys.length === 0 ? ( ) : ( )} {visibleCreatedApiToken && ( setCreatedApiToken(undefined)} /> )}
) }