| | |
| | | import { useEventEmitterContextContext } from '@/context/event-emitter' |
| | | import { useStore as useAppStore } from '@/app/components/app/store' |
| | | import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants' |
| | | import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' |
| | | |
| | | type UpdateDSLModalProps = { |
| | | onCancel: () => void |
| | |
| | | const [showErrorModal, setShowErrorModal] = useState(false) |
| | | const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>() |
| | | const [importId, setImportId] = useState<string>() |
| | | const { handleCheckPluginDependencies } = usePluginDependencies() |
| | | |
| | | const readFile = (file: File) => { |
| | | const reader = new FileReader() |
| | |
| | | setFileContent('') |
| | | } |
| | | |
| | | const handleWorkflowUpdate = useCallback(async (app_id: string) => { |
| | | const handleWorkflowUpdate = async (app_id: string) => { |
| | | const { |
| | | graph, |
| | | features, |
| | |
| | | hash, |
| | | }, |
| | | } as any) |
| | | }, [eventEmitter]) |
| | | } |
| | | |
| | | const isCreatingRef = useRef(false) |
| | | const handleImport: MouseEventHandler = useCallback(async () => { |
| | |
| | | setLoading(true) |
| | | const response = await importDSL({ mode: DSLImportMode.YAML_CONTENT, yaml_content: fileContent, app_id: appDetail.id }) |
| | | const { id, status, app_id, imported_dsl_version, current_dsl_version } = response |
| | | |
| | | if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) { |
| | | if (!app_id) { |
| | | notify({ type: 'error', message: t('workflow.common.importFailure') }) |
| | |
| | | message: t(status === DSLImportStatus.COMPLETED ? 'workflow.common.importSuccess' : 'workflow.common.importWarning'), |
| | | children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('workflow.common.importWarningDetails'), |
| | | }) |
| | | await handleCheckPluginDependencies(app_id) |
| | | setLoading(false) |
| | | onCancel() |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | // eslint-disable-next-line unused-imports/no-unused-vars |
| | | catch (e) { |
| | | setLoading(false) |
| | | notify({ type: 'error', message: t('workflow.common.importFailure') }) |
| | | } |
| | | isCreatingRef.current = false |
| | | }, [currentFile, fileContent, onCancel, notify, t, appDetail, onImport, handleWorkflowUpdate, handleCheckPluginDependencies]) |
| | | }, [currentFile, fileContent, onCancel, notify, t, eventEmitter, appDetail, onImport]) |
| | | |
| | | const onUpdateDSLConfirm: MouseEventHandler = async () => { |
| | | try { |
| | |
| | | return |
| | | } |
| | | handleWorkflowUpdate(app_id) |
| | | await handleCheckPluginDependencies(app_id) |
| | | if (onImport) |
| | | onImport() |
| | | notify({ type: 'success', message: t('workflow.common.importSuccess') }) |
| | |
| | | notify({ type: 'error', message: t('workflow.common.importFailure') }) |
| | | } |
| | | } |
| | | // eslint-disable-next-line unused-imports/no-unused-vars |
| | | catch (e) { |
| | | setLoading(false) |
| | | notify({ type: 'error', message: t('workflow.common.importFailure') }) |
| | |
| | | return ( |
| | | <> |
| | | <Modal |
| | | className='w-[520px] rounded-2xl p-6' |
| | | className='p-6 w-[520px] rounded-2xl' |
| | | isShow={show} |
| | | onClose={onCancel} |
| | | > |
| | | <div className='mb-3 flex items-center justify-between'> |
| | | <div className='flex items-center justify-between mb-3'> |
| | | <div className='title-2xl-semi-bold text-text-primary'>{t('workflow.common.importDSL')}</div> |
| | | <div className='flex h-[22px] w-[22px] cursor-pointer items-center justify-center' onClick={onCancel}> |
| | | <RiCloseLine className='h-[18px] w-[18px] text-text-tertiary' /> |
| | | <div className='flex items-center justify-center w-[22px] h-[22px] cursor-pointer' onClick={onCancel}> |
| | | <RiCloseLine className='w-[18px] h-[18px] text-text-tertiary' /> |
| | | </div> |
| | | </div> |
| | | <div className='relative mb-2 flex grow gap-0.5 overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-2 shadow-xs'> |
| | | <div className='absolute left-0 top-0 h-full w-full bg-toast-warning-bg opacity-40' /> |
| | | <div className='flex items-start justify-center p-1'> |
| | | <RiAlertFill className='h-4 w-4 shrink-0 text-text-warning-secondary' /> |
| | | <div className='flex relative p-2 mb-2 gap-0.5 flex-grow rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-xs overflow-hidden'> |
| | | <div className='absolute top-0 left-0 w-full h-full opacity-40 bg-[linear-gradient(92deg,rgba(247,144,9,0.25)_0%,rgba(255,255,255,0.00)_100%)]' /> |
| | | <div className='flex p-1 justify-center items-start'> |
| | | <RiAlertFill className='w-4 h-4 flex-shrink-0 text-text-warning-secondary' /> |
| | | </div> |
| | | <div className='flex grow flex-col items-start gap-0.5 py-1'> |
| | | <div className='system-xs-medium whitespace-pre-line text-text-primary'>{t('workflow.common.importDSLTip')}</div> |
| | | <div className='flex items-start gap-1 self-stretch pb-0.5 pt-1'> |
| | | <div className='flex py-1 flex-col items-start gap-0.5 flex-grow'> |
| | | <div className='text-text-primary system-xs-medium whitespace-pre-line'>{t('workflow.common.importDSLTip')}</div> |
| | | <div className='flex pt-1 pb-0.5 items-start gap-1 self-stretch'> |
| | | <Button |
| | | size='small' |
| | | variant='secondary' |
| | | className='z-[1000]' |
| | | onClick={onBackup} |
| | | > |
| | | <RiFileDownloadLine className='h-3.5 w-3.5 text-components-button-secondary-text' /> |
| | | <div className='flex items-center justify-center gap-1 px-[3px]'> |
| | | <RiFileDownloadLine className='w-3.5 h-3.5 text-components-button-secondary-text' /> |
| | | <div className='flex px-[3px] justify-center items-center gap-1'> |
| | | {t('workflow.common.backupCurrentDraft')} |
| | | </div> |
| | | </Button> |
| | |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <div className='system-md-semibold pt-2 text-text-primary'> |
| | | <div className='pt-2 text-text-primary system-md-semibold'> |
| | | {t('workflow.common.chooseDSL')} |
| | | </div> |
| | | <div className='flex w-full flex-col items-start justify-center gap-4 self-stretch py-4'> |
| | | <div className='flex w-full py-4 flex-col justify-center items-start gap-4 self-stretch'> |
| | | <Uploader |
| | | file={currentFile} |
| | | updateFile={handleFile} |
| | |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div className='flex items-center justify-end gap-2 self-stretch pt-5'> |
| | | <div className='flex pt-5 gap-2 items-center justify-end self-stretch'> |
| | | <Button onClick={onCancel}>{t('app.newApp.Cancel')}</Button> |
| | | <Button |
| | | disabled={!currentFile || loading} |
| | |
| | | onClose={() => setShowErrorModal(false)} |
| | | className='w-[480px]' |
| | | > |
| | | <div className='flex flex-col items-start gap-2 self-stretch pb-4'> |
| | | <div className='title-2xl-semi-bold text-text-primary'>{t('app.newApp.appCreateDSLErrorTitle')}</div> |
| | | <div className='system-md-regular flex grow flex-col text-text-secondary'> |
| | | <div className='flex pb-4 flex-col items-start gap-2 self-stretch'> |
| | | <div className='text-text-primary title-2xl-semi-bold'>{t('app.newApp.appCreateDSLErrorTitle')}</div> |
| | | <div className='flex flex-grow flex-col text-text-secondary system-md-regular'> |
| | | <div>{t('app.newApp.appCreateDSLErrorPart1')}</div> |
| | | <div>{t('app.newApp.appCreateDSLErrorPart2')}</div> |
| | | <br /> |
| | |
| | | <div>{t('app.newApp.appCreateDSLErrorPart4')}<span className='system-md-medium'>{versions?.systemVersion}</span></div> |
| | | </div> |
| | | </div> |
| | | <div className='flex items-start justify-end gap-2 self-stretch pt-6'> |
| | | <div className='flex pt-6 justify-end items-start gap-2 self-stretch'> |
| | | <Button variant='secondary' onClick={() => setShowErrorModal(false)}>{t('app.newApp.Cancel')}</Button> |
| | | <Button variant='primary' destructive onClick={onUpdateDSLConfirm}>{t('app.newApp.Confirm')}</Button> |
| | | </div> |