From 8d805a33407e39f1f304d1aac6fe65ccb46f1fc4 Mon Sep 17 00:00:00 2001 From: zjy <3161362058@qq.com> Date: Mon, 10 Feb 2025 14:50:10 +0800 Subject: [PATCH] fix ReleaseModal fix ReleaseModal fix ReleaseModal --- .../components/modals/release-modal.tsx | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 frontend/providers/devbox/components/modals/release-modal.tsx diff --git a/frontend/providers/devbox/components/modals/release-modal.tsx b/frontend/providers/devbox/components/modals/release-modal.tsx new file mode 100644 index 00000000000..dd64221aa50 --- /dev/null +++ b/frontend/providers/devbox/components/modals/release-modal.tsx @@ -0,0 +1,171 @@ +import { + Box, + Button, + Flex, + Input, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Textarea +} from '@chakra-ui/react'; +import { useMessage } from '@sealos/ui'; +import { useTranslations } from 'next-intl'; +import { useCallback, useState } from 'react'; + +import { pauseDevbox, releaseDevbox, startDevbox } from '@/api/devbox'; +import { useConfirm } from '@/hooks/useConfirm'; +import { useEnvStore } from '@/stores/env'; +import { DevboxListItemTypeV2 } from '@/types/devbox'; +import { versionSchema } from '@/utils/vaildate'; + +const ReleaseModal = ({ + onClose, + onSuccess, + devbox +}: { + devbox: Omit; + onClose: () => void; + onSuccess: () => void; +}) => { + const t = useTranslations(); + const { message: toast } = useMessage(); + + const { env } = useEnvStore(); + + const [tag, setTag] = useState(''); + const [loading, setLoading] = useState(false); + const [tagError, setTagError] = useState(false); + const [releaseDes, setReleaseDes] = useState(''); + + const { openConfirm, ConfirmChild } = useConfirm({ + content: 'release_confirm_info', + showCheckbox: true, + checkboxLabel: 'pause_devbox_info' + }); + + const handleSubmit = () => { + const tagResult = versionSchema.safeParse(tag); + if (!tag) { + setTagError(true); + } else if (versionSchema.safeParse(tag).success === false) { + toast({ + title: t('tag_format_error'), + status: 'error' + }); + } else { + setTagError(false); + openConfirm((enableRestartMachine: boolean) => handleReleaseDevbox(enableRestartMachine))(); + } + }; + + const handleReleaseDevbox = useCallback( + async (enableRestartMachine: boolean) => { + try { + setLoading(true); + // 1.pause devbox + if (devbox.status.value === 'Running') { + await pauseDevbox({ devboxName: devbox.name }); + // wait 3s + await new Promise((resolve) => setTimeout(resolve, 3000)); + } + // 2.release devbox + await releaseDevbox({ + devboxName: devbox.name, + tag, + releaseDes, + devboxUid: devbox.id + }); + // 3.start devbox + if (enableRestartMachine) { + await startDevbox({ devboxName: devbox.name }); + } + toast({ + title: t('submit_release_successful'), + status: 'success' + }); + onSuccess(); + onClose(); + } catch (error: any) { + toast({ + title: typeof error === 'string' ? error : error.message || t('submit_release_failed'), + status: 'error' + }); + console.error(error); + } + setLoading(false); + }, + [devbox.status.value, devbox.name, devbox.id, tag, releaseDes, toast, t, onSuccess, onClose] + ); + + return ( + + + + + + + {t('release_version')} + + + + + + + {t('image_name')} + + + + + + {t('version_config')} + + + {t('version_number')} + setTag(e.target.value)} + mb={'8px'} + borderColor={tagError ? 'red.500' : undefined} + /> + {tagError && ( + + {t('tag_required')} + + )} + {t('version_description')} +