'use client'
import { Button } from '@langgenius/dify-ui/button'
import { Input } from '@langgenius/dify-ui/input'
import { useAtomValue, useSetAtom } from 'jotai'
import { useTranslation } from 'react-i18next'
import {
effectiveMethodAtom,
instanceDescriptionAtom,
instanceNameAtom,
releaseDescriptionAtom,
releaseNameAtom,
selectedAppAtom,
stepAtom,
} from '@/features/deployments/create-guide/state/primitives'
import {
continueFromReleaseAtom,
hasInstanceNameConflictAtom,
releaseCanGoNextAtom,
setInstanceDescriptionAtom,
setInstanceNameAtom,
setReleaseDescriptionAtom,
setReleaseNameAtom,
} from '@/features/deployments/create-guide/state/release'
import { dslDefaultAppNameAtom } from '@/features/deployments/create-guide/state/source'
import { StepShell } from './layout'
const releaseTextareaClassName =
'min-h-16 w-full resize-none appearance-none rounded-md border border-transparent bg-components-input-bg-normal p-2 px-3 system-sm-regular text-components-input-text-filled caret-primary-600 outline-hidden placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'
export function ReleaseStepContent() {
const { t } = useTranslation('deployments')
return (
$['createGuide.release.title'])}
description={t(($) => $['createGuide.release.description'])}
hideHeader
>
)
}
function DeploymentInfoSection() {
const { t } = useTranslation('deployments')
return (
{t(($) => $['createGuide.release.deployInfo'])}
)
}
function InitialReleaseSection() {
const { t } = useTranslation('deployments')
return (
{t(($) => $['createGuide.release.firstVersion'])}
)
}
function InstanceNameField() {
const { t } = useTranslation('deployments')
const instanceName = useAtomValue(instanceNameAtom)
const setInstanceName = useSetAtom(setInstanceNameAtom)
const method = useAtomValue(effectiveMethodAtom)
const selectedApp = useAtomValue(selectedAppAtom)
const dslDefaultAppName = useAtomValue(dslDefaultAppNameAtom)
const instanceNamePlaceholder =
method === 'importDsl'
? dslDefaultAppName || t(($) => $['createGuide.dsl.defaultAppName'])
: selectedApp?.name
const hasInstanceNameConflict = useAtomValue(hasInstanceNameConflictAtom)
const instanceNameError = hasInstanceNameConflict
? t(($) => $['createGuide.release.instanceNameConflict'])
: undefined
const instanceNameErrorId = 'create-guide-instance-name-error'
return (
setInstanceName(event.target.value)}
placeholder={instanceNamePlaceholder}
required
aria-invalid={instanceNameError ? true : undefined}
aria-describedby={instanceNameError ? instanceNameErrorId : undefined}
className="h-9"
/>
{instanceNameError && (
{instanceNameError}
)}
)
}
function InstanceDescriptionField() {
const { t } = useTranslation('deployments')
const instanceDescription = useAtomValue(instanceDescriptionAtom)
const setInstanceDescription = useSetAtom(setInstanceDescriptionAtom)
return (
{t(($) => $['createGuide.release.instanceDescription'])}
)
}
function ReleaseNameField() {
const { t } = useTranslation('deployments')
const releaseName = useAtomValue(releaseNameAtom)
const setReleaseName = useSetAtom(setReleaseNameAtom)
return (
setReleaseName(event.target.value)}
placeholder={t(($) => $['createGuide.release.defaultName'])}
required
className="h-9"
/>
)
}
function ReleaseDescriptionField() {
const { t } = useTranslation('deployments')
const releaseDescription = useAtomValue(releaseDescriptionAtom)
const setReleaseDescription = useSetAtom(setReleaseDescriptionAtom)
return (
{t(($) => $['createGuide.release.releaseDescription'])}
)
}
function OptionalFieldLabel({ children, htmlFor }: { children: string; htmlFor: string }) {
const { t } = useTranslation('deployments')
return (
{t(($) => $['versions.optional'])}
)
}
export function ReleaseActionButtons() {
const { t } = useTranslation('deployments')
const canGoNext = useAtomValue(releaseCanGoNextAtom)
const setStep = useSetAtom(stepAtom)
const continueFromRelease = useSetAtom(continueFromReleaseAtom)
return (
<>
>
)
}