'use client'
import type { EnvironmentAccessPolicy } from '@dify/contracts/enterprise/types.gen'
import { useAtomValue } from 'jotai'
import { useTranslation } from 'react-i18next'
import { SkeletonRectangle } from '@/app/components/base/skeleton'
import { deploymentRouteAppInstanceIdAtom } from '../../../route-state'
import {
DeploymentEmptyState,
DeploymentStateMessage,
} from '../../../shared/components/empty-state'
import { Section } from '../../../shared/components/section'
import {
accessSettingsAtom,
accessSettingsIsErrorAtom,
accessSettingsIsLoadingAtom,
} from '../state'
import { EnvironmentPermissionRow } from './environment-permission-row'
const ACCESS_PERMISSIONS_SKELETON_KEYS = ['production', 'staging', 'development']
function AccessPermissionsSkeleton() {
return (
{ACCESS_PERMISSIONS_SKELETON_KEYS.map((key) => (
))}
)
}
export function AccessPermissionsSection() {
const { t } = useTranslation('deployments')
const appInstanceId = useAtomValue(deploymentRouteAppInstanceIdAtom)
const accessSettings = useAtomValue(accessSettingsAtom)
const isLoading = useAtomValue(accessSettingsIsLoadingAtom)
const isError = useAtomValue(accessSettingsIsErrorAtom)
const environmentPolicies: EnvironmentAccessPolicy[] | undefined =
accessSettings?.environmentPolicies
const policyRows = environmentPolicies ?? []
return (
$['access.permissions.title'])} showDivider={false}>
{isLoading ? (
) : isError || !appInstanceId ? (
{t(($) => $['common.loadFailed'])}
) : policyRows.length === 0 ? (
$['access.runAccess.noEnvsTitle'])}
description={t(($) => $['access.runAccess.noEnvs'])}
/>
) : (
{policyRows.map((environmentPolicy) => {
const environment = environmentPolicy.environment
return (
)
})}
)}
)
}