'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 ( ) })}
)}
) }