'use client' import { cn } from '@langgenius/dify-ui/cn' import { Input } from '@langgenius/dify-ui/input' import { Textarea } from '@langgenius/dify-ui/textarea' import { useAtom, useAtomValue } from 'jotai' import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import { createReleaseDescriptionFieldAtom, createReleaseHasNameConflictAtom, createReleaseNameFieldAtom, RELEASE_NAME_REQUIRED_ERROR, } from '../state' const DESCRIPTION_MAX_LENGTH = 512 const DESCRIPTION_WARN_THRESHOLD = 460 function isValidationIssue(error: unknown): error is { message: string } { return Boolean( error && typeof error === 'object' && 'message' in error && typeof error.message === 'string', ) } function hasReleaseNameRequiredError(errors: unknown[]) { return errors.some((error) => { if (error === RELEASE_NAME_REQUIRED_ERROR) return true if (Array.isArray(error)) return error.some( (issue) => isValidationIssue(issue) && issue.message === RELEASE_NAME_REQUIRED_ERROR, ) return isValidationIssue(error) && error.message === RELEASE_NAME_REQUIRED_ERROR }) } export function ReleaseMetadataFields() { const { t } = useTranslation('deployments') const [releaseNameField, setReleaseNameField] = useAtom(createReleaseNameFieldAtom) const [releaseDescriptionField, setReleaseDescriptionField] = useAtom( createReleaseDescriptionFieldAtom, ) const hasReleaseNameConflict = useAtomValue(createReleaseHasNameConflictAtom) const releaseNameInputRef = useRef(null) const releaseNameErrors = releaseNameField.meta?.errors ?? [] const hasReleaseNameRequired = hasReleaseNameRequiredError(releaseNameErrors) const releaseNameError = hasReleaseNameRequired ? t(($) => $['versions.releaseNameRequired']) : hasReleaseNameConflict ? t(($) => $['versions.releaseNameConflict']) : '' useEffect(() => { releaseNameInputRef.current?.focus() }, []) return ( <>
$['versions.releaseNamePlaceholder'])} maxLength={128} autoComplete="off" value={releaseNameField.value} aria-invalid={Boolean(releaseNameError) || undefined} aria-describedby={releaseNameError ? 'release-name-error' : undefined} onChange={(event) => { setReleaseNameField(event.target.value) }} className="h-9" /> {releaseNameError && ( )}
{t(($) => $['versions.optional'])} = DESCRIPTION_WARN_THRESHOLD ? 'text-util-colors-warning-warning-700' : 'text-text-quaternary', )} > {releaseDescriptionField.value.length}/{DESCRIPTION_MAX_LENGTH}