parent
d38a2c95fb
commit
40b31bafd5
@ -0,0 +1,46 @@
|
|||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import Modal from '@/app/components/base/modal'
|
||||||
|
import Button from '@/app/components/base/button'
|
||||||
|
|
||||||
|
type DSLConfirmModalProps = {
|
||||||
|
versions?: {
|
||||||
|
importedVersion: string
|
||||||
|
systemVersion: string
|
||||||
|
}
|
||||||
|
onCancel: () => void
|
||||||
|
onConfirm: () => void
|
||||||
|
confirmDisabled?: boolean
|
||||||
|
}
|
||||||
|
const DSLConfirmModal = ({
|
||||||
|
versions = { importedVersion: '', systemVersion: '' },
|
||||||
|
onCancel,
|
||||||
|
onConfirm,
|
||||||
|
confirmDisabled = false,
|
||||||
|
}: DSLConfirmModalProps) => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
isShow
|
||||||
|
onClose={() => onCancel()}
|
||||||
|
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>{t('app.newApp.appCreateDSLErrorPart1')}</div>
|
||||||
|
<div>{t('app.newApp.appCreateDSLErrorPart2')}</div>
|
||||||
|
<br />
|
||||||
|
<div>{t('app.newApp.appCreateDSLErrorPart3')}<span className='system-md-medium'>{versions.importedVersion}</span></div>
|
||||||
|
<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'>
|
||||||
|
<Button variant='secondary' onClick={() => onCancel()}>{t('app.newApp.Cancel')}</Button>
|
||||||
|
<Button variant='primary' destructive onClick={onConfirm} disabled={confirmDisabled}>{t('app.newApp.Confirm')}</Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DSLConfirmModal
|
||||||
@ -0,0 +1,158 @@
|
|||||||
|
import {
|
||||||
|
useCallback,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from 'react'
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import { useRouter } from 'next/navigation'
|
||||||
|
import type {
|
||||||
|
DSLImportMode,
|
||||||
|
DSLImportResponse,
|
||||||
|
} from '@/models/app'
|
||||||
|
import { DSLImportStatus } from '@/models/app'
|
||||||
|
import {
|
||||||
|
importDSL,
|
||||||
|
importDSLConfirm,
|
||||||
|
} from '@/service/apps'
|
||||||
|
import type { AppIconType } from '@/types/app'
|
||||||
|
import { useToastContext } from '@/app/components/base/toast'
|
||||||
|
import { getRedirection } from '@/utils/app-redirection'
|
||||||
|
import { useSelector } from '@/context/app-context'
|
||||||
|
import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
|
||||||
|
|
||||||
|
type DSLPayload = {
|
||||||
|
mode: DSLImportMode
|
||||||
|
yaml_content?: string
|
||||||
|
yaml_url?: string
|
||||||
|
name?: string
|
||||||
|
icon_type?: AppIconType
|
||||||
|
icon?: string
|
||||||
|
icon_background?: string
|
||||||
|
description?: string
|
||||||
|
}
|
||||||
|
type ResponseCallback = {
|
||||||
|
onSuccess?: () => void
|
||||||
|
onPending?: (payload: DSLImportResponse) => void
|
||||||
|
onFailed?: () => void
|
||||||
|
}
|
||||||
|
export const useImportDSL = () => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
const { notify } = useToastContext()
|
||||||
|
const [isFetching, setIsFetching] = useState(false)
|
||||||
|
const isCurrentWorkspaceEditor = useSelector(s => s.isCurrentWorkspaceEditor)
|
||||||
|
const { push } = useRouter()
|
||||||
|
const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>()
|
||||||
|
const importIdRef = useRef<string>('')
|
||||||
|
|
||||||
|
const handleImportDSL = useCallback(async (
|
||||||
|
payload: DSLPayload,
|
||||||
|
{
|
||||||
|
onSuccess,
|
||||||
|
onPending,
|
||||||
|
onFailed,
|
||||||
|
}: ResponseCallback,
|
||||||
|
) => {
|
||||||
|
if (isFetching)
|
||||||
|
return
|
||||||
|
setIsFetching(true)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await importDSL(payload)
|
||||||
|
|
||||||
|
if (!response)
|
||||||
|
return
|
||||||
|
|
||||||
|
const {
|
||||||
|
id,
|
||||||
|
status,
|
||||||
|
app_id,
|
||||||
|
imported_dsl_version,
|
||||||
|
current_dsl_version,
|
||||||
|
} = response
|
||||||
|
|
||||||
|
if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) {
|
||||||
|
if (!app_id)
|
||||||
|
return
|
||||||
|
|
||||||
|
notify({
|
||||||
|
type: status === DSLImportStatus.COMPLETED ? 'success' : 'warning',
|
||||||
|
message: t(status === DSLImportStatus.COMPLETED ? 'app.newApp.appCreated' : 'app.newApp.caution'),
|
||||||
|
children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('app.newApp.appCreateDSLWarning'),
|
||||||
|
})
|
||||||
|
onSuccess?.()
|
||||||
|
localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
|
||||||
|
getRedirection(isCurrentWorkspaceEditor, { id: app_id }, push)
|
||||||
|
}
|
||||||
|
else if (status === DSLImportStatus.PENDING) {
|
||||||
|
setVersions({
|
||||||
|
importedVersion: imported_dsl_version ?? '',
|
||||||
|
systemVersion: current_dsl_version ?? '',
|
||||||
|
})
|
||||||
|
importIdRef.current = id
|
||||||
|
onPending?.(response)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
|
||||||
|
onFailed?.()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
|
||||||
|
onFailed?.()
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
setIsFetching(false)
|
||||||
|
}
|
||||||
|
}, [t, notify, isCurrentWorkspaceEditor, push, isFetching])
|
||||||
|
|
||||||
|
const handleImportDSLConfirm = useCallback(async (
|
||||||
|
{
|
||||||
|
onSuccess,
|
||||||
|
onFailed,
|
||||||
|
}: Pick<ResponseCallback, 'onSuccess' | 'onFailed'>,
|
||||||
|
) => {
|
||||||
|
if (isFetching)
|
||||||
|
return
|
||||||
|
setIsFetching(true)
|
||||||
|
if (!importIdRef.current)
|
||||||
|
return
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await importDSLConfirm({
|
||||||
|
import_id: importIdRef.current,
|
||||||
|
})
|
||||||
|
|
||||||
|
const { status, app_id } = response
|
||||||
|
if (!app_id)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (status === DSLImportStatus.COMPLETED) {
|
||||||
|
onSuccess?.()
|
||||||
|
notify({
|
||||||
|
type: 'success',
|
||||||
|
message: t('app.newApp.appCreated'),
|
||||||
|
})
|
||||||
|
localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
|
||||||
|
getRedirection(isCurrentWorkspaceEditor, { id: app_id! }, push)
|
||||||
|
}
|
||||||
|
else if (status === DSLImportStatus.FAILED) {
|
||||||
|
notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
|
||||||
|
onFailed?.()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
|
||||||
|
onFailed?.()
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
setIsFetching(false)
|
||||||
|
}
|
||||||
|
}, [t, notify, isCurrentWorkspaceEditor, push, isFetching])
|
||||||
|
|
||||||
|
return {
|
||||||
|
handleImportDSL,
|
||||||
|
handleImportDSLConfirm,
|
||||||
|
versions,
|
||||||
|
isFetching,
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue