'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" >
{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')}
) }