'use client'
import type { ReleaseSourceMode } from '../state/types'
import { SegmentedControl, SegmentedControlItem } from '@langgenius/dify-ui/segmented-control'
import { useAtomValue, useSetAtom } from 'jotai'
import { useTranslation } from 'react-i18next'
import Uploader from '@/app/components/app/create-from-dsl-modal/uploader'
import {
clearCreateReleaseSubmissionErrorAtom,
createReleaseDslStateAtom,
resetCreateReleaseDslFileAtom,
selectCreateReleaseDslFileAtom,
useCreateReleaseFormApi,
} from '../state'
import { SourceAppPicker } from './source-app-picker'
function selectedReleaseSourceMode(value: readonly ReleaseSourceMode[] | undefined) {
return value?.[0]
}
export function ReleaseSourceSection() {
const { t } = useTranslation('deployments')
const form = useCreateReleaseFormApi()
const resetDslFile = useSetAtom(resetCreateReleaseDslFileAtom)
const clearSubmissionError = useSetAtom(clearCreateReleaseSubmissionErrorAtom)
return (
{modeField => (
aria-labelledby="release-source-mode-label"
value={[modeField.state.value]}
onValueChange={(value) => {
const nextMode = selectedReleaseSourceMode(value)
if (!nextMode || nextMode === modeField.state.value)
return
clearSubmissionError()
modeField.handleChange(nextMode)
if (nextMode === 'sourceApp') {
form.setFieldValue('dslFile', undefined)
resetDslFile()
}
else {
form.setFieldValue('sourceApp', undefined)
}
}}
className="shrink-0"
>
{t('versions.sourceAppOption')}
{t('versions.manualDslOption')}
{modeField.state.value === 'sourceApp'
?
: }
)}
)
}
function SourceAppField() {
const { t } = useTranslation('deployments')
const form = useCreateReleaseFormApi()
const clearSubmissionError = useSetAtom(clearCreateReleaseSubmissionErrorAtom)
return (
{field => (
{
field.handleChange(app)
clearSubmissionError()
}}
ariaLabel={t('versions.sourceAppOption')}
/>
)}
)
}
function DslFileField() {
const { t } = useTranslation('deployments')
const form = useCreateReleaseFormApi()
const dslState = useAtomValue(createReleaseDslStateAtom)
const clearSubmissionError = useSetAtom(clearCreateReleaseSubmissionErrorAtom)
const selectDslFile = useSetAtom(selectCreateReleaseDslFileAtom)
return (
{field => (
{
field.handleChange(file)
clearSubmissionError()
void selectDslFile(file)
}}
className="mt-0"
/>
{dslState.isReadingDsl && (
{t('versions.dslReading')}
)}
{dslState.dslReadError && (
{t('versions.dslReadFailed')}
)}
)}
)
}
function DslUnsupportedModeError() {
const { t } = useTranslation('deployments')
const dslState = useAtomValue(createReleaseDslStateAtom)
const hasUnsupportedDslMode = dslState.hasDslContent
&& !dslState.isReadingDsl
&& !dslState.dslReadError
&& !dslState.isWorkflowDslContent
if (!hasUnsupportedDslMode)
return null
return (
{t('versions.dslUnsupportedMode')}
)
}