From 628eed33654aeb5f6a194abf7e5b7c2f56634a52 Mon Sep 17 00:00:00 2001 From: cuisongliu Date: Thu, 23 Jul 2026 14:10:42 +0800 Subject: [PATCH] =?UTF-8?q?chore(cloudserver):=20remove=20cloudserver=20re?= =?UTF-8?q?ferences=20from=20DeleteAccountModal=20and=20pnpm=E2=80=A6=20(#?= =?UTF-8?q?7080)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: remove cloudserver references from DeleteAccountModal and pnpm-lock.yaml Signed-off-by: cuisongliu --- .../AccountCenter/DeleteAccountModal.tsx | 111 +- frontend/pnpm-lock.yaml | 181 ---- frontend/providers/cloudserver/.env.template | 3 - frontend/providers/cloudserver/.eslintrc.json | 6 - frontend/providers/cloudserver/.gitignore | 40 - .../providers/cloudserver/.prettierignore | 4 - frontend/providers/cloudserver/.prettierrc.js | 21 - frontend/providers/cloudserver/README.md | 1 - .../providers/cloudserver/deploy/Kubefile | 9 - .../charts/cloudserver-frontend/Chart.yaml | 6 - .../cloudserver-frontend-values.yaml | 16 - .../templates/_helpers.tpl | 84 -- .../cloudserver-frontend/templates/app.yaml | 19 - .../templates/configmap.yaml | 10 - .../templates/deployment.yaml | 63 -- .../templates/ingress.yaml | 43 - .../templates/service.yaml | 16 - .../charts/cloudserver-frontend/values.yaml | 52 - .../deploy/cloudserver-frontend-entrypoint.sh | 89 -- frontend/providers/cloudserver/i18nrc.json | 8 - .../cloudserver/next-i18next.config.js | 12 - frontend/providers/cloudserver/next.config.js | 30 - frontend/providers/cloudserver/package.json | 73 -- .../providers/cloudserver/public/favicon.ico | Bin 94922 -> 0 bytes .../cloudserver/public/icons/download.svg | 3 - .../public/icons/sealos-avator.svg | 28 - .../cloudserver/public/icons/sealos.svg | 1 - .../cloudserver/public/icons/token.svg | 10 - .../cloudserver/public/icons/wechat.svg | 4 - .../cloudserver/public/locales/en/common.json | 128 --- .../cloudserver/public/locales/zh/common.json | 128 --- .../providers/cloudserver/public/logo.svg | 24 - .../cloudserver/src/api/cloudserver.ts | 35 - .../providers/cloudserver/src/api/platform.ts | 33 - .../src/components/AppStatusTag/index.tsx | 39 - .../src/components/ButtonGroup/index.tsx | 40 - .../src/components/CurrencySymbol/index.tsx | 22 - .../src/components/FileSelect/index.tsx | 255 ----- .../src/components/FormControl/index.tsx | 29 - .../src/components/Icon/icons/analyze.svg | 1 - .../src/components/Icon/icons/arrowLeft.svg | 1 - .../src/components/Icon/icons/change.svg | 1 - .../src/components/Icon/icons/check.svg | 3 - .../src/components/Icon/icons/close.svg | 3 - .../src/components/Icon/icons/connection.svg | 1 - .../src/components/Icon/icons/continue.svg | 1 - .../src/components/Icon/icons/copy.svg | 1 - .../src/components/Icon/icons/delete.svg | 3 - .../src/components/Icon/icons/detail.svg | 3 - .../src/components/Icon/icons/download.svg | 1 - .../src/components/Icon/icons/formInfo.svg | 1 - .../src/components/Icon/icons/help.svg | 3 - .../src/components/Icon/icons/info.svg | 1 - .../src/components/Icon/icons/infoWarn.svg | 3 - .../src/components/Icon/icons/link.svg | 4 - .../src/components/Icon/icons/log.svg | 1 - .../src/components/Icon/icons/logo.svg | 3 - .../src/components/Icon/icons/more.svg | 1 - .../src/components/Icon/icons/noEvents.svg | 1 - .../src/components/Icon/icons/pause.svg | 4 - .../src/components/Icon/icons/plus.svg | 3 - .../src/components/Icon/icons/podList.svg | 1 - .../src/components/Icon/icons/read.svg | 1 - .../src/components/Icon/icons/restart.svg | 3 - .../src/components/Icon/icons/restore.svg | 1 - .../src/components/Icon/icons/settings.svg | 1 - .../src/components/Icon/icons/start.svg | 3 - .../components/Icon/icons/statusDetail.svg | 1 - .../src/components/Icon/icons/terminal.svg | 1 - .../src/components/Icon/icons/unread.svg | 1 - .../src/components/Icon/icons/warning.svg | 1 - .../cloudserver/src/components/Icon/index.tsx | 51 - .../src/components/MyTable/index.tsx | 95 -- .../src/components/MyTooltip/index.tsx | 25 - .../src/components/Pagination/index.tsx | 132 --- .../src/components/RangeDate/index.tsx | 70 -- .../components/RangeDate/style.module.scss | 0 .../src/components/SelectDateRange/index.tsx | 289 ------ .../cloudserver/src/components/Tip/index.tsx | 66 -- .../cloudserver/src/constants/theme.ts | 16 - .../providers/cloudserver/src/constants/vm.ts | 405 -------- .../cloudserver/src/hooks/useConfirm.tsx | 80 -- .../cloudserver/src/hooks/useCopyData.ts | 36 - .../cloudserver/src/hooks/useLoading.tsx | 34 - .../cloudserver/src/hooks/useScreen.ts | 25 - .../cloudserver/src/hooks/useSelectFile.tsx | 44 - .../cloudserver/src/hooks/useStore.ts | 17 - .../cloudserver/src/hooks/useToast.ts | 13 - .../providers/cloudserver/src/pages/404.tsx | 13 - .../providers/cloudserver/src/pages/_app.tsx | 143 --- .../cloudserver/src/pages/_document.tsx | 21 - .../src/pages/api/cloudserver/create.ts | 56 -- .../src/pages/api/cloudserver/getRegion.ts | 30 - .../src/pages/api/cloudserver/list.ts | 33 - .../src/pages/api/cloudserver/listImage.ts | 26 - .../src/pages/api/cloudserver/listType.ts | 37 - .../src/pages/api/cloudserver/price.ts | 51 - .../src/pages/api/cloudserver/updateStatus.ts | 60 -- .../src/pages/api/platform/getEnv.ts | 15 - .../create/components/ErrorModal.tsx | 41 - .../cloudserver/create/components/Form.tsx | 950 ------------------ .../cloudserver/create/components/Header.tsx | 226 ----- .../src/pages/cloudserver/create/index.tsx | 162 --- .../cloudservers/components/DelModal.tsx | 103 -- .../pages/cloudservers/components/List.tsx | 284 ------ .../src/pages/cloudservers/index.tsx | 117 --- .../cloudserver/src/services/backend/auth.ts | 26 - .../src/services/backend/kubernetes.ts | 276 ----- .../src/services/backend/response.ts | 36 - .../cloudserver/src/services/db/mongodb.ts | 24 - .../cloudserver/src/services/error.ts | 19 - .../cloudserver/src/services/kubernet.ts | 50 - .../cloudserver/src/services/request.ts | 95 -- .../cloudserver/src/services/requestLaf.ts | 80 -- .../providers/cloudserver/src/store/env.ts | 32 - .../providers/cloudserver/src/store/global.ts | 37 - .../cloudserver/src/store/session.ts | 29 - .../cloudserver/src/styles/reset.scss | 151 --- .../providers/cloudserver/src/types/adapt.ts | 15 - .../cloudserver/src/types/cloudserver.ts | 160 --- .../providers/cloudserver/src/types/index.ts | 5 - .../providers/cloudserver/src/types/region.ts | 26 - .../providers/cloudserver/src/types/user.ts | 9 - .../cloudserver/src/utils/cookieUtils.ts | 15 - .../providers/cloudserver/src/utils/crypto.ts | 7 - .../providers/cloudserver/src/utils/i18n.ts | 11 - .../providers/cloudserver/src/utils/tools.ts | 14 - .../providers/cloudserver/src/utils/user.ts | 16 - frontend/providers/cloudserver/tsconfig.json | 11 - 129 files changed, 53 insertions(+), 6591 deletions(-) delete mode 100644 frontend/providers/cloudserver/.env.template delete mode 100644 frontend/providers/cloudserver/.eslintrc.json delete mode 100644 frontend/providers/cloudserver/.gitignore delete mode 100644 frontend/providers/cloudserver/.prettierignore delete mode 100644 frontend/providers/cloudserver/.prettierrc.js delete mode 100644 frontend/providers/cloudserver/README.md delete mode 100644 frontend/providers/cloudserver/deploy/Kubefile delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/Chart.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/cloudserver-frontend-values.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/_helpers.tpl delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/app.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/configmap.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/deployment.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/ingress.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/service.yaml delete mode 100644 frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/values.yaml delete mode 100755 frontend/providers/cloudserver/deploy/cloudserver-frontend-entrypoint.sh delete mode 100644 frontend/providers/cloudserver/i18nrc.json delete mode 100644 frontend/providers/cloudserver/next-i18next.config.js delete mode 100644 frontend/providers/cloudserver/next.config.js delete mode 100644 frontend/providers/cloudserver/package.json delete mode 100644 frontend/providers/cloudserver/public/favicon.ico delete mode 100644 frontend/providers/cloudserver/public/icons/download.svg delete mode 100644 frontend/providers/cloudserver/public/icons/sealos-avator.svg delete mode 100644 frontend/providers/cloudserver/public/icons/sealos.svg delete mode 100644 frontend/providers/cloudserver/public/icons/token.svg delete mode 100644 frontend/providers/cloudserver/public/icons/wechat.svg delete mode 100644 frontend/providers/cloudserver/public/locales/en/common.json delete mode 100644 frontend/providers/cloudserver/public/locales/zh/common.json delete mode 100644 frontend/providers/cloudserver/public/logo.svg delete mode 100644 frontend/providers/cloudserver/src/api/cloudserver.ts delete mode 100644 frontend/providers/cloudserver/src/api/platform.ts delete mode 100644 frontend/providers/cloudserver/src/components/AppStatusTag/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/ButtonGroup/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/CurrencySymbol/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/FileSelect/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/FormControl/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/analyze.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/arrowLeft.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/change.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/check.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/close.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/connection.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/continue.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/copy.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/delete.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/detail.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/download.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/formInfo.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/help.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/info.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/infoWarn.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/link.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/log.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/logo.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/more.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/noEvents.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/pause.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/plus.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/podList.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/read.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/restart.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/restore.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/settings.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/start.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/statusDetail.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/terminal.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/unread.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/icons/warning.svg delete mode 100644 frontend/providers/cloudserver/src/components/Icon/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/MyTable/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/MyTooltip/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/Pagination/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/RangeDate/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/RangeDate/style.module.scss delete mode 100644 frontend/providers/cloudserver/src/components/SelectDateRange/index.tsx delete mode 100644 frontend/providers/cloudserver/src/components/Tip/index.tsx delete mode 100644 frontend/providers/cloudserver/src/constants/theme.ts delete mode 100644 frontend/providers/cloudserver/src/constants/vm.ts delete mode 100644 frontend/providers/cloudserver/src/hooks/useConfirm.tsx delete mode 100644 frontend/providers/cloudserver/src/hooks/useCopyData.ts delete mode 100644 frontend/providers/cloudserver/src/hooks/useLoading.tsx delete mode 100644 frontend/providers/cloudserver/src/hooks/useScreen.ts delete mode 100644 frontend/providers/cloudserver/src/hooks/useSelectFile.tsx delete mode 100644 frontend/providers/cloudserver/src/hooks/useStore.ts delete mode 100644 frontend/providers/cloudserver/src/hooks/useToast.ts delete mode 100644 frontend/providers/cloudserver/src/pages/404.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/_app.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/_document.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/create.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/getRegion.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/list.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/listImage.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/listType.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/price.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/cloudserver/updateStatus.ts delete mode 100644 frontend/providers/cloudserver/src/pages/api/platform/getEnv.ts delete mode 100644 frontend/providers/cloudserver/src/pages/cloudserver/create/components/ErrorModal.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudserver/create/components/Form.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudserver/create/components/Header.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudserver/create/index.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudservers/components/DelModal.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudservers/components/List.tsx delete mode 100644 frontend/providers/cloudserver/src/pages/cloudservers/index.tsx delete mode 100644 frontend/providers/cloudserver/src/services/backend/auth.ts delete mode 100644 frontend/providers/cloudserver/src/services/backend/kubernetes.ts delete mode 100644 frontend/providers/cloudserver/src/services/backend/response.ts delete mode 100644 frontend/providers/cloudserver/src/services/db/mongodb.ts delete mode 100644 frontend/providers/cloudserver/src/services/error.ts delete mode 100644 frontend/providers/cloudserver/src/services/kubernet.ts delete mode 100644 frontend/providers/cloudserver/src/services/request.ts delete mode 100644 frontend/providers/cloudserver/src/services/requestLaf.ts delete mode 100644 frontend/providers/cloudserver/src/store/env.ts delete mode 100644 frontend/providers/cloudserver/src/store/global.ts delete mode 100644 frontend/providers/cloudserver/src/store/session.ts delete mode 100644 frontend/providers/cloudserver/src/styles/reset.scss delete mode 100644 frontend/providers/cloudserver/src/types/adapt.ts delete mode 100644 frontend/providers/cloudserver/src/types/cloudserver.ts delete mode 100644 frontend/providers/cloudserver/src/types/index.ts delete mode 100644 frontend/providers/cloudserver/src/types/region.ts delete mode 100644 frontend/providers/cloudserver/src/types/user.ts delete mode 100644 frontend/providers/cloudserver/src/utils/cookieUtils.ts delete mode 100644 frontend/providers/cloudserver/src/utils/crypto.ts delete mode 100644 frontend/providers/cloudserver/src/utils/i18n.ts delete mode 100644 frontend/providers/cloudserver/src/utils/tools.ts delete mode 100644 frontend/providers/cloudserver/src/utils/user.ts delete mode 100644 frontend/providers/cloudserver/tsconfig.json diff --git a/frontend/desktop/src/components/account/AccountCenter/DeleteAccountModal.tsx b/frontend/desktop/src/components/account/AccountCenter/DeleteAccountModal.tsx index 9ebd6e6d2..b6f217ecd 100644 --- a/frontend/desktop/src/components/account/AccountCenter/DeleteAccountModal.tsx +++ b/frontend/desktop/src/components/account/AccountCenter/DeleteAccountModal.tsx @@ -1,68 +1,64 @@ import { - checkRemainResource, - deleteUserRequest, - forceDeleteUser, - getAmount, - getDeleteUserStatus, - getWorkspacesPlans + checkRemainResource, + deleteUserRequest, + forceDeleteUser, + getAmount, + getDeleteUserStatus, + getWorkspacesPlans } from '@/api/auth'; -import { nsListRequest } from '@/api/namespace'; -import { RegionResourceType, ResourceType } from '@/services/backend/svc/checkResource'; +import {nsListRequest} from '@/api/namespace'; +import {RegionResourceType, ResourceType} from '@/services/backend/svc/checkResource'; import useAppStore from '@/stores/app'; import useSessionStore from '@/stores/session'; -import { ApiResp, ValueOf } from '@/types'; -import { RESOURCE_STATUS } from '@/types/response/checkResource'; +import {ApiResp, ValueOf} from '@/types'; +import {RESOURCE_STATUS} from '@/types/response/checkResource'; import { - DELETE_USER_EXECUTION_STATUS, - DeleteUserFailure, - DeleteUserFinalStatusResponse, - DeleteUserInitiateResponse + DELETE_USER_EXECUTION_STATUS, + DeleteUserFailure, + DeleteUserFinalStatusResponse, + DeleteUserInitiateResponse } from '@/types/response/deleteUser'; -import { getPlanBackgroundClass } from '@/utils/styling'; +import {getPlanBackgroundClass} from '@/utils/styling'; import { - Alert, - AlertDescription, - AlertIcon, - AlertTitle, - Button, - ButtonProps, - Center, - Divider, - FormControl, - HStack, - IconButton, - Modal, - ModalBody, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalOverlay, - Spinner, - Table, - TableContainer, - Tbody, - Td, - Text, - Th, - Thead, - Tr, - useDisclosure, - VStack + Alert, + AlertDescription, + AlertIcon, + AlertTitle, + Button, + ButtonProps, + Center, + Divider, + FormControl, + HStack, + IconButton, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalHeader, + ModalOverlay, + Spinner, + Table, + TableContainer, + Tbody, + Td, + Text, + Th, + Thead, + Tr, + useDisclosure, + VStack } from '@chakra-ui/react'; -import { Badge } from '@sealos/shadcn-ui/badge'; -import { cn } from '@sealos/shadcn-ui'; -import { InfoCircleIcon, LinkIcon, WarnTriangeIcon } from '@sealos/ui'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { - buildSubscribedWorkspaceRows, - DeleteFlowStep, - getDeleteFlowStepFromStatus -} from './DeleteAccountModal.utils'; -import { SettingInput } from './SettingInput'; -import { SettingInputGroup } from './SettingInputGroup'; +import {Badge} from '@sealos/shadcn-ui/badge'; +import {cn} from '@sealos/shadcn-ui'; +import {InfoCircleIcon, LinkIcon, WarnTriangeIcon} from '@sealos/ui'; +import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; +import {useTranslation} from 'next-i18next'; +import {useRouter} from 'next/router'; +import {useCallback, useEffect, useMemo, useState} from 'react'; +import {buildSubscribedWorkspaceRows, DeleteFlowStep, getDeleteFlowStepFromStatus} from './DeleteAccountModal.utils'; +import {SettingInput} from './SettingInput'; +import {SettingInputGroup} from './SettingInputGroup'; type DeleteExecutionState = { deleteId: string; @@ -78,7 +74,6 @@ const appKeyList = [ 'system-cronjob', '', 'system-objectstorage', - 'system-cloudserver', 'system-template' ] as const; diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index f90708b5d..a0247900c 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -977,187 +977,6 @@ importers: specifier: ^4.9.1 version: 4.10.1 - providers/cloudserver: - dependencies: - '@chakra-ui/anatomy': - specifier: ^2.2.1 - version: 2.2.2 - '@chakra-ui/icons': - specifier: ^2.1.1 - version: 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/next-js': - specifier: ^2.1.5 - version: 2.2.0(@chakra-ui/react@2.8.2)(@emotion/react@11.11.1)(next@13.1.6)(react@18.3.1) - '@chakra-ui/react': - specifier: ^2.8.1 - version: 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.3.27)(framer-motion@10.16.5)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/system': - specifier: ^2.6.1 - version: 2.6.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.3.1) - '@emotion/react': - specifier: ^11.11.1 - version: 11.11.1(@types/react@18.3.27)(react@18.3.1) - '@emotion/styled': - specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.3.27)(react@18.3.1) - '@kubernetes/client-node': - specifier: ^0.18.1 - version: 0.18.1 - '@next/font': - specifier: 13.1.6 - version: 13.1.6 - '@sealos/ui': - specifier: workspace:^ - version: link:../../packages/ui - '@tanstack/react-query': - specifier: ^4.35.3 - version: 4.36.1(react-dom@18.3.1)(react@18.3.1) - '@types/multer': - specifier: ^1.4.10 - version: 1.4.11 - ansi_up: - specifier: ^5.2.1 - version: 5.2.1 - axios: - specifier: ^1.5.1 - version: 1.6.2 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - decimal.js: - specifier: ^10.4.3 - version: 10.4.3 - echarts: - specifier: ^5.4.3 - version: 5.4.3 - framer-motion: - specifier: ^10.16.4 - version: 10.16.5(react-dom@18.3.1)(react@18.3.1) - i18next: - specifier: ^23.11.5 - version: 23.12.1 - immer: - specifier: ^9.0.21 - version: 9.0.21 - js-cookie: - specifier: ^3.0.5 - version: 3.0.5 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jszip: - specifier: ^3.10.1 - version: 3.10.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - minio: - specifier: ^7.1.3 - version: 7.1.3 - mongodb: - specifier: ^5.9.0 - version: 5.9.1 - multer: - specifier: 1.4.5-lts.1 - version: 1.4.5-lts.1 - nanoid: - specifier: ^4.0.2 - version: 4.0.2 - next: - specifier: 13.1.6 - version: 13.1.6(@babel/core@7.23.5)(react-dom@18.3.1)(react@18.3.1)(sass@1.69.5) - next-i18next: - specifier: ^15.3.0 - version: 15.3.0(i18next@23.12.1)(next@13.1.6)(react-i18next@14.1.2)(react@18.3.1) - nprogress: - specifier: ^0.2.0 - version: 0.2.0 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - react: - specifier: 18.3.1 - version: 18.3.1 - react-day-picker: - specifier: ^8.8.2 - version: 8.9.1(date-fns@2.30.0)(react@18.3.1) - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) - react-hook-form: - specifier: ^7.46.2 - version: 7.48.2(react@18.3.1) - react-i18next: - specifier: ^14.1.2 - version: 14.1.2(i18next@23.12.1)(react-dom@18.3.1)(react@18.3.1) - react-markdown: - specifier: ^8.0.7 - version: 8.0.7(@types/react@18.3.27)(react@18.3.1) - react-syntax-highlighter: - specifier: ^15.5.0 - version: 15.5.0(react@18.3.1) - sass: - specifier: ^1.68.0 - version: 1.69.5 - sealos-desktop-sdk: - specifier: workspace:* - version: link:../../packages/client-sdk - typescript: - specifier: ^5.2.2 - version: 5.2.2 - zustand: - specifier: ^4.4.1 - version: 4.4.7(@types/react@18.3.27)(immer@9.0.21)(react@18.3.1) - devDependencies: - '@svgr/webpack': - specifier: ^6.5.1 - version: 6.5.1 - '@types/js-cookie': - specifier: ^3.0.4 - version: 3.0.6 - '@types/js-yaml': - specifier: ^4.0.6 - version: 4.0.9 - '@types/jsonwebtoken': - specifier: ^9.0.3 - version: 9.0.5 - '@types/lodash': - specifier: ^4.14.199 - version: 4.14.202 - '@types/node': - specifier: 18.13.0 - version: 18.13.0 - '@types/nprogress': - specifier: ^0.2.1 - version: 0.2.3 - '@types/react': - specifier: 18.3.27 - version: 18.3.27 - '@types/react-dom': - specifier: 18.3.7 - version: 18.3.7(@types/react@18.3.27) - '@types/react-syntax-highlighter': - specifier: ^15.5.7 - version: 15.5.10 - eslint: - specifier: 8.33.0 - version: 8.33.0 - eslint-config-next: - specifier: 13.1.6 - version: 13.1.6(eslint@8.33.0)(typescript@5.2.2) - svg-inline-loader: - specifier: ^0.8.2 - version: 0.8.2 - webpack-bundle-analyzer: - specifier: ^4.9.1 - version: 4.10.1 - providers/costcenter: dependencies: '@alicloud/dysmsapi20170525': diff --git a/frontend/providers/cloudserver/.env.template b/frontend/providers/cloudserver/.env.template deleted file mode 100644 index 8fa703ba7..000000000 --- a/frontend/providers/cloudserver/.env.template +++ /dev/null @@ -1,3 +0,0 @@ -NEXT_PUBLIC_MOCK_USER= -LAF_BASE_URL= -JWT_SECRET_APP= \ No newline at end of file diff --git a/frontend/providers/cloudserver/.eslintrc.json b/frontend/providers/cloudserver/.eslintrc.json deleted file mode 100644 index 578210f47..000000000 --- a/frontend/providers/cloudserver/.eslintrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "next/core-web-vitals", - "rules": { - "react-hooks/rules-of-hooks": 0 - } -} diff --git a/frontend/providers/cloudserver/.gitignore b/frontend/providers/cloudserver/.gitignore deleted file mode 100644 index 1153eb97a..000000000 --- a/frontend/providers/cloudserver/.gitignore +++ /dev/null @@ -1,40 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts -/public/trainData/ -platform.json -.yalc/ -yalc.lock diff --git a/frontend/providers/cloudserver/.prettierignore b/frontend/providers/cloudserver/.prettierignore deleted file mode 100644 index 7aef7f6b0..000000000 --- a/frontend/providers/cloudserver/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -.vscode -**/.DS_Store -node_modules diff --git a/frontend/providers/cloudserver/.prettierrc.js b/frontend/providers/cloudserver/.prettierrc.js deleted file mode 100644 index cb1553cbe..000000000 --- a/frontend/providers/cloudserver/.prettierrc.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - printWidth: 100, - tabWidth: 2, - useTabs: false, - semi: true, - singleQuote: true, - quoteProps: 'as-needed', - jsxSingleQuote: false, - trailingComma: 'none', - bracketSpacing: true, - jsxBracketSameLine: false, - arrowParens: 'always', - rangeStart: 0, - rangeEnd: Infinity, - requirePragma: false, - insertPragma: false, - proseWrap: 'preserve', - htmlWhitespaceSensitivity: 'css', - endOfLine: 'lf' -}; - \ No newline at end of file diff --git a/frontend/providers/cloudserver/README.md b/frontend/providers/cloudserver/README.md deleted file mode 100644 index c40d99f59..000000000 --- a/frontend/providers/cloudserver/README.md +++ /dev/null @@ -1 +0,0 @@ -# Sealos Cloud Server diff --git a/frontend/providers/cloudserver/deploy/Kubefile b/frontend/providers/cloudserver/deploy/Kubefile deleted file mode 100644 index 5c9ede7b0..000000000 --- a/frontend/providers/cloudserver/deploy/Kubefile +++ /dev/null @@ -1,9 +0,0 @@ -FROM scratch - -USER 65532:65532 - -COPY registry registry -COPY charts charts -COPY cloudserver-frontend-entrypoint.sh cloudserver-frontend-entrypoint.sh - -CMD ["bash cloudserver-frontend-entrypoint.sh"] diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/Chart.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/Chart.yaml deleted file mode 100644 index 658a6cab9..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: cloudserver-frontend -description: Sealos cloudserver Frontend Helm Chart -type: application -version: 1.0.0 -appVersion: "latest" diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/cloudserver-frontend-values.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/cloudserver-frontend-values.yaml deleted file mode 100644 index 0961af480..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/cloudserver-frontend-values.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Custom values for cloudserver-frontend helm chart. -# This file contains user-customizable configurations. - -replicaCount: 1 - -resources: - limits: - cpu: 1000m - memory: 1024Mi - requests: - cpu: 10m - memory: 128Mi - -cloudserverConfig: - lafBaseUrl: "" - jwtSecretApp: "" diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/_helpers.tpl b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/_helpers.tpl deleted file mode 100644 index 750050caf..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/_helpers.tpl +++ /dev/null @@ -1,84 +0,0 @@ -{{/* Expand the name of the chart. */}} -{{- define "cloudserver-frontend.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* Create a default fully qualified app name. */}} -{{- define "cloudserver-frontend.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{- define "cloudserver-frontend.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{- define "cloudserver-frontend.labels" -}} -helm.sh/chart: {{ include "cloudserver-frontend.chart" . }} -{{ include "cloudserver-frontend.selectorLabels" . }} -{{ include "cloudserver-frontend.recommendedLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{- define "cloudserver-frontend.selectorLabels" -}} -app: {{ include "cloudserver-frontend.fullname" . }} -{{- end }} - -{{- define "cloudserver-frontend.recommendedLabels" -}} -app.kubernetes.io/name: {{ include "cloudserver-frontend.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{- define "cloudserver-frontend.scheme" -}} -{{- if eq (toString .Values.cloudserverConfig.disableHttps) "true" -}}http{{- else -}}https{{- end -}} -{{- end }} - -{{- define "cloudserver-frontend.port" -}} -{{- $scheme := include "cloudserver-frontend.scheme" . -}} -{{- $port := toString .Values.cloudserverConfig.cloudPort -}} -{{- if eq $scheme "http" -}} -{{- $port = toString .Values.cloudserverConfig.httpPort -}} -{{- end -}} -{{- if or (and (eq $scheme "https") (or (eq $port "") (eq $port "443"))) (and (eq $scheme "http") (or (eq $port "") (eq $port "80"))) -}} -{{- "" -}} -{{- else -}} -{{- $port -}} -{{- end }} -{{- end }} - -{{- define "cloudserver-frontend.portSuffix" -}} -{{- $port := include "cloudserver-frontend.port" . -}} -{{- if $port -}}:{{ $port }}{{- end -}} -{{- end }} - -{{- define "cloudserver-frontend.portEnv" -}} -{{- $port := include "cloudserver-frontend.port" . -}} -{{- if $port -}}:{{ $port }}{{- end -}} -{{- end }} - -{{- define "cloudserver-frontend.cloudOrigin" -}} -{{- include "cloudserver-frontend.scheme" . -}}://{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} -{{- end }} - -{{- define "cloudserver-frontend.wildcardCloudOrigin" -}} -{{- include "cloudserver-frontend.scheme" . -}}://*.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} -{{- end }} - -{{- define "cloudserver-frontend.host" -}} -{{- default (printf "cloudserver.%s" .Values.cloudserverConfig.cloudDomain) .Values.ingress.host -}} -{{- end }} - -{{- define "cloudserver-frontend.appUrl" -}} -{{- include "cloudserver-frontend.scheme" . -}}://{{ include "cloudserver-frontend.host" . }}{{ include "cloudserver-frontend.portSuffix" . }} -{{- end }} diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/app.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/app.yaml deleted file mode 100644 index 2cc086b20..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/app.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: app.sealos.io/v1 -kind: App -metadata: - name: cloudserver - namespace: app-system -spec: - data: - desc: cloudserver - url: {{ include "cloudserver-frontend.appUrl" . | quote }} - icon: {{ printf "%s/logo.svg" (include "cloudserver-frontend.appUrl" .) | quote }} - i18n: - zh: - name: 云主机 - zh-Hans: - name: 云主机 - menuData: - name: cloudserver - type: iframe - displayType: normal diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/configmap.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/configmap.yaml deleted file mode 100644 index 79b33e7ab..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "cloudserver-frontend.fullname" . }}-config - namespace: {{ .Release.Namespace }} - labels: - {{- include "cloudserver-frontend.labels" . | nindent 4 }} -data: - config.yaml: |- - addr: :3000 diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/deployment.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/deployment.yaml deleted file mode 100644 index 8804cdb86..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/deployment.yaml +++ /dev/null @@ -1,63 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "cloudserver-frontend.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "cloudserver-frontend.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "cloudserver-frontend.selectorLabels" . | nindent 6 }} - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 25% - maxSurge: 25% - template: - metadata: - labels: - {{- include "cloudserver-frontend.labels" . | nindent 8 }} - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image | quote }} - imagePullPolicy: {{ .Values.imagePullPolicy }} - {{- if .Values.securityContext }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - env: - - name: LAF_BASE_URL - value: {{ .Values.cloudserverConfig.lafBaseUrl | quote }} - - name: JWT_SECRET_APP - value: {{ .Values.cloudserverConfig.jwtSecretApp | quote }} - ports: - - name: http - containerPort: {{ .Values.service.port }} - protocol: TCP - volumeMounts: - - name: cloudserver-frontend-volume - mountPath: /config.yaml - subPath: config.yaml - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: cloudserver-frontend-volume - configMap: - name: {{ include "cloudserver-frontend.fullname" . }}-config diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/ingress.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/ingress.yaml deleted file mode 100644 index 033902756..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/ingress.yaml +++ /dev/null @@ -1,43 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "cloudserver-frontend.fullname" . }} - namespace: {{ .Release.Namespace }} - annotations: - kubernetes.io/ingress.class: {{ .Values.ingress.className | quote }} - nginx.ingress.kubernetes.io/enable-cors: "true" - nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, DELETE, PATCH, OPTIONS" - nginx.ingress.kubernetes.io/cors-allow-origin: "{{ include "cloudserver-frontend.cloudOrigin" . }}, {{ include "cloudserver-frontend.wildcardCloudOrigin" . }}" - nginx.ingress.kubernetes.io/cors-allow-credentials: "true" - nginx.ingress.kubernetes.io/cors-max-age: "600" - nginx.ingress.kubernetes.io/backend-protocol: "HTTP" - nginx.ingress.kubernetes.io/configuration-snippet: | - more_clear_headers "X-Frame-Options:"; - more_set_headers "Content-Security-Policy: default-src * blob: data: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }}; img-src * data: blob: resource: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }}; connect-src * wss: blob: resource:; style-src 'self' 'unsafe-inline' blob: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} resource:; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} resource: *.baidu.com *.bdstatic.com https://js.stripe.com; frame-src 'self' *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} mailto: tel: weixin: mtt: *.baidu.com https://js.stripe.com; frame-ancestors 'self' {{ include "cloudserver-frontend.cloudOrigin" . }} {{ include "cloudserver-frontend.wildcardCloudOrigin" . }}"; - more_set_headers "X-Xss-Protection: 1; mode=block"; - higress.io/response-header-control-remove: X-Frame-Options - higress.io/response-header-control-update: | - Content-Security-Policy "default-src * blob: data: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }}; img-src * data: blob: resource: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }}; connect-src * wss: blob: resource:; style-src 'self' 'unsafe-inline' blob: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} resource:; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} resource: *.baidu.com *.bdstatic.com https://js.stripe.com; frame-src 'self' *.{{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} {{ .Values.cloudserverConfig.cloudDomain }}{{ include "cloudserver-frontend.portSuffix" . }} mailto: tel: weixin: mtt: *.baidu.com https://js.stripe.com; frame-ancestors 'self' {{ include "cloudserver-frontend.cloudOrigin" . }} {{ include "cloudserver-frontend.wildcardCloudOrigin" . }}" - X-Xss-Protection "1; mode=block" - {{- with .Values.ingress.annotations }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - ingressClassName: {{ .Values.ingress.className | quote }} - rules: - - host: {{ include "cloudserver-frontend.host" . | quote }} - http: - paths: - - pathType: Prefix - path: / - backend: - service: - name: {{ include "cloudserver-frontend.fullname" . }} - port: - number: {{ .Values.service.port }} - {{- if not (eq (toString .Values.cloudserverConfig.disableHttps) "true") }} - tls: - - hosts: - - {{ include "cloudserver-frontend.host" . | quote }} - secretName: {{ .Values.cloudserverConfig.certSecretName | quote }} - {{- end }} diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/service.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/service.yaml deleted file mode 100644 index b38e8bff8..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/templates/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - {{- include "cloudserver-frontend.labels" . | nindent 4 }} - name: {{ include "cloudserver-frontend.fullname" . }} - namespace: {{ .Release.Namespace }} -spec: - type: {{ .Values.service.type }} - ports: - - name: http - port: {{ .Values.service.port }} - protocol: TCP - targetPort: {{ .Values.service.port }} - selector: - {{- include "cloudserver-frontend.selectorLabels" . | nindent 4 }} diff --git a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/values.yaml b/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/values.yaml deleted file mode 100644 index 679fd4283..000000000 --- a/frontend/providers/cloudserver/deploy/charts/cloudserver-frontend/values.yaml +++ /dev/null @@ -1,52 +0,0 @@ -# Default values for cloudserver-frontend helm chart. - -image: ghcr.io/labring/sealos-cloudserver-frontend:latest -imagePullPolicy: Always - -imagePullSecrets: [] -fullnameOverride: "cloudserver-frontend" - -replicaCount: 1 - -podAnnotations: {} -podLabels: {} - -podSecurityContext: - runAsNonRoot: true - runAsUser: 1001 - -securityContext: - runAsNonRoot: true - runAsUser: 1001 - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - -service: - type: ClusterIP - port: 3000 - -ingress: - className: nginx - host: "" - annotations: {} - -cloudserverConfig: - cloudDomain: "127.0.0.1.nip.io" - cloudPort: "" - httpPort: "" - disableHttps: false - certSecretName: "wildcard-cert" - lafBaseUrl: "" - jwtSecretApp: "" - -resources: - limits: - cpu: 1000m - memory: 1024Mi - requests: - cpu: 10m - memory: 128Mi - -affinity: {} diff --git a/frontend/providers/cloudserver/deploy/cloudserver-frontend-entrypoint.sh b/frontend/providers/cloudserver/deploy/cloudserver-frontend-entrypoint.sh deleted file mode 100755 index f4f820e69..000000000 --- a/frontend/providers/cloudserver/deploy/cloudserver-frontend-entrypoint.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -set -e - -RELEASE_NAME=${RELEASE_NAME:-"cloudserver-frontend"} -RELEASE_NAMESPACE=${RELEASE_NAMESPACE:-"cloudserver-frontend"} -CHART_PATH=${CHART_PATH:-"./charts/cloudserver-frontend"} -HELM_OPTS=${HELM_OPTS:-""} -HELM_OPTIONS=${HELM_OPTIONS:-""} -AUTO_CONFIG_HELM_OPTS="" - -get_cm_value() { - local namespace="$1" - local name="$2" - local key="$3" - kubectl get configmap "${name}" -n "${namespace}" -o "jsonpath={.data.${key}}" 2>/dev/null || true -} - -add_set_string() { - local key="$1" - local value="$2" - if [ -n "${value}" ]; then - AUTO_CONFIG_HELM_OPTS="${AUTO_CONFIG_HELM_OPTS} --set-string ${key}=${value}" - fi -} - -SEALOS_CLOUD_DOMAIN=${SEALOS_CLOUD_DOMAIN:-"${cloudDomain:-$(get_cm_value sealos-system sealos-config cloudDomain)}"} -add_set_string cloudserverConfig.cloudDomain "${SEALOS_CLOUD_DOMAIN}" -SEALOS_CLOUD_PORT=${SEALOS_CLOUD_PORT:-"${cloudPort:-$(get_cm_value sealos-system sealos-config cloudPort)}"} -add_set_string cloudserverConfig.cloudPort "${SEALOS_CLOUD_PORT}" -SEALOS_HTTP_PORT=${SEALOS_HTTP_PORT:-"${httpPort:-$(get_cm_value sealos-system sealos-config httpPort)}"} -add_set_string cloudserverConfig.httpPort "${SEALOS_HTTP_PORT}" -SEALOS_DISABLE_HTTPS=${SEALOS_DISABLE_HTTPS:-"${disableHttps:-$(get_cm_value sealos-system sealos-config disableHttps)}"} -add_set_string cloudserverConfig.disableHttps "${SEALOS_DISABLE_HTTPS}" -SEALOS_CERT_SECRET_NAME=${SEALOS_CERT_SECRET_NAME:-"${certSecretName:-$(get_cm_value sealos-system sealos-config certSecretName)}"} -add_set_string cloudserverConfig.certSecretName "${SEALOS_CERT_SECRET_NAME}" -SEALOS_JWT_INTERNAL=${SEALOS_JWT_INTERNAL:-"${jwtInternal:-$(get_cm_value sealos-system sealos-config jwtInternal)}"} -add_set_string cloudserverConfig.jwtSecretApp "${SEALOS_JWT_INTERNAL}" -add_set_string cloudserverConfig.lafBaseUrl "${lafBaseUrl:-}" - -adopt_namespaced_resource() { - local namespace="$1" - local kind="$2" - local name="$3" - if kubectl -n "${namespace}" get "${kind}" "${name}" >/dev/null 2>&1; then - echo "Adopting ${kind} ${namespace}/${name}..." - kubectl -n "${namespace}" label "${kind}" "${name}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true - kubectl -n "${namespace}" annotate "${kind}" "${name}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true - fi -} - -adopt_cluster_resource() { - local kind="$1" - local name="$2" - if kubectl get "${kind}" "${name}" >/dev/null 2>&1; then - echo "Adopting ${kind} ${name}..." - kubectl label "${kind}" "${name}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true - kubectl annotate "${kind}" "${name}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true - fi -} - -echo "Checking and adopting existing resources..." -if kubectl get namespace "${RELEASE_NAMESPACE}" >/dev/null 2>&1; then - kubectl label namespace "${RELEASE_NAMESPACE}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true - kubectl annotate namespace "${RELEASE_NAMESPACE}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true - - adopt_namespaced_resource "${RELEASE_NAMESPACE}" configmap cloudserver-frontend-config - adopt_namespaced_resource "${RELEASE_NAMESPACE}" service cloudserver-frontend - adopt_namespaced_resource "${RELEASE_NAMESPACE}" deployment cloudserver-frontend - adopt_namespaced_resource "${RELEASE_NAMESPACE}" ingress cloudserver-frontend -fi - -adopt_namespaced_resource app-system apps.app.sealos.io cloudserver - - -SERVICE_NAME="cloudserver-frontend" -USER_VALUES_PATH="/root/.sealos/cloud/values/core/${SERVICE_NAME}-values.yaml" - -if [ ! -f "${USER_VALUES_PATH}" ]; then - mkdir -p "$(dirname "${USER_VALUES_PATH}")" - cp "./charts/cloudserver-frontend/cloudserver-frontend-values.yaml" "${USER_VALUES_PATH}" -fi - -HELM_ARGS="${AUTO_CONFIG_HELM_OPTS} ${HELM_OPTIONS} ${HELM_OPTS}" - -echo "Deploying Helm chart..." -helm upgrade -i "${RELEASE_NAME}" -n "${RELEASE_NAMESPACE}" --create-namespace "${CHART_PATH}" \ - -f "./charts/cloudserver-frontend/values.yaml" \ - -f "${USER_VALUES_PATH}" \ - ${HELM_ARGS} diff --git a/frontend/providers/cloudserver/i18nrc.json b/frontend/providers/cloudserver/i18nrc.json deleted file mode 100644 index c39846f7f..000000000 --- a/frontend/providers/cloudserver/i18nrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "entry": "./public/locales/zh", - "entryLocale": "zh", - "output": "./public/locales", - "outputLocales": [ - "en" - ] -} \ No newline at end of file diff --git a/frontend/providers/cloudserver/next-i18next.config.js b/frontend/providers/cloudserver/next-i18next.config.js deleted file mode 100644 index 8dca5135f..000000000 --- a/frontend/providers/cloudserver/next-i18next.config.js +++ /dev/null @@ -1,12 +0,0 @@ -//next-i18next.config.js -/** - * @type {import('next-i18next').UserConfig} - */ - -module.exports = { - i18n: { - defaultLocale: 'zh', - locales: ['en', 'zh'], - localeDetection: false - } -}; diff --git a/frontend/providers/cloudserver/next.config.js b/frontend/providers/cloudserver/next.config.js deleted file mode 100644 index 4f9309e07..000000000 --- a/frontend/providers/cloudserver/next.config.js +++ /dev/null @@ -1,30 +0,0 @@ -/** @type {import('next').NextConfig} */ -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -const { i18n } = require('./next-i18next.config'); -const analyzer = process.env === 'production' ? [new BundleAnalyzerPlugin()] : []; -const path = require('path'); - -const nextConfig = { - i18n, - output: 'standalone', - reactStrictMode: false, - compress: true, - webpack: (config, { isServer }) => { - config.module.rules = config.module.rules.concat([ - { - test: /\.svg$/i, - issuer: /\.[jt]sx?$/, - use: ['@svgr/webpack'] - } - ]); - config.plugins = [...config.plugins, ...analyzer]; - return config; - }, - transpilePackages: ['@sealos/ui', 'sealos-desktop-sdk', '@sealos/driver'], - experimental: { - // this includes files from the monorepo base two directories up - outputFileTracingRoot: path.join(__dirname, '../../') - } -}; - -module.exports = nextConfig; diff --git a/frontend/providers/cloudserver/package.json b/frontend/providers/cloudserver/package.json deleted file mode 100644 index 6d57e86e5..000000000 --- a/frontend/providers/cloudserver/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "cloudserver", - "private": true, - "version": "0.1.0", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start" - }, - "dependencies": { - "@chakra-ui/anatomy": "^2.2.1", - "@chakra-ui/icons": "^2.1.1", - "@chakra-ui/next-js": "^2.1.5", - "@chakra-ui/react": "^2.8.1", - "@chakra-ui/system": "^2.6.1", - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", - "@kubernetes/client-node": "^0.18.1", - "@next/font": "13.1.6", - "@sealos/ui": "workspace:^", - "@tanstack/react-query": "^4.35.3", - "@types/multer": "^1.4.10", - "ansi_up": "^5.2.1", - "axios": "^1.5.1", - "date-fns": "^2.30.0", - "dayjs": "^1.11.10", - "decimal.js": "^10.4.3", - "echarts": "^5.4.3", - "framer-motion": "^10.16.4", - "i18next": "^23.11.5", - "immer": "^9.0.21", - "js-cookie": "^3.0.5", - "js-yaml": "^4.1.0", - "jsonwebtoken": "^9.0.2", - "jszip": "^3.10.1", - "lodash": "^4.17.21", - "minio": "^7.1.3", - "mongodb": "^5.9.0", - "multer": "1.4.5-lts.1", - "nanoid": "^4.0.2", - "next": "13.1.6", - "next-i18next": "^15.3.0", - "nprogress": "^0.2.0", - "prettier": "^2.8.8", - "react": "18.3.1", - "react-day-picker": "^8.8.2", - "react-dom": "18.3.1", - "react-hook-form": "^7.46.2", - "react-i18next": "^14.1.2", - "react-markdown": "^8.0.7", - "react-syntax-highlighter": "^15.5.0", - "sass": "^1.68.0", - "sealos-desktop-sdk": "workspace:*", - "typescript": "^5.2.2", - "zustand": "^4.4.1" - }, - "devDependencies": { - "@svgr/webpack": "^6.5.1", - "@types/js-cookie": "^3.0.4", - "@types/js-yaml": "^4.0.6", - "@types/jsonwebtoken": "^9.0.3", - "@types/lodash": "^4.14.199", - "@types/node": "18.13.0", - "@types/nprogress": "^0.2.1", - "@types/react": "18.3.27", - "@types/react-dom": "18.3.7", - "@types/react-syntax-highlighter": "^15.5.7", - "eslint": "8.33.0", - "eslint-config-next": "13.1.6", - "svg-inline-loader": "^0.8.2", - "webpack-bundle-analyzer": "^4.9.1" - } -} diff --git a/frontend/providers/cloudserver/public/favicon.ico b/frontend/providers/cloudserver/public/favicon.ico deleted file mode 100644 index 5888f6cfef82d9e77883fee2308aaa487684594d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94922 zcmeI5Yiu0Xb;p-gB1(LSqWGpLJ|&9cl7t$^bz|3{;lyYY#AyOFACme*T_8r2G=&`$ zbzKCd3Z(UeZ}I(Hi4-Y^PU|2J+N57%BTgK&PF$JX=j@71mH1Ixijg=%T2Y*yduQ&< z+~vHMJF~l-Ju;4G_U`OF{`2Fxcg~!9ug_Ni|4q*L;Q!6O?|ikuSMBrpI>08uK2#u; z!>Vukkpf>^kB=JpjQ>ypQ~(t~1yBK002M$5Pyti`6+i`00aO4LKm||%Q~(t~1yBK0 z02M$5Pyti`6+i`00aO4LKm||%Q~(t~1yBK002M$5Pyti`6+i`00aO4LKm~GBf#5k` z$$J06C)S@Sd?7e+=oM;%u%vbvmc|wuEO{j~WM-xCy~ajiowG9dthI9Ztg-X3&RGR~ z<}C`JsZGFgqKaC0qVn6J@ruXEwdJPj-af01{)11g_ZMz&^cRX7{f8tQfF-rVu#{~O zmV-r{1qX}8;E>iz;InMQupBPsZRCg;J6|pWQyM!4>tJKdD#Y-Z zY~!#TuS~Kk_*``>I8pPYx9?(ZU0txh@HvSm!j#OF!W3c4n5!T##xq6u(lTYu70(o5 zOUo3jb4(Gw7*EoYXG({w3E)b$&_vaOHp1Z9f&_>OONn#h40DRDH%hcfosS z@!FF`chYA+n{9OR9BBCLw~v^L09WzJ$~(MwM|0zfC|9|{6nO@;cv1dqoT0{qq;A{Oi5fdqQ7zpFO{qOVk$CK3-us!Z=W14p~`z@Ak)TUCI0=AGV zccFs4@8(K<@8@Nv&|kTWmcmuiyJXKXMe0D=Pq8JouiRsca^)6NMr|thW9fW*N{6Y) zR2{b4-NOp%!K2N)+EX5gr7P_z1EwO=bz)+szR^W#^M2RB)osR>S7PZ3S4njr@l%8; zu-kcm<6Ra2mbZTMoNcx zI|83mu(4x98x|IZ?^UaY^(32s&xTe5-&tF9s_wDaT-}-MsEJ2K1yBK002M$5Pyti` z6+i`00aRdrC=i<{J{ue<{g>eI5doeBuQ3aclwG4X3QKC`ur#w{*Wfu%V->J2+c+$D zSrwFNtr|XqK|eoc5m;Ajy7pRxvwHZfZ_$~0Av)dg&#~F&v-{&Nc;_rhUpg4G<9i!q z90hLNgdodoxMd`BP->~0c=D3A^53kX& zIXui1;VL@QAjW1-{3LVA=I@c#hsyp=kEyKXrAz&hxjtD|v2-a%LF1>0&(ioQ##D5+ zK_nKLZFoF??|5deJTy}JZgSn1HKr{3I;eFZ_a0fT_gEch!j#0;iFY!iZhjsG#u_`Q z=d1YsGwzNXluBO*jw>mTisVx9TqU)ssIQX!6!TZn*%P8T;1(&$-XKdm?B)o=i9pUG>I&n_;6&t@o{0k z`LXCi;}?X5mQO`znmdAP{)2kkd$DY7&39m9p!g3V$7KZiI=rsty0EeHq?{LE>ruVy ze{H1VPAymIGNt4v(AORf}qiu)f%m5CW}z(V6zj{mc?M_t0=r-TL66X<+Gp z2~P@B7JVH;!$(a0RlYG5ooh7oR}xoNOtk`6ioGu^whaX58;8u zcw$RCdFf_cQ%I#g=joane{+mR#wLL+nJ|XCvR!vOQ%pmYy7=lH&v2fY1&if zeoAGEa3!(zv#S?R_vB)|80tUtF<|Of=`uy)Q`TI;m}Z0}W*HpcEah0bUVO@^jh;Hd75*j z;mJ)umAP2DVcjQj)g(qCj$oTBz4nwfQ;e;fiKTYk*kPu5BXLb&>emueJXd=ikHa=s zdVY!<|oU=TxahA9&FG~y~c zRdHOc`@nDMai!^(#rMfdGwwOHdyE%N-%)!pDxLQ;H1)7NRQ}Z%eQ#0w9kEVjB59@pIY}xZ7P{3>Zd4E!qRCG>}OY&dWwyX?R5Ei zf6=*Qrc9sxlH#5UTl!2v{GjZYubSkAM25@$Bs@myLvJ$0d==yG|+Od!jv5MRNndRr9B1hbke5ccq0C4`3$iiIDP)w z{e_+>Jmn-)HuBOpNKUEt9B|#|6E2-R5?gEwfkAvh>#OAVebPHWP1~Hlr-9E(e2RPS zBhP*&OcAbjHUk~aZfOrpeVK8UuAj2Oloa%sFCzh~z>y|_(m zvH33GX~UE$qxvsxraHy=rOt#Kx2icAgJ(ZG@BETt>2HQ6DwjhO6<-gJ zRedEqUinCPGTCaN%*^WG`y`uz&xY0j-!(iE)7l(-R;&@$Q?VA<9&Ax#3oT!X&9{6V z;^@o3(OVKrEH_=-Mz;}5H}O-pnObICb&A3zf2Y%21&2!S<+;+&Ay#6a#<6q~PgisD zXbzQiZbA}MF!y#PZ%)KL9qN;%%}ZC_{b}N!HC%`%9a0*oaSm{sOUk7s~ls>MqdZJ zV_Vzm<8GAiVw6Md1wTcY0uxsK4?4{i#18IP#!7b}mQLT*C^-px%uPV1lHv(_j(e(Y z^yIovW{PsP+;yMRT+wk92v5iq3eQZR+ z88^;PkeMR63Tk``V(PSgPGbtBUA5vTJTZHTap3eaICSJ6IIg_Tl+m-FoxToMF)Ejt zvK{xNEHSpE=RV36&lF+noYOq9{e_20dKIo5X38sZPpRIshP|JWD>yeSt)4BLVFrfzRN+m(^|5P_*RQ$OYAcpMt0@coRGKWw{=Zp0LQ_S0pGaP^!U{z-42;i2+w z;Odr?mynd3fJ~|5da^M-O~&JJv9E(YKV{C;_SMy{jE;*%`nvDRcgc08Ear8{*Y`6z zbszCl;?>pe^Ll>8%`(zY26FNKTN&TQh$*g5vPIufqxKZOpW$=Tt^3c&zDg&Diaqxk z`6;PQMY#I;X5j2mHyJY8H?*_v0!5AFV5?cmLd1Ndq(>yAd{Z!iV1pQdL#FNxczmSXl zoPevxS*}aQ#(2TL4))>+R!pt*jOHR!%r}DH`dn!I*sn739vNfl=`*#`{Ts*w{WEs| za(NjVtvUt$M_;CGb=sy%>XT&@Prz6@A5Tc9PZouNaH z{gem$I%s3*P~ZLH>gBG#&cyh8R$MssJ^9;!y79iyMAZWLt2d~RB7REoRWUpM^?ymY-1)ovxvooxFTLMJr)xgSb4BLb)>^$f_qN`=Mouu5`?2($ z$kOQ+J^ipuUjgzr23%c}*wXSu)-9OIpS}(+>#K*QW(q{7Y6nuDeb@Pd{&UAq*=nad@qWh9z7GDIZuLFZzZ>2v1*X0$akWRLJlfYGamhdK ztvj9Bs|nB6_U^eon|-q9jc^*^L+={@%uwWqwx6zS)_l)by* zog)KR_e5sucOo;#MPkyN+hj?`3epY0;}_Fn$}8_@ zR{URcNK)JlD6l?PT?2mVmy)m2`lvh_-wfjEZj5uC?|{Xo>mR0Eadn@DD~qucxEx|- zEUGl#&lrtE>`q?#w&21TjQP$KyMAa>E$OzYQei4f?`Lf15bKN^lvwHPV;bPnc?GU4 z)f59)VXptE$C-ln$uEj)pFQBbnz%=;0>W&gKQ?>fhWgwG&wy;cZMKxhc;V{4T=!Et zV<$lT^XlfBzgBzwxbB_;FptPx&>!o4vp!k2-p?52QR&T-Wz?Q>^!*Gs4&yslmwQgT zry}lIPl4EM<0rvS-Qs+ecgCXnjj-DN5xwiiGWQh_<{KXbu5MDcyu;KDh^gP>zIu2B zGX;dX=HG`p?_E;wrB(OIvGgpD8}y6BrS5LC>&5Rfr$A(`r3aYWl-lVKlQL?f8?~ph z|9%GE`*r<9xYW~-Io0q;b`&6UX$$ks&+bpA{7cu?K62R3b>cSJQ9zh)`ciD6`6d`Y zZeA+6dG7Xg0NOEF~}Myt6((wlp9590>ykbIZ; zQcrcN*M{3?UxDaC)5l?s+b}^>+-t5YKrvqAq7XRsW8p&kb%D#Hg7Np|@m-SgUEWSCcf1r|J~NkC>imn%)%K2Dzg|4Q z>?%O|=fxJ=TjLix?uah8-y6Hw{;~Ll)Az&z{Du4>0 z0;m8gfC``jr~oQ}3ZMe004jhApaQ4>Du4>00;m8gfC``jr~oQ}3ZMe004jhApaQ4> zDu4>00;m8gfC^+!0dd#AZQrgU5zEAEYp^3RQb2Exd_T5jZnR~;mCO1_p}gIDa#^oM z*_OOrlV&?Fm)X@tZ#zAm_3no#X?lQ2%I*hUXa95QZ%dCCy>r$p)4N{1vfXU#98k&# zsr1^m)G}X_Ty{=VRw$M2_%vnkWAfYIYRi0mwCp{ute2K;ab-=k>_x7ujFz3_$_i5I{!WJK+0fW1&kMRuX^P&#*3y* zamZwQvK`U5Pv(d0w@EJRmCML^va%+*jQoa`mC0o<%4K9JITmv1K3^H^kCbWuWwUHc zdm^yTu0va#ZW+6`Y@fZ-{a_#Il9aLg$iC<^C}a1QZ70HZdSz5_wvo)0%m6E;OhQL2 z?Y}~@Ki#q|?PflSd;a32zZw2Qq`xix1Vwrb?qtA?k>hf708O+^`{O>jOd}Uzj&7%x zQRbvF<;NCfid@v8O25@BQ_dQ^3p=iE**RG*`Zpo%Pmxty_M*I9lV*Qga#^oM8I!+H zvmKM46v?{4g8q~K6y{qi7)iDrtY3Qg&^cBF+BPQryl+ G)BguFj8A9) diff --git a/frontend/providers/cloudserver/public/icons/download.svg b/frontend/providers/cloudserver/public/icons/download.svg deleted file mode 100644 index 8aed8eea5..000000000 --- a/frontend/providers/cloudserver/public/icons/download.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/providers/cloudserver/public/icons/sealos-avator.svg b/frontend/providers/cloudserver/public/icons/sealos-avator.svg deleted file mode 100644 index 59d5ec5b8..000000000 --- a/frontend/providers/cloudserver/public/icons/sealos-avator.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/providers/cloudserver/public/icons/sealos.svg b/frontend/providers/cloudserver/public/icons/sealos.svg deleted file mode 100644 index 70e732656..000000000 --- a/frontend/providers/cloudserver/public/icons/sealos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/public/icons/token.svg b/frontend/providers/cloudserver/public/icons/token.svg deleted file mode 100644 index b0dd76f35..000000000 --- a/frontend/providers/cloudserver/public/icons/token.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/providers/cloudserver/public/icons/wechat.svg b/frontend/providers/cloudserver/public/icons/wechat.svg deleted file mode 100644 index b713640cb..000000000 --- a/frontend/providers/cloudserver/public/icons/wechat.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/providers/cloudserver/public/locales/en/common.json b/frontend/providers/cloudserver/public/locales/en/common.json deleted file mode 100644 index cfa1455d1..000000000 --- a/frontend/providers/cloudserver/public/locales/en/common.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "Add Data Disk": "Add Data Disk", - "Amount": "Amount", - "Are you sure to create a cloud host?": "Are you sure you want to create a cloud host?", - "Assign Public IP": "Assign Public IP", - "Auto Generate Password": "Auto Generate Password", - "Automatic Generated": "Automatic Generated", - "BandWidth": "Bandwidth", - "Bandwidth by hour": "Bandwidth by hour", - "Basic Config": "Basic Config", - "Billing items": "Billing items", - "Billing rules": "Billing rules", - "CPU": "CPU", - "Cancel": "Cancel", - "Changing": "Changing", - "Cloud host list": "Cloud Host List", - "Configuration fee details": "Configuration fee details", - "Confirm": "Confirm", - "Copy Failed": "Copy Failed", - "Create Time": "Create Time", - "Created": "Created", - "Creating": "Creating", - "Creation Time": "Creation Time", - "DataDisk": "Data Disk", - "Delete": "Delete", - "Deleted": "Deleted", - "Deleting": "Deleting", - "Deletion warning": "Deletion Warning", - "Describe": "Describe", - "Details": "Details", - "Disk Size": "Disk Size", - "Empty List": "Empty List", - "Fee inquiry in progress": "Fee inquiry in progress...", - "GPU": "GPU", - "IP Address": "IP Address", - "Image": "Image", - "Instance": "Instance", - "Login Method": "Login Method", - "Counts": "counts", - "Memory": "Memory", - "Name": "Name", - "New Server": "New Server", - "Operate": "Operate", - "Operating System": "Operating System", - "Operation": "Operation", - "Password copied to clipboard": "Password copied to clipboard", - "Please enter": "Please enter", - "Please enter your password": "Please enter your password", - "Please select a mirror": "Please select a mirror", - "Prompt": "Prompt", - "Public IP": "Public IP", - "Public network bandwidth": "Public network bandwidth", - "Quantity tips": "Quantity is {{amount1}} to {{amount2}}", - "ReStart": "Restart", - "Reference fee": "Reference fee", - "Reference fee disk tips": "{{price}}/GiB", - "Reference fee tip": "{{price}}", - "Reference fee bandwidth tips": "{{price}}/Mbps", - "Restarting": "Restarting", - "Set Password": "Set Password", - "Start": "Start", - "Started": "Started", - "Starting": "Starting", - "Status": "Status", - "Stop": "Stop", - "Stopped": "Stopped", - "Stopping": "Stopping", - "Storage": "Storage", - "Submit": "Submit", - "Submit Error": "Submit Error", - "Supports changing the operating system": "Note: After purchase, you can change the operating system according to your business needs", - "SystemDisk": "System Disk", - "The maximum number of instances is 100": "Maximum number of instances is 100", - "The maximum number of instances is 20": "The maximum number is 20", - "The maximum number of instances is 500": "Maximum number of instances is 500", - "The minimum number of instances is 1": "Minimum number of instances is 1", - "The minimum number of instances is 20": "Minimum number of instances is 20", - "The number of instances cannot be empty": "Number of instances cannot be empty", - "The purpose of the disk": "Disk Purpose", - "Type": "Type", - "capacity": "Capacity", - "close cloud server tip": "Please note that storage will still be charged when the server is shut down. Please confirm!", - "delete cloud server tip": "Are you sure to delete this cloud host?", - "hour": "hour", - "price": "Price", - "publicIpAssigned tips": "Please note: If an independent public IP address is not assigned, the external IP address cannot be used to communicate with each other.", - "ssh port": "SSH port", - "sshName": "SSH Username", - "sshPassword": "SSH Password", - "storage fees": "Storage fees", - "success": "Success", - "terminal": "Terminal", - "Billing model": "Billing model", - "Availability Zone": "Availability Zone", - "Architecture": "Architecture", - "Instance Family": "Instance Family", - "postPaidByHour": "Pay as you go", - "heterogeneous": "Heterogeneous (GPU)", - "prePaid": "Yearly and monthly subscription", - "x86_64": "x86_64", - "costEffective": "Cost Effective", - "gpu": "GPU", - "Password does not meet requirements": "Password does not meet requirements", - "Lowercase letters az": "Lowercase letters a ~ z", - "Capital letters az": "Capital letters A ~ Z", - "Numbers 09": "Numbers 0 ~ 9", - "Contains at least three of these": "Contains at least three of these", - "Cannot start with": "Cannot start with \"/\"", - "cannot contain spaces": "cannot contain spaces", - "Within 8 to 30 characters": "Within 8 to 30 characters (12 or more characters recommended)", - "highMemory": "High Memory", - "highPerformance": "High Performance", - "Public IP is not enabled": "Public IP is not enabled", - "interval": "Interval", - "sold out": "Sold Out", - "month": "month", - "indivual": "indivual", - "year": "year", - "duration": "duration", - "total": "total", - "After the annual and monthly cloud hosting is sold": "After the annual and monthly cloud hosting is sold", - "No refund allowed": "No refund allowed,", - "Pay Confirm tips": "Clicking \"Confirm\" indicates that you have understood and agreed to this clause. If you do not agree to the clause \"No refunds are allowed after the annual or monthly cloud hosting is sold\", please click the \"Cancel\" button. If you do not agree, this purchase will be canceled and you will not be charged any fees.", - "file.upload error description": "Failed to upload the file.", - "Upload File": "Upload File", - "file.Select a maximum of 10 files": "You can select no more than 10 files.", - "The maximum number of instances is 12": "The maximum number of instances is 12" -} diff --git a/frontend/providers/cloudserver/public/locales/zh/common.json b/frontend/providers/cloudserver/public/locales/zh/common.json deleted file mode 100644 index 067939843..000000000 --- a/frontend/providers/cloudserver/public/locales/zh/common.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "Cloud host list": "云主机列表", - "New Server": "新建主机", - "Empty List": "空列表", - "Basic Config": "基础配置", - "Submit Error": "提交错误", - "CPU": "CPU", - "Operating System": "操作系统", - "Name": "名称", - "Automatic Generated": "自动生成", - "Submit": "提交", - "Type": "机型", - "Disk Size": "磁盘大小", - "Login Method": "登录方式", - "Counts": "数量", - "Set Password": "设置密码", - "Auto Generate Password": "自动生成密码", - "Assign Public IP": "分配公网IP", - "Bandwidth by hour": "(按小时带宽)", - "BandWidth": "带宽", - "Storage": "存储", - "Creation Time": "创建时间", - "Add Data Disk": "新增数据盘", - "Public IP": "公网IP", - "Amount": "数量", - "Describe": "描述", - "Operate": "操作", - "Image": "镜像", - "Please select a mirror": "请选择镜像", - "Supports changing the operating system": "注意:购买后支持更换操作系统,您可根据业务需要变更系统", - "Please enter your password": "请输入登录密码", - "Memory": "内存", - "GPU": "GPU", - "SystemDisk": "系统盘", - "DataDisk": "数据盘", - "The purpose of the disk": "用途", - "capacity": "容量", - "The minimum number of instances is 20": "最小为20", - "The maximum number of instances is 500": "最大数量为500", - "The number of instances cannot be empty": "数量不能为空", - "The minimum number of instances is 1": "最小值为1", - "The maximum number of instances is 100": "最小值为100", - "Details": "详情", - "Start": "启动", - "ReStart": "重启", - "Stop": "关机", - "Delete": "删除", - "Create Time": "创建时间", - "Operation": "操作", - "Status": "状态", - "IP Address": "IP 地址", - "sshName": "ssh 用户名", - "sshPassword": "ssh 密码", - "ssh port": "ssh 端口", - "Creating": "创建中", - "Created": "已创建", - "Starting": "启动中", - "Started": "运行中", - "Stopping": "关机中", - "Stopped": "已关机", - "Deleting": "删除中", - "Deleted": "已删除", - "terminal": "终端", - "success": "成功", - "Deletion warning": "删除警告", - "Cancel": "取消", - "Please enter": "请输入", - "delete cloud server tip": "确认删除这台云主机吗", - "Prompt": "提示", - "Are you sure to create a cloud host?": "确认创建一台云主机吗", - "Confirm": "确认", - "close cloud server tip": "请注意,关机状态下存储仍会收费,请确认!", - "Quantity tips": "数量是 {{amount1}} 到 {{amount2}}", - "Password copied to clipboard": "密码已复制到剪切板", - "Copy Failed": "复制失败", - "Changing": "变更中", - "Restarting": "重启中", - "Reference fee": "参考费用", - "Reference fee tip": "{{price}}", - "Configuration fee details": "配置费用明细", - "Instance": "实例", - "storage fees": "存储费用", - "Public network bandwidth": "公网带宽", - "Billing items": "计费项", - "price": "价格", - "publicIpAssigned tips": "请注意:未分配独立公网IP地址的情况下无法使用外网IP地址对外进行互相通信。", - "Fee inquiry in progress": "费用查询中...", - "hour": "小时", - "Reference fee disk tips": "{{price}}/GiB", - "Reference fee bandwidth tips": "{{price}}/Mbps", - "Billing rules": "计费规则", - "The maximum number of instances is 20": "最大数量是20", - "Billing model": "计费模式", - "Availability Zone": "可用区", - "Architecture": "架构", - "Instance Family": "实例族", - "postPaidByHour": "按量计费", - "heterogeneous": "异构计算 (GPU)", - "prePaid": "包年包月", - "x86_64": "x86计算", - "costEffective": "实惠型", - "gpu": "GPU", - "Password does not meet requirements": "密码不符合要求", - "Lowercase letters az": "小写字母 a ~ z", - "Capital letters az": "大写字母 A ~ Z", - "Numbers 09": "数字 0 ~ 9", - "Contains at least three of these": "至少包含其中三项", - "Cannot start with": "不能以\" / \"开头", - "cannot contain spaces": "不能包含空格", - "Within 8 to 30 characters": "在 8 ~ 30 位字符数以内(推荐12位以上)", - "highMemory": "内存型", - "highPerformance": "计算型", - "Public IP is not enabled": "未开启公网IP", - "interval": "区间", - "sold out": "售空", - "month": "月", - "indivual": "个", - "year": "年", - "duration": "时长", - "total": "总计", - "After the annual and monthly cloud hosting is sold": "包年包月云主机售卖后", - "No refund allowed": "不允许退费,", - "Pay Confirm tips": "点击“确认”表示您已知晓并同意此条款。如果您不同意“包年包月云主机售卖后不允许退费”的条款,请点击“取消”按钮。不同意后,本次购买将被撤销,您不会被收取任何费用。", - "file.upload error description": "文件上传失败", - "Upload File": "上传文件", - "file.Select a maximum of 10 files": "至多选择 10 个文件", - "The maximum number of instances is 12": "最大值为 12" -} diff --git a/frontend/providers/cloudserver/public/logo.svg b/frontend/providers/cloudserver/public/logo.svg deleted file mode 100644 index d8db62f9e..000000000 --- a/frontend/providers/cloudserver/public/logo.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/providers/cloudserver/src/api/cloudserver.ts b/frontend/providers/cloudserver/src/api/cloudserver.ts deleted file mode 100644 index daecd3f4f..000000000 --- a/frontend/providers/cloudserver/src/api/cloudserver.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ServerTypePayload } from '@/pages/api/cloudserver/listType'; -import { UpdateStatusPayload } from '@/pages/api/cloudserver/updateStatus'; -import { POST } from '@/services/request'; -import adaptCloudServerListItem from '@/types/adapt'; -import { CloudServerPrice, CloudServerType, EditForm, OperatingSystems } from '@/types/cloudserver'; -import { CVMInstanceType } from '@/types/cloudserver'; -import { CVMRegionType } from '@/types/region'; - -export const getCloudServerRegion = () => POST('/api/cloudserver/getRegion'); - -export const getCloudServerType = (payload: ServerTypePayload) => - POST('/api/cloudserver/listType', payload); - -export const getCloudServerImage = () => POST('/api/cloudserver/listImage'); - -export const createCloudServer = (payload: EditForm) => POST('/api/cloudserver/create', payload); - -export const delCloudServer = () => POST('/api/cloudserver/delete'); - -export const updateCloudServerStatus = (payload: UpdateStatusPayload) => - POST('/api/cloudserver/updateStatus', payload); - -export const listCloudServer = (payload: { page: number; pageSize: number }) => - POST<{ list: CVMInstanceType[]; page: number; pageSize: number; total: number }>( - '/api/cloudserver/list', - payload - ).then((data) => { - return { - ...data, - list: data?.list?.map(adaptCloudServerListItem) - }; - }); - -export const getCloudServerPrice = (payload: EditForm) => - POST('/api/cloudserver/price', payload); diff --git a/frontend/providers/cloudserver/src/api/platform.ts b/frontend/providers/cloudserver/src/api/platform.ts deleted file mode 100644 index adb989c59..000000000 --- a/frontend/providers/cloudserver/src/api/platform.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { SystemEnvResponse } from '@/pages/api/platform/getEnv'; -import { GET, POST } from '@/services/request'; -import { AxiosProgressEvent } from 'axios'; - -export const getSystemEnv = () => GET('/api/platform/getEnv'); - -export const uploadFile = ( - data: FormData, - onUploadProgress?: (progressEvent: AxiosProgressEvent) => void -) => { - return POST< - { - originalName: string; - fileName: string; - }[] - >('/api/minio/upload', data, { - headers: { - 'Content-Type': 'multipart/form-data' - }, - timeout: 3 * 60 * 1000, - onUploadProgress - }); -}; - -export const getFileUrl = ({ fileName }: { fileName: string }) => { - return GET('/api/minio/getUrl', { fileName }); -}; - -export const deleteFileByName = ({ fileName }: { fileName: string }) => { - return GET('/api/minio/delete', { fileName }); -}; - -export const FeishuNotification = () => POST('/api/platform/feishu'); diff --git a/frontend/providers/cloudserver/src/components/AppStatusTag/index.tsx b/frontend/providers/cloudserver/src/components/AppStatusTag/index.tsx deleted file mode 100644 index 266944612..000000000 --- a/frontend/providers/cloudserver/src/components/AppStatusTag/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { StatusMap } from '@/constants/vm'; -import { PhaseEnum } from '@/types/cloudserver'; -import { Box, Flex, Spinner } from '@chakra-ui/react'; -import { useTranslation } from 'next-i18next'; - -const AppStatusTag = ({ - status, - showBorder = false -}: { - status: PhaseEnum; - showBorder: boolean; -}) => { - const { t } = useTranslation(); - const statusMap = StatusMap[status]; - - return ( - - - - {t(statusMap.label)} - {status?.includes('ing') && } - - - ); -}; - -export default AppStatusTag; diff --git a/frontend/providers/cloudserver/src/components/ButtonGroup/index.tsx b/frontend/providers/cloudserver/src/components/ButtonGroup/index.tsx deleted file mode 100644 index f28defa8b..000000000 --- a/frontend/providers/cloudserver/src/components/ButtonGroup/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { Flex, Box } from '@chakra-ui/react'; - -const ButtonGroup = ({ - list -}: { - list: { - label: string; - onclick: () => void; - active: boolean; - }[]; -}) => { - return ( - - {list.map((item) => ( - - {item.label} - - ))} - - ); -}; - -export default ButtonGroup; diff --git a/frontend/providers/cloudserver/src/components/CurrencySymbol/index.tsx b/frontend/providers/cloudserver/src/components/CurrencySymbol/index.tsx deleted file mode 100644 index f784def92..000000000 --- a/frontend/providers/cloudserver/src/components/CurrencySymbol/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Text, Icon } from '@chakra-ui/react'; -export default function currencysymbol({ - type = 'shellCoin', - ...props -}: { - type?: 'shellCoin' | 'cny' | 'usd'; -} & Pick[0], 'w' | 'h' | 'color'>) { - return type === 'shellCoin' ? ( - - - - ) : type === 'cny' ? ( - - ) : ( - $ - ); -} diff --git a/frontend/providers/cloudserver/src/components/FileSelect/index.tsx b/frontend/providers/cloudserver/src/components/FileSelect/index.tsx deleted file mode 100644 index 3f1a7fec5..000000000 --- a/frontend/providers/cloudserver/src/components/FileSelect/index.tsx +++ /dev/null @@ -1,255 +0,0 @@ -import { useLoading } from '@/hooks/useLoading'; -import { useSelectFile } from '@/hooks/useSelectFile'; -import { useToast } from '@/hooks/useToast'; -import { Box, Center, Flex, Icon, Text, type BoxProps } from '@chakra-ui/react'; -import { customAlphabet } from 'nanoid'; -import { useTranslation } from 'next-i18next'; -import { DragEvent, useCallback, useState } from 'react'; - -const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12); - -export const FileImgs = [ - { - reg: /\.yaml$/i, - src: ( - - - - ) - }, - { - reg: /\.(svg|png|jpg|jpeg|gif|bmp)$/i, - src: ( - - - - - - ) - } -]; - -export type FileItemType = { - id: string; - filename: string; - text?: string; - file: File; - icon: JSX.Element; -}; -interface Props extends BoxProps { - fileExtension: string; - files: FileItemType[]; - setFiles: React.Dispatch>; -} - -const FileSelect = ({ fileExtension, setFiles, files, ...BoxStyle }: Props) => { - const { Loading: FileSelectLoading } = useLoading(); - const { t } = useTranslation(); - const { toast } = useToast(); - const [isDragging, setIsDragging] = useState(false); - const [selecting, setSelecting] = useState(false); - - const { File, onOpen } = useSelectFile({ - fileType: fileExtension, - multiple: true - }); - - const onSelectFile = useCallback( - async (files: File[]) => { - setSelecting(true); - try { - // Parse file by file - let promise = Promise.resolve([]); - files.forEach((file) => { - promise = promise.then(async (result) => { - let icon = FileImgs.find((item) => item.reg.test(file.name))?.src; - if (!icon) { - icon = FileImgs[0].src; - } - const fileItem: FileItemType = { - id: nanoid(), - filename: file.name, - icon, - file: file - }; - return [...result, fileItem]; - }); - }); - const chunkFiles = await promise; - console.log(chunkFiles); - - setFiles(chunkFiles); - } catch (error: any) { - console.log(error); - toast({ - title: typeof error === 'string' ? error : '解析文件失败', - status: 'error' - }); - } - setSelecting(false); - }, - [setFiles, toast] - ); - - const handleDragEnter = (e: DragEvent) => { - e.preventDefault(); - setIsDragging(true); - }; - - const handleDragLeave = (e: DragEvent) => { - e.preventDefault(); - setIsDragging(false); - }; - - const handleDrop = useCallback( - async (e: DragEvent) => { - e.preventDefault(); - setIsDragging(false); - const items = e.dataTransfer.items; - const fileList: File[] = []; - - if (e.dataTransfer.items.length <= 1) { - const traverseFileTree = async (item: any) => { - return new Promise((resolve, reject) => { - if (item.isFile) { - item.file((file: File) => { - fileList.push(file); - resolve(); - }); - } else if (item.isDirectory) { - const dirReader = item.createReader(); - dirReader.readEntries(async (entries: any[]) => { - for (let i = 0; i < entries.length; i++) { - await traverseFileTree(entries[i]); - } - resolve(); - }); - } - }); - }; - for (let i = 0; i < items.length; i++) { - const item = items[i].webkitGetAsEntry(); - if (item) { - await traverseFileTree(item); - } - } - } else { - const files = Array.from(e.dataTransfer.files); - let isErr = files.some((item) => item.type === ''); - if (isErr) { - return toast({ - title: t('file.upload error description'), - status: 'error' - }); - } - for (let i = 0; i < files.length; i++) { - fileList.push(files[i]); - } - } - onSelectFile(fileList); - }, - [onSelectFile, t, toast] - ); - - return ( - - - - - - - {t('Upload File')} - - {/* - {files.map((item) => ( - - {item.icon} - {item.filename} - { - setFiles((state) => state.filter((file) => file.id !== item.id)); - }} - > - - - - ))} - */} - - - - - - {files.map((item) => ( - -
- {item.icon} -
- {item.filename} - { - setFiles((state) => state.filter((file) => file.id !== item.id)); - }} - > - - -
- ))} -
-
- ); -}; - -export default FileSelect; diff --git a/frontend/providers/cloudserver/src/components/FormControl/index.tsx b/frontend/providers/cloudserver/src/components/FormControl/index.tsx deleted file mode 100644 index 904350290..000000000 --- a/frontend/providers/cloudserver/src/components/FormControl/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { ReactNode } from 'react'; -import { FormControl, FormErrorMessage } from '@chakra-ui/react'; -import type { FormControlProps } from '@chakra-ui/react'; - -interface Props extends FormControlProps { - errorText?: string; - showError?: boolean; - children: ReactNode; -} - -const MyFormControl = ({ errorText, showError = false, children, ...props }: Props) => { - return ( - - {children} - {showError && !!errorText && ( - - {errorText} - - )} - - ); -}; - -export default MyFormControl; diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/analyze.svg b/frontend/providers/cloudserver/src/components/Icon/icons/analyze.svg deleted file mode 100644 index 503178647..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/analyze.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/arrowLeft.svg b/frontend/providers/cloudserver/src/components/Icon/icons/arrowLeft.svg deleted file mode 100644 index 7905b5380..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/arrowLeft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/change.svg b/frontend/providers/cloudserver/src/components/Icon/icons/change.svg deleted file mode 100644 index d81483220..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/change.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/check.svg b/frontend/providers/cloudserver/src/components/Icon/icons/check.svg deleted file mode 100644 index a644c51af..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/close.svg b/frontend/providers/cloudserver/src/components/Icon/icons/close.svg deleted file mode 100644 index 62fb9a2a8..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/close.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/connection.svg b/frontend/providers/cloudserver/src/components/Icon/icons/connection.svg deleted file mode 100644 index 393e9e2eb..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/connection.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/continue.svg b/frontend/providers/cloudserver/src/components/Icon/icons/continue.svg deleted file mode 100644 index 998357d4a..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/continue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/copy.svg b/frontend/providers/cloudserver/src/components/Icon/icons/copy.svg deleted file mode 100644 index bfd38df8e..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/copy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/delete.svg b/frontend/providers/cloudserver/src/components/Icon/icons/delete.svg deleted file mode 100644 index 7f07bdcd4..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/detail.svg b/frontend/providers/cloudserver/src/components/Icon/icons/detail.svg deleted file mode 100644 index 380ce9fff..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/detail.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/download.svg b/frontend/providers/cloudserver/src/components/Icon/icons/download.svg deleted file mode 100644 index 55919030d..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/formInfo.svg b/frontend/providers/cloudserver/src/components/Icon/icons/formInfo.svg deleted file mode 100644 index 164e7a19d..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/formInfo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/help.svg b/frontend/providers/cloudserver/src/components/Icon/icons/help.svg deleted file mode 100644 index 0365857b3..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/help.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/info.svg b/frontend/providers/cloudserver/src/components/Icon/icons/info.svg deleted file mode 100644 index 5f81980ab..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/infoWarn.svg b/frontend/providers/cloudserver/src/components/Icon/icons/infoWarn.svg deleted file mode 100644 index 4eec564d3..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/infoWarn.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/link.svg b/frontend/providers/cloudserver/src/components/Icon/icons/link.svg deleted file mode 100644 index 126255b73..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/link.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/log.svg b/frontend/providers/cloudserver/src/components/Icon/icons/log.svg deleted file mode 100644 index 7dedd37e5..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/log.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/logo.svg b/frontend/providers/cloudserver/src/components/Icon/icons/logo.svg deleted file mode 100644 index d826088c3..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/more.svg b/frontend/providers/cloudserver/src/components/Icon/icons/more.svg deleted file mode 100644 index bc3ddc9e9..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/more.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/noEvents.svg b/frontend/providers/cloudserver/src/components/Icon/icons/noEvents.svg deleted file mode 100644 index 9665a7024..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/noEvents.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/pause.svg b/frontend/providers/cloudserver/src/components/Icon/icons/pause.svg deleted file mode 100644 index 0c7f9ec92..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/pause.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/plus.svg b/frontend/providers/cloudserver/src/components/Icon/icons/plus.svg deleted file mode 100644 index 9b1a705b4..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/podList.svg b/frontend/providers/cloudserver/src/components/Icon/icons/podList.svg deleted file mode 100644 index 6be85b62a..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/podList.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/read.svg b/frontend/providers/cloudserver/src/components/Icon/icons/read.svg deleted file mode 100644 index 3140dd585..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/read.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/restart.svg b/frontend/providers/cloudserver/src/components/Icon/icons/restart.svg deleted file mode 100644 index 93cf5ef2f..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/restart.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/restore.svg b/frontend/providers/cloudserver/src/components/Icon/icons/restore.svg deleted file mode 100644 index 2e89f43b6..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/restore.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/settings.svg b/frontend/providers/cloudserver/src/components/Icon/icons/settings.svg deleted file mode 100644 index 3cd5c9e17..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/start.svg b/frontend/providers/cloudserver/src/components/Icon/icons/start.svg deleted file mode 100644 index c0603e79a..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/start.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/statusDetail.svg b/frontend/providers/cloudserver/src/components/Icon/icons/statusDetail.svg deleted file mode 100644 index 9716b6471..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/statusDetail.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/terminal.svg b/frontend/providers/cloudserver/src/components/Icon/icons/terminal.svg deleted file mode 100644 index db9147be9..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/terminal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/unread.svg b/frontend/providers/cloudserver/src/components/Icon/icons/unread.svg deleted file mode 100644 index 29403d117..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/unread.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/icons/warning.svg b/frontend/providers/cloudserver/src/components/Icon/icons/warning.svg deleted file mode 100644 index 104b2dba1..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/icons/warning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/cloudserver/src/components/Icon/index.tsx b/frontend/providers/cloudserver/src/components/Icon/index.tsx deleted file mode 100644 index fde128fba..000000000 --- a/frontend/providers/cloudserver/src/components/Icon/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; -import type { IconProps } from '@chakra-ui/react'; -import { Icon } from '@chakra-ui/react'; - -const map = { - more: require('./icons/more.svg').default, - podList: require('./icons/podList.svg').default, - arrowLeft: require('./icons/arrowLeft.svg').default, - plus: require('./icons/plus.svg').default, - delete: require('./icons/delete.svg').default, - restart: require('./icons/restart.svg').default, - start: require('./icons/start.svg').default, - pause: require('./icons/pause.svg').default, - detail: require('./icons/detail.svg').default, - logo: require('./icons/logo.svg').default, - change: require('./icons/change.svg').default, - formInfo: require('./icons/formInfo.svg').default, - settings: require('./icons/settings.svg').default, - copy: require('./icons/copy.svg').default, - continue: require('./icons/continue.svg').default, - noEvents: require('./icons/noEvents.svg').default, - warning: require('./icons/warning.svg').default, - analyze: require('./icons/analyze.svg').default, - terminal: require('./icons/terminal.svg').default, - log: require('./icons/log.svg').default, - statusDetail: require('./icons/statusDetail.svg').default, - read: require('./icons/read.svg').default, - unread: require('./icons/unread.svg').default, - connection: require('./icons/connection.svg').default, - info: require('./icons/info.svg').default, - restore: require('./icons/restore.svg').default, - infoWarn: require('./icons/infoWarn.svg').default, - download: require('./icons/download.svg').default, - check: require('./icons/check.svg').default, - close: require('./icons/close.svg').default, - help: require('./icons/help.svg').default, - link: require('./icons/link.svg').default -}; - -const MyIcon = ({ - name, - w = 'auto', - h = 'auto', - ...props -}: { name: keyof typeof map } & IconProps) => { - return map[name] ? ( - - ) : null; -}; - -export default MyIcon; diff --git a/frontend/providers/cloudserver/src/components/MyTable/index.tsx b/frontend/providers/cloudserver/src/components/MyTable/index.tsx deleted file mode 100644 index f593e1eb3..000000000 --- a/frontend/providers/cloudserver/src/components/MyTable/index.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React, { useState } from 'react'; -import { Box, BoxProps, Grid, Flex } from '@chakra-ui/react'; - -export type TableColumnsType = { - title: string; - dataIndex?: string; - key: string; - render?: (item: any, rowNumber: number, activeId: number) => JSX.Element; -}; - -interface Props extends BoxProps { - columns: TableColumnsType[]; - data: any[]; - itemClass?: string; - openSelected?: boolean; // support select item // isOptional - onRowClick?: (item: any) => void; -} - -export const MyTable = ({ - columns, - data, - itemClass = '', - openSelected = false, - onRowClick, - ...reset -}: Props) => { - const [activeId, setActiveId] = useState(0); - - return ( - - - {columns.map((item, i) => ( - - {item.title} - - ))} - - {data.map((item: any, index1) => ( - { - if (item.isOptional || !openSelected) { - setActiveId(index1); - onRowClick && onRowClick(item); - } - }} - > - {columns.map((col, index2) => ( - - {col.render - ? col.render(item, index1, activeId) - : col.dataIndex - ? `${item[col.dataIndex]}` - : ''} - - ))} - - ))} - - ); -}; diff --git a/frontend/providers/cloudserver/src/components/MyTooltip/index.tsx b/frontend/providers/cloudserver/src/components/MyTooltip/index.tsx deleted file mode 100644 index e691d7938..000000000 --- a/frontend/providers/cloudserver/src/components/MyTooltip/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import { Tooltip, TooltipProps } from '@chakra-ui/react'; - -const MyTooltip = ({ children, ...props }: TooltipProps) => { - return ( - - {children} - - ); -}; - -export default MyTooltip; diff --git a/frontend/providers/cloudserver/src/components/Pagination/index.tsx b/frontend/providers/cloudserver/src/components/Pagination/index.tsx deleted file mode 100644 index 57650ae25..000000000 --- a/frontend/providers/cloudserver/src/components/Pagination/index.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { Flex, FlexProps, Icon, Text } from '@chakra-ui/react'; -import { Dispatch, SetStateAction, useState } from 'react'; - -type PaginationProps = { - totalItems: number; - itemsPerPage: number; - currentPage: number; - setCurrentPage: Dispatch>; -}; - -export default function Pagination({ - totalItems, - itemsPerPage, - currentPage = 1, - setCurrentPage -}: PaginationProps) { - const totalPage = Math.ceil(totalItems / itemsPerPage); - - const goToPage = (page: number) => { - if (page >= 1 && page <= totalPage) { - setCurrentPage(page); - } - }; - - const handlePrevPage = () => { - goToPage(currentPage - 1); - }; - - const handleNextPage = () => { - goToPage(currentPage + 1); - }; - - const buttonStyle: FlexProps = { - justifyContent: 'center', - alignItems: 'center', - w: '24px', - h: '24px', - borderRadius: '50%' - }; - - return ( - - Total: - {totalItems} - - goToPage(1)} - {...buttonStyle} - {...{ - bg: currentPage === 1 ? '#EDF0F2' : '#EDEFF1', - cursor: currentPage === 1 ? 'not-allowed' : 'pointer', - opacity: currentPage === 1 ? '0.5' : '1' - }} - > - - - - - - - - - - - - {currentPage}/{totalPage} - - - - - - - - goToPage(totalPage)} - > - - - - - - {itemsPerPage} - /Page - - ); -} diff --git a/frontend/providers/cloudserver/src/components/RangeDate/index.tsx b/frontend/providers/cloudserver/src/components/RangeDate/index.tsx deleted file mode 100644 index c46b79ae2..000000000 --- a/frontend/providers/cloudserver/src/components/RangeDate/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { - Flex, - Input, - Popover, - PopoverTrigger, - Img, - PopoverContent, - Button, - Box, - useTheme -} from '@chakra-ui/react'; -import { format, parse, isValid, isAfter, isBefore } from 'date-fns'; -import { useState, ChangeEventHandler, useEffect, useMemo } from 'react'; -import { DateRange, SelectRangeEventHandler, DayPicker } from 'react-day-picker'; -import { useQueryClient } from '@tanstack/react-query'; -import { CalendarIcon } from '@chakra-ui/icons'; - -export default function RangeDate({ - isDisabled = false, - defaultRange = { from: new Date(), to: new Date() } -}: { - isDisabled?: boolean; - defaultRange?: DateRange; -}) { - const [selectedRange, setSelectedRange] = useState(defaultRange); - - const onClose = () => {}; - - return ( - - - - - - { - if (e) { - setSelectedRange(e); - } else { - setSelectedRange((state) => ({ - from: state.from, - to: state.from - })); - } - }} - /> - - - ); -} diff --git a/frontend/providers/cloudserver/src/components/RangeDate/style.module.scss b/frontend/providers/cloudserver/src/components/RangeDate/style.module.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/providers/cloudserver/src/components/SelectDateRange/index.tsx b/frontend/providers/cloudserver/src/components/SelectDateRange/index.tsx deleted file mode 100644 index 635f189f4..000000000 --- a/frontend/providers/cloudserver/src/components/SelectDateRange/index.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import { - Box, - Button, - Flex, - Icon, - Input, - Popover, - PopoverContent, - PopoverTrigger -} from '@chakra-ui/react'; -import { endOfDay, format, isAfter, isBefore, isValid, parse, startOfDay } from 'date-fns'; -import { ChangeEventHandler, Dispatch, SetStateAction, useState } from 'react'; -import { DateRange, DayPicker, SelectRangeEventHandler } from 'react-day-picker'; - -type SelectDateRangeProps = { - isDisabled?: boolean; - startTime: Date; - setStartTime: Dispatch>; - endTime: Date; - setEndTime: Dispatch>; -}; - -export default function SelectDateRange({ - isDisabled, - startTime, - setStartTime, - endTime, - setEndTime -}: SelectDateRangeProps) { - const initState = { from: startTime, to: endTime }; - - const [selectedRange, setSelectedRange] = useState(initState); - const [fromValue, setFromValue] = useState(format(initState.from, 'y-MM-dd')); - const [toValue, setToValue] = useState(format(initState.to, 'y-MM-dd')); - const [inputState, setInputState] = useState<0 | 1>(0); - const onClose = () => { - selectedRange?.from && setStartTime(startOfDay(selectedRange.from)); - selectedRange?.to && setEndTime(endOfDay(selectedRange.to)); - }; - - const handleFromChange: ChangeEventHandler = (e) => { - setFromValue(e.target.value); - const date = parse(e.target.value, 'y-MM-dd', new Date()); - if (!isValid(date)) { - return setSelectedRange({ from: undefined, to: selectedRange?.to }); - } - - if (selectedRange?.to) { - if (isAfter(date, selectedRange.to)) { - setSelectedRange({ from: selectedRange.to, to: date }); - } else { - setSelectedRange({ from: date, to: selectedRange?.to }); - } - } else { - setSelectedRange({ from: date, to: date }); - } - }; - - const handleToChange: ChangeEventHandler = (e) => { - setToValue(e.target.value); - const date = parse(e.target.value, 'y-MM-dd', new Date()); - - if (!isValid(date)) { - return setSelectedRange({ from: selectedRange?.from, to: undefined }); - } - if (selectedRange?.from) { - if (isBefore(date, selectedRange.from)) { - setSelectedRange({ from: date, to: selectedRange.from }); - } else { - setSelectedRange({ from: selectedRange?.from, to: date }); - } - } else { - setSelectedRange({ from: date, to: date }); - } - }; - - const handleRangeSelect: SelectRangeEventHandler = (range: DateRange | undefined) => { - if (range) { - let { from, to } = range; - if (inputState === 0) { - if (from === selectedRange?.from) { - from = to; - } else { - to = from; - } - setInputState(1); - } else { - setInputState(0); - } - setSelectedRange({ - from, - to - }); - if (from) { - setFromValue(format(from, 'y-MM-dd')); - } else { - setFromValue(''); - } - if (to) { - setToValue(format(to, 'y-MM-dd')); - } else { - setToValue(from ? format(from, 'y-MM-dd') : ''); - } - } else { - if (fromValue && selectedRange?.from) { - setToValue(fromValue); - setSelectedRange({ - ...selectedRange, - to: selectedRange.from - }); - setInputState(1); - } - } - }; - - const handleRangeSelectFrom: SelectRangeEventHandler = (range: DateRange | undefined) => { - if (range) { - let { from, to } = range; - if (selectedRange?.to) { - if (from) { - if (!to) { - to = from; - } else if (from === selectedRange?.from) { - from = to; - to = selectedRange.to; - } - if (isBefore(from, selectedRange.to)) { - setSelectedRange({ - ...selectedRange, - from - }); - setFromValue(format(from, 'y-MM-dd')); - } - } - } - } - }; - - const handleRangeSelectTo: SelectRangeEventHandler = (range: DateRange | undefined) => { - console.log(range, selectedRange); - if (range) { - let { from, to } = range; - if (selectedRange?.from) { - if (to) { - if (!from) { - from = to; - } else if (to === selectedRange?.to) { - to = from; - from = selectedRange.from; - } - if (isAfter(to, selectedRange.from)) { - setSelectedRange({ - ...selectedRange, - to - }); - setToValue(format(to, 'y-MM-dd')); - } - } - } - } else { - if (fromValue && selectedRange?.from) { - setToValue(fromValue); - setSelectedRange({ - ...selectedRange, - to: selectedRange.from - }); - setInputState(1); - } - } - }; - - return ( - - - - - - - - - - - - - - - - - - - - - { - setInputState(0); - onClose(); - }} - > - - - - - - - - - ); -} diff --git a/frontend/providers/cloudserver/src/components/Tip/index.tsx b/frontend/providers/cloudserver/src/components/Tip/index.tsx deleted file mode 100644 index de7031bb4..000000000 --- a/frontend/providers/cloudserver/src/components/Tip/index.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useMemo } from 'react'; -import { BoxProps, Flex, Box } from '@chakra-ui/react'; -import { useTranslation } from 'next-i18next'; - -interface Props extends BoxProps { - text: string; - icon?: JSX.Element; - theme?: 'blue'; - size?: 'sm' | 'md' | 'lg'; -} - -const Tip = ({ size = 'md', text, icon, theme, ...props }: Props) => { - const { t } = useTranslation(); - - const sizeMap = useMemo(() => { - switch (size) { - case 'sm': - return { - fontSize: '12px', - px: 3, - py: 1 - }; - case 'md': - return { - fontSize: '14px', - px: 4, - py: 2 - }; - case 'lg': - return { - fontSize: '16px', - px: 5, - py: 2 - }; - default: - return {}; - } - }, [size]); - const themeMap = useMemo(() => { - switch (theme) { - case 'blue': - return { - color: '#0884DD', - bg: '#ECF8FF' - }; - default: - return { - color: '#0884DD', - bg: '#ECF8FF' - }; - } - }, [theme]); - - return ( - - {icon ? ( - - {icon} - - ) : null} - {t(text)} - - ); -}; - -export default Tip; diff --git a/frontend/providers/cloudserver/src/constants/theme.ts b/frontend/providers/cloudserver/src/constants/theme.ts deleted file mode 100644 index 3b6677ecc..000000000 --- a/frontend/providers/cloudserver/src/constants/theme.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { extendTheme } from '@chakra-ui/react'; -import { theme as sealosTheme } from '@sealos/ui'; - -export const theme = extendTheme(sealosTheme, { - styles: { - global: { - 'html, body': { - fontSize: 'md', - height: '100%', - overflow: 'overlay', - fontWeight: 400, - minWidth: '1024px' - } - } - } -}); diff --git a/frontend/providers/cloudserver/src/constants/vm.ts b/frontend/providers/cloudserver/src/constants/vm.ts deleted file mode 100644 index 49e7e92de..000000000 --- a/frontend/providers/cloudserver/src/constants/vm.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { PhaseEnum } from '@/types/cloudserver'; - -export const SliderList = { - cpu: [ - { - label: '0.1', - value: 100 - }, - { - label: '0.2', - value: 200 - }, - { - label: '0.5', - value: 500 - }, - { - label: '1', - value: 1000 - }, - { - label: '2', - value: 2000 - }, - { - label: '3', - value: 3000 - }, - { - label: '4', - value: 4000 - }, - { - label: '8', - value: 8000 - } - ], - memory: [ - { - label: '256 M', - value: 256 - }, - { - label: '512 M', - value: 512 - }, - { - label: '1 G', - value: 1024 - }, - { - label: '2 G', - value: 2048 - }, - { - label: '4 G', - value: 4096 - }, - { - label: '8 G', - value: 8192 - }, - { - label: '16 G', - value: 16384 - }, - { - label: '32 G', - value: 32768 - } - ] -}; - -export const MockInstanceType = [ - { - CPU: 32, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.8XLARGE64', - Memory: 64, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 16, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.4XLARGE32', - Memory: 32, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 8, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.2XLARGE32', - Memory: 32, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 8, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.2XLARGE16', - Memory: 16, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 4, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.LARGE8', - Memory: 8, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 4, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.LARGE16', - Memory: 16, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 32, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.8XLARGE128', - Memory: 128, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 16, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.4XLARGE64', - Memory: 64, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 2, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.MEDIUM4', - Memory: 4, - Zone: 'ap-guangzhou-6' - }, - { - CPU: 2, - FPGA: 0, - GPU: 0, - GpuCount: 0, - InstanceFamily: 'TS5', - InstanceType: 'TS5.MEDIUM8' - } -]; - -export const MockStorages = [ - { - id: '1', - type: 'Hard Drive', - size: '1TB', - amount: '2', - describe: 'Internal storage for desktop computer' - }, - { - id: '2', - type: 'SSD', - size: '500GB', - amount: '1', - describe: 'Solid-state drive for laptop' - }, - { - id: '1', - type: 'External HDD', - size: '2TB', - amount: '3', - describe: 'Portable storage for backup' - }, - { - type: 'USB Flash Drive', - size: '64GB', - amount: '5', - describe: 'Removable storage for transferring files' - } -]; - -export const MockImage = [ - { - name: 'OpenCloudOS', - type: 'Linux', - description: 'An open-source cloud operating system designed for scalability and flexibility.', - logo: 'https://example.com/opencloudos.png' - }, - { - name: 'TencentOS', - type: 'Linux', - description: - 'A Linux distribution developed by Tencent, optimized for cloud computing and internet services.', - logo: 'https://example.com/tencentos.png' - }, - { - name: 'CentOS', - type: 'Linux', - description: - 'A free and open-source Linux distribution based on Red Hat Enterprise Linux (RHEL).', - logo: 'https://example.com/centos.png' - }, - { - name: 'Windows', - type: 'Windows', - description: - 'A popular operating system developed by Microsoft, widely used for personal computers.', - logo: 'https://example.com/windows.png' - }, - { - name: 'Ubuntu', - type: 'Linux', - description: - 'A user-friendly Linux distribution based on Debian, known for its ease of use and community support.', - logo: 'https://example.com/ubuntu.png' - }, - { - name: 'Debian', - type: 'Linux', - description: - 'A stable and versatile Linux distribution, widely used as a base for other distributions.', - logo: 'https://example.com/debian.png' - }, - { - name: 'CentOS Stream', - type: 'Linux', - description: 'A rolling-release Linux distribution that serves as a testing ground for RHEL.', - logo: 'https://example.com/centos-stream.png' - }, - { - name: 'AlmaLinux', - type: 'Linux', - description: - 'A community-driven Linux distribution designed as a drop-in replacement for CentOS.', - logo: 'https://example.com/almalinux.png' - }, - { - name: 'CoreOS', - type: 'Linux', - description: - 'A lightweight Linux distribution designed for containerized applications and cloud deployments.', - logo: 'https://example.com/coreos.png' - }, - { - name: 'openSUSE', - type: 'Linux', - description: - 'A general-purpose Linux distribution known for its stability and comprehensive package management.', - logo: 'https://example.com/opensuse.png' - }, - { - name: 'Rocky Linux', - type: 'Linux', - description: - 'A community-driven enterprise-grade Linux distribution, created as a replacement for CentOS.', - logo: 'https://example.com/rockylinux.png' - }, - { - name: 'FreeBSD', - type: 'BSD', - description: - 'A free and open-source Unix-like operating system based on the Berkeley Software Distribution (BSD).', - logo: 'https://example.com/freebsd.png' - }, - { - name: 'Fedora', - type: 'Linux', - description: - 'A cutting-edge Linux distribution sponsored by Red Hat, known for its frequent updates and new features.', - logo: 'https://example.com/fedora.png' - } -]; - -export const MockInstance = [ - { - _id: '60a7e9e8c8e8a5001f9e8a5a', - phase: 'Running', - state: 'Active', - namespace: 'default', - sealosUserId: '123456', - cpu: 4, - disk: 100, - memory: 8192, - publicNetworkAccess: true, - instanceId: 'i-1234567890', - ImageId: 'ami-12345678', - InstanceName: 'MyVM1', - loginName: 'admin', - loginPassword: 'password123', - cloudProvider: 'AWS' - }, - { - _id: '60a7e9e8c8e8a5001f9e8a5b', - phase: 'Stopped', - state: 'Inactive', - namespace: 'default', - sealosUserId: '789012', - cpu: 2, - disk: 50, - memory: 4096, - publicNetworkAccess: false, - instanceId: 'i-0987654321', - ImageId: 'ami-87654321', - InstanceName: 'MyVM2', - loginName: 'admin', - loginPassword: 'password456', - cloudProvider: 'Azure' - } -]; - -export const StatusMap = { - [PhaseEnum.Starting]: { - label: 'Starting', - value: PhaseEnum.Starting, - color: 'green.600', - backgroundColor: 'green.50', - dotColor: 'green.600' - }, - [PhaseEnum.Started]: { - label: 'Started', - value: PhaseEnum.Started, - color: 'green.600', - backgroundColor: 'green.50', - dotColor: 'green.600' - }, - [PhaseEnum.Creating]: { - label: 'Creating', - value: PhaseEnum.Creating, - color: 'grayModern.500', - backgroundColor: 'grayModern.100', - dotColor: 'grayModern.500' - }, - [PhaseEnum.Created]: { - label: 'Created', - value: PhaseEnum.Created, - color: 'grayModern.500', - backgroundColor: 'grayModern.100', - dotColor: 'grayModern.500' - }, - [PhaseEnum.Deleted]: { - label: 'Deleted', - value: PhaseEnum.Deleted, - color: 'rgba(240, 68, 56, 1)', - backgroundColor: 'rgba(254, 243, 242, 1)', - dotColor: 'rgba(240, 68, 56, 1)' - }, - [PhaseEnum.Deleting]: { - label: 'Deleting', - value: PhaseEnum.Deleting, - color: 'rgba(240, 68, 56, 1)', - backgroundColor: 'rgba(254, 243, 242, 1)', - dotColor: 'rgba(240, 68, 56, 1)' - }, - [PhaseEnum.Stopped]: { - label: 'Stopped', - value: PhaseEnum.Stopped, - color: 'rgba(111, 93, 215, 1)', - backgroundColor: 'rgba(240, 238, 255, 1)', - dotColor: 'rgba(111, 93, 215, 1)' - }, - [PhaseEnum.Stopping]: { - label: 'Stopping', - value: PhaseEnum.Stopping, - color: 'rgba(111, 93, 215, 1)', - backgroundColor: 'rgba(240, 238, 255, 1)', - dotColor: 'rgba(111, 93, 215, 1)' - }, - [PhaseEnum.Changing]: { - label: 'Changing', - value: PhaseEnum.Changing, - color: 'grayModern.500', - backgroundColor: 'grayModern.100', - dotColor: 'grayModern.500' - }, - [PhaseEnum.Restarting]: { - label: 'Restarting', - value: PhaseEnum.Restarting, - color: 'grayModern.500', - backgroundColor: 'grayModern.100', - dotColor: 'grayModern.500' - } -}; diff --git a/frontend/providers/cloudserver/src/hooks/useConfirm.tsx b/frontend/providers/cloudserver/src/hooks/useConfirm.tsx deleted file mode 100644 index 6c1a10b37..000000000 --- a/frontend/providers/cloudserver/src/hooks/useConfirm.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { ReactNode, useCallback, useRef } from 'react'; -import { - AlertDialog, - AlertDialogBody, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogContent, - AlertDialogOverlay, - useDisclosure, - Button -} from '@chakra-ui/react'; -import { useTranslation } from 'next-i18next'; - -export const useConfirm = ({ - title = 'Prompt', - content, - confirmText = 'Confirm' -}: { - title?: string; - content: ReactNode; - confirmText?: string; -}) => { - const { isOpen, onOpen, onClose } = useDisclosure(); - const { t } = useTranslation(); - const cancelRef = useRef(null); - const confirmCb = useRef(); - const cancelCb = useRef(); - - return { - openConfirm: useCallback( - (confirm?: any, cancel?: any) => { - return function () { - onOpen(); - confirmCb.current = confirm; - cancelCb.current = cancel; - }; - }, - [onOpen] - ), - ConfirmChild: useCallback( - () => ( - - - - - {t(title)} - - - {content} - - - - - - - - - ), - [confirmText, content, isOpen, onClose, t, title] - ) - }; -}; diff --git a/frontend/providers/cloudserver/src/hooks/useCopyData.ts b/frontend/providers/cloudserver/src/hooks/useCopyData.ts deleted file mode 100644 index 0287e014a..000000000 --- a/frontend/providers/cloudserver/src/hooks/useCopyData.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { UseToastOptions } from '@chakra-ui/react'; -import { useMessage } from '@sealos/ui'; -import { useTranslation } from 'next-i18next'; - -/** - * copy text data - */ -export const useCopyData = () => { - const { message: toast } = useMessage(); - const { t } = useTranslation(); - - return { - copyData: (data: string, title: string = 'Copy Success', options?: UseToastOptions) => { - try { - const textarea = document.createElement('textarea'); - textarea.value = data; - document.body.appendChild(textarea); - textarea.select(); - document.execCommand('copy'); - document.body.removeChild(textarea); - toast({ - title: title, - status: 'success', - duration: 1000, - ...options - }); - } catch (error) { - console.error(error); - toast({ - title: t('Copy Failed'), - status: 'error' - }); - } - } - }; -}; diff --git a/frontend/providers/cloudserver/src/hooks/useLoading.tsx b/frontend/providers/cloudserver/src/hooks/useLoading.tsx deleted file mode 100644 index f00dac51b..000000000 --- a/frontend/providers/cloudserver/src/hooks/useLoading.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useState, useCallback } from 'react'; -import { Spinner, Flex } from '@chakra-ui/react'; - -export const useLoading = (props?: { defaultLoading: boolean }) => { - const [isLoading, setIsLoading] = useState(props?.defaultLoading || false); - - const Loading = useCallback( - ({ loading, fixed = true }: { loading?: boolean; fixed?: boolean }): JSX.Element | null => { - return ( - - - - ); - }, - [isLoading] - ); - - return { - isLoading, - setIsLoading, - Loading - }; -}; diff --git a/frontend/providers/cloudserver/src/hooks/useScreen.ts b/frontend/providers/cloudserver/src/hooks/useScreen.ts deleted file mode 100644 index 79af2c568..000000000 --- a/frontend/providers/cloudserver/src/hooks/useScreen.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { useState, useEffect } from 'react'; -import { throttle } from 'lodash'; - -export function useScreen() { - const [screenWidth, setScreenWidth] = useState(1440); - - useEffect(() => { - const resize = throttle(() => { - const w = document.documentElement.clientWidth; - setScreenWidth(w); - }, 300); - window.addEventListener('resize', resize); - - const w = document.documentElement.clientWidth; - setScreenWidth(w); - - return () => { - window.removeEventListener('resize', resize); - }; - }, []); - - return { - screenWidth - }; -} diff --git a/frontend/providers/cloudserver/src/hooks/useSelectFile.tsx b/frontend/providers/cloudserver/src/hooks/useSelectFile.tsx deleted file mode 100644 index 9570cc642..000000000 --- a/frontend/providers/cloudserver/src/hooks/useSelectFile.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, { useRef, useCallback } from 'react'; -import { Box } from '@chakra-ui/react'; -import { useToast } from './useToast'; -import { useTranslation } from 'react-i18next'; - -export const useSelectFile = (props?: { fileType?: string; multiple?: boolean }) => { - const { t } = useTranslation(); - const { fileType = '*', multiple = false } = props || {}; - const { toast } = useToast(); - const SelectFileDom = useRef(null); - - const File = useCallback( - ({ onSelect }: { onSelect: (e: File[]) => void }) => ( - - { - if (!e.target.files || e.target.files?.length === 0) return; - if (e.target.files.length > 10) { - return toast({ - status: 'warning', - title: t('file.Select a maximum of 10 files') - }); - } - onSelect(Array.from(e.target.files)); - }} - /> - - ), - [fileType, multiple, t, toast] - ); - - const onOpen = useCallback(() => { - SelectFileDom.current && SelectFileDom.current.click(); - }, []); - - return { - File, - onOpen - }; -}; diff --git a/frontend/providers/cloudserver/src/hooks/useStore.ts b/frontend/providers/cloudserver/src/hooks/useStore.ts deleted file mode 100644 index 439fcef7d..000000000 --- a/frontend/providers/cloudserver/src/hooks/useStore.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useState, useEffect } from 'react'; - -const useStore = ( - store: (callback: (state: T) => unknown) => unknown, - callback: (state: T) => F -) => { - const result = store(callback) as F; - const [data, setData] = useState(); - - useEffect(() => { - setData(result); - }, [result]); - - return data; -}; - -export default useStore; diff --git a/frontend/providers/cloudserver/src/hooks/useToast.ts b/frontend/providers/cloudserver/src/hooks/useToast.ts deleted file mode 100644 index 2c04330ad..000000000 --- a/frontend/providers/cloudserver/src/hooks/useToast.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useToast as uToast, UseToastOptions } from '@chakra-ui/react'; - -export const useToast = (props?: UseToastOptions) => { - const toast = uToast({ - position: 'top', - duration: 3000, - ...props - }); - - return { - toast - }; -}; diff --git a/frontend/providers/cloudserver/src/pages/404.tsx b/frontend/providers/cloudserver/src/pages/404.tsx deleted file mode 100644 index 6221472b6..000000000 --- a/frontend/providers/cloudserver/src/pages/404.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useRouter } from 'next/router'; -import { useEffect } from 'react'; - -const NonePage = () => { - const router = useRouter(); - useEffect(() => { - router.push('/cloudservers'); - }, [router]); - - return
; -}; - -export default NonePage; diff --git a/frontend/providers/cloudserver/src/pages/_app.tsx b/frontend/providers/cloudserver/src/pages/_app.tsx deleted file mode 100644 index b0172a74e..000000000 --- a/frontend/providers/cloudserver/src/pages/_app.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { theme } from '@/constants/theme'; -import { useConfirm } from '@/hooks/useConfirm'; -import useEnvStore from '@/store/env'; -import { useGlobalStore } from '@/store/global'; -import useSessionStore from '@/store/session'; -import '@/styles/reset.scss'; -import { getLangStore, setLangStore } from '@/utils/cookieUtils'; -import { ChakraProvider } from '@chakra-ui/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { throttle } from 'lodash'; -import { appWithTranslation, useTranslation } from 'next-i18next'; -import type { AppProps } from 'next/app'; -import Head from 'next/head'; -import Router, { useRouter } from 'next/router'; -import NProgress from 'nprogress'; //nprogress module -import 'nprogress/nprogress.css'; -import { useEffect, useState } from 'react'; -import 'react-day-picker/dist/style.css'; -import { EVENT_NAME } from 'sealos-desktop-sdk'; -import { createSealosApp, sealosApp } from 'sealos-desktop-sdk/app'; - -//Binding events. -Router.events.on('routeChangeStart', () => NProgress.start()); -Router.events.on('routeChangeComplete', () => NProgress.done()); -Router.events.on('routeChangeError', () => NProgress.done()); - -// Create a client -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, - retry: false, - cacheTime: 0 - } - } -}); - -function App({ Component, pageProps }: AppProps) { - const router = useRouter(); - const { initSystemEnv } = useEnvStore(); - const { setToken, token } = useSessionStore(); - const { i18n } = useTranslation(); - const { setScreenWidth, setLastRoute } = useGlobalStore(); - const [refresh, setRefresh] = useState(false); - - const { openConfirm, ConfirmChild } = useConfirm({ - title: '跳转提示', - content: '该应用不允许单独使用,点击确认前往 Sealos Desktop 使用。' - }); - - useEffect(() => { - const response = createSealosApp(); - (async () => { - try { - const res = await sealosApp.getSession(); - if (res.token) { - setToken(res.token); - } - } catch (err) { - console.log('App is not running in desktop'); - if (process.env.NODE_ENV === 'development') { - setToken(process.env.NEXT_PUBLIC_MOCK_USER!); - } - } - })(); - return response; - }, []); - - // add resize event - useEffect(() => { - const resize = throttle((e: Event) => { - const documentWidth = document.documentElement.clientWidth || document.body.clientWidth; - setScreenWidth(documentWidth); - }, 200); - window.addEventListener('resize', resize); - const documentWidth = document.documentElement.clientWidth || document.body.clientWidth; - setScreenWidth(documentWidth); - - return () => { - window.removeEventListener('resize', resize); - }; - }, [setScreenWidth]); - - // init - useEffect(() => { - const changeI18n = async (data: any) => { - const lastLang = getLangStore(); - const newLang = data.currentLanguage; - if (lastLang !== newLang) { - i18n?.changeLanguage?.(newLang); - setLangStore(newLang); - setRefresh((state) => !state); - } - }; - - (async () => { - try { - const lang = await sealosApp.getLanguage(); - changeI18n({ - currentLanguage: lang.lng - }); - } catch (error) { - changeI18n({ - currentLanguage: 'zh' - }); - } - })(); - - return sealosApp?.addAppEventListen(EVENT_NAME.CHANGE_I18N, changeI18n); - }, []); - - // record route - useEffect(() => { - return () => { - setLastRoute(router.asPath); - }; - }, [router.pathname]); - - useEffect(() => { - const lang = getLangStore() || 'zh'; - i18n?.changeLanguage?.(lang); - }, [refresh, router.asPath]); - - return ( - <> - - Cloud Virtual Machine - - - - - - - {/*
i18n.changeLanguage(i18n.language === 'zh' ? 'en' : 'zh')}>zh
*/} - - -
-
- - ); -} - -export default appWithTranslation(App); diff --git a/frontend/providers/cloudserver/src/pages/_document.tsx b/frontend/providers/cloudserver/src/pages/_document.tsx deleted file mode 100644 index 5cb7e9e66..000000000 --- a/frontend/providers/cloudserver/src/pages/_document.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Head, Html, Main, NextScript } from 'next/document'; - -export default function Document() { - return ( - - - - - - - - - - - -
- - - - ); -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/create.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/create.ts deleted file mode 100644 index 38e570734..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/create.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { CreateCloudServerPayload, EditForm } from '@/types/cloudserver'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - const form = req.body as EditForm; - - const dataDisks = form.storages - .filter(({ use }) => use === 'DataDisk') - .flatMap(({ size, amount }) => Array(amount).fill(size)); - const systemDiskSize = form.storages.find(({ use }) => use === 'SystemDisk')?.size || 20; - - const payload: CreateCloudServerPayload = { - virtualMachinePackageFamily: form.virtualMachinePackageFamily, - virtualMachinePackageName: form.virtualMachinePackageName, - imageId: form.systemImageId, - systemDisk: systemDiskSize, - dataDisks: dataDisks, - ...(form.publicIpAssigned - ? { - internetMaxBandwidthOut: form.internetMaxBandWidthOut - } - : { internetMaxBandwidthOut: 0 }), - loginPassword: form.password, - loginName: '', - metaData: {}, - zone: form.zone, - virtualMachineType: form.virtualMachineType, - virtualMachineArch: form.virtualMachineArch, - chargeType: form.chargeType, - period: parseInt(form.period), - counts: form.counts - }; - - const { data, error } = await POST('/action/create', payload, { - headers: { - Authorization: req.headers.authorization - } - }); - - if (error) { - return jsonRes(res, { code: 500, error: error }); - } - - return jsonRes(res, { - data: data - }); - } catch (error) { - console.log(error); - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/getRegion.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/getRegion.ts deleted file mode 100644 index 32f74855f..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/getRegion.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - - const { data, error } = await POST( - '/action/get-region-details', - {}, - { - headers: { - Authorization: req.headers.authorization - } - } - ); - - if (error) { - return jsonRes(res, { code: 500, error: error }); - } - - jsonRes(res, { - data: data - }); - } catch (error) { - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/list.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/list.ts deleted file mode 100644 index dfb8bd58b..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/list.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - const { page = 1, pageSize = 10 } = req.body as { - page: number; - pageSize: number; - }; - - const { data, error } = await POST( - '/action/get-virtual-machine-detail-list', - { - page, - pageSize - }, - { - headers: { - Authorization: req.headers.authorization - } - } - ); - - return jsonRes(res, { - data: data || error - }); - } catch (error: any) { - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/listImage.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/listImage.ts deleted file mode 100644 index 77b3bf71e..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/listImage.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - - const { data } = await POST( - '/action/get-image-list', - {}, - { - headers: { - Authorization: req.headers.authorization - } - } - ); - - jsonRes(res, { - data: data - }); - } catch (error) { - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/listType.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/listType.ts deleted file mode 100644 index b29edefea..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/listType.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { CVMChargeType } from '@/types/region'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export type ServerTypePayload = { - zone: string; - virtualMachinePackageFamily: string; - chargeType: CVMChargeType; - virtualMachineType: string; - virtualMachineArch: string; -}; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - - const payload = req.body as ServerTypePayload; - - const { data, error } = await POST('/action/get-virtual-machine-package', payload, { - headers: { - Authorization: req.headers.authorization - } - }); - - if (error) { - return jsonRes(res, { code: 500, error: error }); - } - - jsonRes(res, { - data: data - }); - } catch (error) { - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/price.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/price.ts deleted file mode 100644 index 4c71c1b56..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/price.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { CreateCloudServerPayload, EditForm } from '@/types/cloudserver'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - const form = req.body as EditForm; - - const dataDisks = form.storages - .filter(({ use }) => use === 'DataDisk') - .flatMap(({ size, amount }) => Array(amount).fill(size)); - const systemDiskSize = form.storages.find(({ use }) => use === 'SystemDisk')?.size || 20; - - const payload: CreateCloudServerPayload = { - virtualMachinePackageFamily: form.virtualMachinePackageFamily, - virtualMachinePackageName: form.virtualMachinePackageName, - imageId: form.systemImageId, - systemDisk: systemDiskSize, - dataDisks: dataDisks, - ...(form.publicIpAssigned - ? { - internetMaxBandwidthOut: form.internetMaxBandWidthOut - } - : { internetMaxBandwidthOut: 0 }), - loginPassword: form.password, - loginName: '', - metaData: {}, - zone: form.zone, - virtualMachineType: form.virtualMachineType, - virtualMachineArch: form.virtualMachineArch, - chargeType: form.chargeType, - period: parseInt(form.period), - counts: form.counts - }; - - const result = await POST('/action/get-price', payload, { - headers: { - Authorization: req.headers.authorization - } - }); - - return jsonRes(res, { - data: result?.data - }); - } catch (error) { - jsonRes(res, { code: 500, error: 'error' }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/cloudserver/updateStatus.ts b/frontend/providers/cloudserver/src/pages/api/cloudserver/updateStatus.ts deleted file mode 100644 index 02e188092..000000000 --- a/frontend/providers/cloudserver/src/pages/api/cloudserver/updateStatus.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { verifyAccessToken } from '@/services/backend/auth'; -import { jsonRes } from '@/services/backend/response'; -import { POST } from '@/services/requestLaf'; -import { HandleEnum } from '@/types/cloudserver'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export type UpdateStatusPayload = { - instanceName: string; - handle: HandleEnum; -}; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await verifyAccessToken(req); - const { instanceName, handle } = req.body as UpdateStatusPayload; - - const handleToUrlMap = { - [HandleEnum.Start]: '/action/start', - [HandleEnum.Stop]: '/action/stop', - [HandleEnum.Restart]: '/action/restart', - [HandleEnum.Delete]: '/action/delete' - }; - - const url = handleToUrlMap[handle]; - console.log(url); - - if (!url) { - return jsonRes(res, { - code: 500, - message: 'There is no API corresponding to this operation' - }); - } - - const { data, error } = await POST( - url, - { - instanceName: instanceName - }, - { - headers: { - Authorization: req.headers.authorization - } - } - ); - - if (error) { - return jsonRes(res, { - code: 500, - message: error - }); - } - - return jsonRes(res, { - data: data - }); - } catch (error) { - console.log(error); - jsonRes(res, { code: 500, error: error }); - } -} diff --git a/frontend/providers/cloudserver/src/pages/api/platform/getEnv.ts b/frontend/providers/cloudserver/src/pages/api/platform/getEnv.ts deleted file mode 100644 index 24dee8c5e..000000000 --- a/frontend/providers/cloudserver/src/pages/api/platform/getEnv.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { jsonRes } from '@/services/backend/response'; -import { ApiResp } from '@/services/kubernet'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -export type SystemEnvResponse = { - domain?: string; -}; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - jsonRes(res, { - data: { - domain: process.env.SEALOS_DOMAIN || 'cloud.sealos.io' - } - }); -} diff --git a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/ErrorModal.tsx b/frontend/providers/cloudserver/src/pages/cloudserver/create/components/ErrorModal.tsx deleted file mode 100644 index 1f886603a..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/ErrorModal.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalBody, - ModalCloseButton, - Box -} from '@chakra-ui/react'; -import MyIcon from '@/components/Icon'; - -const ErrorModal = ({ - title, - content, - onClose -}: { - title: string; - content: string; - onClose: () => void; -}) => { - return ( - - - - - - - {title} - - - - - {content} - - - - ); -}; - -export default ErrorModal; diff --git a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Form.tsx b/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Form.tsx deleted file mode 100644 index ad63d1385..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Form.tsx +++ /dev/null @@ -1,950 +0,0 @@ -import { getCloudServerImage, getCloudServerRegion, getCloudServerType } from '@/api/cloudserver'; -import MyIcon from '@/components/Icon'; -import { MyTable, TableColumnsType } from '@/components/MyTable'; -import MyTooltip from '@/components/MyTooltip'; -import { CloudServerStatus, CloudServerType, EditForm, StorageType } from '@/types/cloudserver'; -import { - CVMArchType, - CVMChargeType, - CVMRegionType, - CVMZoneType, - VirtualMachineType -} from '@/types/region'; -import { - Box, - Button, - Center, - Divider, - Flex, - FormControl, - IconButton, - Image, - Input, - ListItem, - Radio, - Skeleton, - Stack, - Switch, - Tab, - TabList, - TabPanel, - TabPanels, - TabPanelsProps, - TabProps, - Tabs, - Text, - UnorderedList, - useDisclosure, - useTheme -} from '@chakra-ui/react'; -import { MySelect, RangeInput, Tabs as SealosTabs } from '@sealos/ui'; -import { useQuery } from '@tanstack/react-query'; -import { customAlphabet } from 'nanoid'; -import { useTranslation } from 'next-i18next'; -import { Dispatch, SetStateAction, useEffect, useMemo, useState } from 'react'; -import { useFieldArray, useFormContext } from 'react-hook-form'; -import { generateRandomPassword } from '@/utils/tools'; - -const tabPanelStyles: TabPanelsProps = { - padding: '0px', - my: '24px' -}; - -const tabStyles: TabProps = { - bg: 'grayModern.50', - _hover: { - opacity: 0.9, - color: 'brightBlue.700', - borderColor: '#85ccff' - }, - border: '1px solid', - borderRadius: '2px', - cursor: 'pointer', - fontWeight: '400', - color: 'grayModern.900', - borderColor: 'grayModern.200', - minW: '160px', - css: { - svg: { - opacity: 0 - } - }, - _selected: { - bg: '#F9FDFE', - borderColor: 'brightBlue.400', - svg: { - opacity: 1, - color: 'brightBlue.600' - } - }, - mr: '8px' -}; - -const Label = ({ - children, - w = 120, - ...props -}: { - children: JSX.Element; - w?: number | 'auto'; - [key: string]: any; -}) => ( - - {children} - -); - -function VirtualMachinePackageTabs({ - virtualMachinePackageFamily -}: { - virtualMachinePackageFamily: string[]; -}) { - const formHook = useFormContext(); - const index = virtualMachinePackageFamily?.findIndex( - (item) => item === formHook?.getValues('virtualMachinePackageFamily') - ); - const { t } = useTranslation(); - - return ( - { - const item = virtualMachinePackageFamily[e]; - formHook?.setValue('virtualMachinePackageFamily', item); - }} - > - - - {virtualMachinePackageFamily?.map((item) => ( - - {t(item)} - - - ))} - - - ); -} - -function VirtualMachineTabs({ virtualMachine }: { virtualMachine: VirtualMachineType[] }) { - const formHook = useFormContext(); - const index = virtualMachine?.findIndex( - (item) => item.virtualMachineType === formHook?.getValues('virtualMachineType') - ); - const { t } = useTranslation(); - - return ( - { - const item = virtualMachine[e]; - formHook?.setValue('virtualMachineType', item.virtualMachineType); - formHook?.setValue('virtualMachinePackageFamily', item.virtualMachinePackageFamily[0]); - }} - > - - - {virtualMachine?.map((item) => ( - - {t(item.virtualMachineType)} - - - ))} - - - {virtualMachine?.map((item) => ( - - - - ))} - - - ); -} - -function ArchTabs({ arch }: { arch: CVMArchType[] }) { - const formHook = useFormContext(); - const index = arch?.findIndex((item) => item.arch === formHook?.getValues('virtualMachineArch')); - const { t } = useTranslation(); - return ( - { - const item = arch[e]; - formHook?.setValue('virtualMachineArch', item.arch); - formHook?.setValue('virtualMachineType', item.virtualMachineType[0].virtualMachineType); - formHook?.setValue( - 'virtualMachinePackageFamily', - item.virtualMachineType[0].virtualMachinePackageFamily[0] - ); - }} - > - - - {arch?.map((item) => ( - - {t(item.arch)} - - - ))} - - - {arch?.map((item) => ( - - - - ))} - - - ); -} - -function ZoneTabs({ zone }: { zone: CVMZoneType[] }) { - const formHook = useFormContext(); - const { t } = useTranslation(); - const index = zone?.findIndex((item) => item.zone === formHook?.getValues('zone')); - - return ( - - - - {zone?.map((item) => ( - { - formHook?.setValue('zone', item.zone); - }} - > - {item.zone} - - - ))} - - - {zone?.map((item) => ( - - - - ))} - - - ); -} - -function OuterTabs({ systemRegion }: { systemRegion: CVMRegionType[] }) { - const formHook = useFormContext(); - const { t } = useTranslation(); - const index = systemRegion?.findIndex( - (item) => item.chargeType === formHook?.getValues('chargeType') - ); - - return ( - { - const item = systemRegion[e]; - formHook?.setValue('chargeType', item.chargeType); - formHook?.setValue('virtualMachineArch', item.zone[0].arch[0].arch); - formHook.setValue( - 'virtualMachineType', - item.zone[0].arch[0].virtualMachineType[0].virtualMachineType - ); - formHook.setValue( - 'virtualMachinePackageFamily', - item.zone[0].arch[0].virtualMachineType[0].virtualMachinePackageFamily[0] - ); - }} - > - - - {systemRegion?.map((item) => ( - - {t(item.chargeType)} - - - ))} - - - {systemRegion?.map((item) => ( - - - - ))} - - - ); -} - -export default function Form({ - refresh, - setInstanceType -}: { - refresh: boolean; - setInstanceType: Dispatch>; -}) { - const formHook = useFormContext(); - if (!formHook) return <>; - const [clientRender, setClientRender] = useState(false); - const { isOpen, onOpen, onClose } = useDisclosure(); - const theme = useTheme(); - const { t } = useTranslation(); - - const specialTips = useMemo(() => { - return { - specialChars: "()`~!@#$%^&*-+=_|{}[]:;'<>,.?/", - regex: - /^(?!.*\s)(?!\/)(?=[^\/]{8,30}$)(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[\(\)`~!@#$%^&*\-+=_|{}\[\]:;'<>,.?/])|(?=.*[a-z])(?=.*[0-9])(?=.*[\(\)`~!@#$%^&*\-+=_|{}\[\]:;'<>,.?/])|(?=.*[A-Z])(?=.*[0-9])(?=.*[\(\)`~!@#$%^&*\-+=_|{}\[\]:;'<>,.?/])).*$/ - }; - }, []); - - useEffect(() => { - setClientRender(true); - }, []); - - const { data: systemRegion } = useQuery(['getCloudServerRegion'], getCloudServerRegion, { - staleTime: 5 * 60 * 1000, - onSuccess(data) { - // set default form - if (data?.[0]?.chargeType) { - formHook.setValue('chargeType', data[0].chargeType); - formHook.setValue('zone', data[0].zone[0].zone); - formHook.setValue('virtualMachineArch', data[0].zone[0].arch[0].arch); - formHook.setValue( - 'virtualMachineType', - data[0].zone[0].arch[0].virtualMachineType[0].virtualMachineType - ); - formHook.setValue( - 'virtualMachinePackageFamily', - data[0].zone[0].arch[0].virtualMachineType[0].virtualMachinePackageFamily[0] - ); - } - } - }); - - const { data: systemImage } = useQuery(['getCloudServerImage'], getCloudServerImage, { - staleTime: 5 * 60 * 1000, - onSuccess(data) { - if (data['ubuntu']) { - formHook.setValue('systemImageId', data['ubuntu'].images[0].id); - formHook.setValue('system', 'ubuntu'); - } - } - }); - - const { data: serverTypeData } = useQuery( - [ - 'getCloudServerType', - formHook.getValues('zone'), - formHook.getValues('virtualMachinePackageFamily'), - formHook.getValues('chargeType'), - formHook.getValues('virtualMachineType'), - formHook.getValues('virtualMachineArch') - ], - () => - getCloudServerType({ - zone: formHook.getValues('zone'), - virtualMachinePackageFamily: formHook.getValues('virtualMachinePackageFamily'), - chargeType: formHook.getValues('chargeType'), - virtualMachineType: formHook.getValues('virtualMachineType'), - virtualMachineArch: formHook.getValues('virtualMachineArch') - }), - { - staleTime: 5 * 60 * 1000, - enabled: !!formHook.getValues('virtualMachinePackageFamily'), - onSuccess(data) { - if (data?.[0]) { - formHook.setValue('virtualMachinePackageName', data[0].virtualMachinePackageName); - setInstanceType(data?.[0]); - } - } - } - ); - - const { - register, - control, - setValue, - getValues, - formState: { errors } - } = formHook; - - const { - fields: storages, - append: appendStorages, - remove: removeStorages, - update: updateStorages - } = useFieldArray({ - control, - name: 'storages' - }); - - const columns = useMemo( - () => [ - { - title: t('Type'), - key: 'Type', - render: (item: CloudServerType, rowNumber, activeId) => { - return ( - - - - {item.virtualMachinePackageName} - {item.status === CloudServerStatus.Unavailable && ( - {t('sold out')} - )} - - - ); - } - }, - { - title: t('CPU'), - render: (item: CloudServerType) => { - return {item.cpu}C; - }, - key: 'cpu' - }, - { - title: t('Memory'), - render: (item: CloudServerType) => { - return {item.memory}GB; - }, - key: 'memory' - }, - { - title: t('GPU'), - dataIndex: 'gpu', - key: 'GPU' - }, - { - title: t('Reference fee'), - key: 'instancePrice', - render: (item: CloudServerType) => { - return ( - - {t('Reference fee tip', { price: item.instancePrice })}/ - {formHook.getValues('chargeType') === CVMChargeType.postPaidByHour - ? t('hour') - : t('month')} - - ); - } - } - ], - [t] - ); - - const storageColumns = useMemo( - () => [ - { - title: t('The purpose of the disk'), - key: 'disk-purpose', - render: (item: StorageType) => { - return {t(item.use)}; - } - }, - { - title: t('capacity'), - key: 'capacity', - render: (item: StorageType, rowNumber) => { - return ( - - { - register(`storages.${rowNumber}.size`, { - required: - t('The number of instances cannot be empty') || - 'The number of instances cannot be empty', - min: { - value: 20, - message: t('The minimum number of instances is 20') - }, - max: { - value: 500, - message: t('The maximum number of instances is 500') - } - }); - setValue(`storages.${rowNumber}.size`, isNaN(val) ? 20 : val); - }} - /> - GiB - - ); - } - }, - { - title: t('Amount'), - key: 'amount', - render: (item: StorageType, rowNumber) => { - return ( - - {rowNumber === 0 ? ( - - 1 - - ) : ( - { - register(`storages.${rowNumber}.amount`, { - required: - t('The number of instances cannot be empty') || - 'The number of instances cannot be empty', - min: { - value: 1, - message: t('The minimum number of instances is 20') - }, - max: { - value: 20, - message: t('The maximum number of instances is 20') - } - }); - setValue(`storages.${rowNumber}.amount`, isNaN(val) ? 1 : val); - }} - /> - )} - - ); - } - }, - { - title: t('Operate'), - key: 'operate', - render: (item, rowNumber) => { - return ( - - {rowNumber === 0 ? ( - - ) : ( - } - aria-label={'button'} - bg={'#FFF'} - onClick={() => removeStorages(rowNumber)} - /> - )} - - ); - } - } - ], - [getValues, register, removeStorages, setValue, t] - ); - - const monthsArray = useMemo(() => { - const months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 36]; - return months.map((month) => { - let label; - if (month < 12) { - label = `${month} ${t('indivual')} ${t('month')}`; - } else if (month === 12) { - label = `1${t('year')}`; - } else { - const years = Math.floor(month / 12); - const remainingMonths = month % 12; - label = - remainingMonths === 0 - ? `${years} ${t('year')}` - : `${years} ${t('year')}${remainingMonths} ${t('indivual')} ${t('month')}`; - } - return { - value: month.toString(), - label: label - }; - }); - }, [t]); - - return ( - - - - - {t('Basic Config')} - - - - - - - - {serverTypeData ? ( - ({ - ...item, - isOptional: item.status === CloudServerStatus.Available ? true : false - }))} - openSelected - onRowClick={(item: CloudServerType) => { - setValue('virtualMachinePackageName', item.virtualMachinePackageName); - setValue('virtualMachinePackageFamily', item.virtualMachinePackageFamily); - setInstanceType(item); - }} - /> - ) : ( - - - - )} - - - {/* systemImage */} - - - - - {systemImage && - Object.keys(systemImage)?.map((key) => { - return ( -
{ - setValue('system', key); - setValue('systemImageId', systemImage[key].images[0].id); - }} - > - {key} - - {key} - -
- ); - })} -
- - { - return { - value: item.id, - label: `${item.os} | ${item.version} | ${item.architect}` - }; - }) - : [] - } - onchange={(id: string) => { - setValue('systemImageId', id); - formHook.clearErrors(); - }} - {...formHook.register('systemImageId', { - required: { value: true, message: '必须选择系统镜像' } - })} - /> - - {t('Supports changing the operating system')} - -
-
- - {/* systemStorage */} - - - {clientRender && ( - - - - - )} - - - - - - - {t('Assign Public IP')} - { - setValue('publicIpAssigned', e.target.checked); - }} - /> - - - {t('publicIpAssigned tips')} - - - - {getValues('publicIpAssigned') && ( - - - {t('BandWidth')} - - {t('Bandwidth by hour')} - - - { - register('internetMaxBandWidthOut', { - required: - t('The number of instances cannot be empty') || - 'The number of instances cannot be empty', - min: { - value: 1, - message: t('The minimum number of instances is 1') - }, - max: { - value: 100, - message: t('The maximum number of instances is 100') - } - }); - setValue('internetMaxBandWidthOut', isNaN(val) ? 1 : val); - }} - /> - Mbps - - )} - - - - { - if (val === 'self') { - setValue('autoPassword', false); - setValue('password', ''); - } else { - setValue('autoPassword', true); - setValue('password', generateRandomPassword()); - } - }} - /> - - {getValues('autoPassword') ? ( - <> - ) : ( - - - - {t('Within 8 to 30 characters')} - {t('cannot contain spaces')} - {t('Cannot start with')} - {t('Contains at least three of these')} - - {t('Lowercase letters az')} - {t('Capital letters az')} - {t('Numbers 09')} - {specialTips.specialChars} - - -
- } - > - - - - - - )} - - - {formHook.getValues('chargeType') === CVMChargeType.prePaid && ( - - - - { - setValue('period', id); - formHook.clearErrors(); - }} - /> - - - )} - - - - - { - register('counts', { - required: - t('The number of instances cannot be empty') || - 'The number of instances cannot be empty', - min: { - value: 1, - message: t('The minimum number of instances is 1') - }, - max: { - value: 12, - message: t('The maximum number of instances is 12') - } - }); - setValue('counts', isNaN(val) ? 1 : val); - }} - /> - - - - - ); -} diff --git a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Header.tsx b/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Header.tsx deleted file mode 100644 index d1d99ff86..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudserver/create/components/Header.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import MyIcon from '@/components/Icon'; -import { useGlobalStore } from '@/store/global'; -import { CloudServerPrice, CloudServerType } from '@/types/cloudserver'; -import { - Box, - Button, - Center, - Divider, - Flex, - Popover, - PopoverContent, - PopoverTrigger, - Text -} from '@chakra-ui/react'; -import { Decimal } from 'decimal.js'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; - -export const priceItemStyle = { - alignItems: 'center', - py: '4px', - px: '6px', - borderRadius: 'base', - _hover: { - bg: 'grayModern.100' - } -}; - -export const CostTipContent = ({ - prices, - instanceType, - isMonth, - isModalTip -}: { - isMonth: boolean; - prices?: CloudServerPrice; - instanceType?: CloudServerType; - isModalTip?: boolean; -}) => { - const { t } = useTranslation(); - - return ( - - {prices && isModalTip && ( - <> - - - - {t('After the annual and monthly cloud hosting is sold')} - - {t('No refund allowed')} - - {t('Pay Confirm tips')} - - - - - {t('total')} - - - - ¥ - {new Decimal(prices?.diskPrice) - .plus(new Decimal(prices?.instancePrice)) - .plus(new Decimal(prices?.networkPrice)) - .toNumber()} - - - - )} - - {t('Configuration fee details')} - - - - - {t('Instance')} - - ¥{prices?.instancePrice} - {!isMonth && `/${t('hour')}`} - - - - - - {t('storage fees')} - - - ¥{prices?.diskPrice} - {!isMonth && `/${t('hour')}`} - - - - - - {t('Public network bandwidth')} - - - ¥{prices?.networkPrice} - {!isMonth && `/${t('hour')}`} - - - - - {/* Billing rules */} - - {t('Billing rules')} - - - - - - {t('Storage')} - - - {t('Reference fee disk tips', { price: instanceType?.diskPerG })}/ - {isMonth ? t('month') : t('hour')} - - - - - {t('BandWidth')} - - - - {t('interval')} - {t('price')} - - {instanceType?.bandwidthPricingTiers.map((item, index) => { - return ( - - {`(${item.minBandwidth} , ${ - item.maxBandwidth === null ? '∞' : item.maxBandwidth - }]`} - - {t('Reference fee bandwidth tips', { price: item.pricePerMbps })}/ - {isMonth ? t('month') : t('hour')} - - - ); - })} - - - - - ); -}; - -const Header = ({ - title, - applyCb, - applyBtnText, - prices, - instanceType, - isMonth -}: { - isMonth: boolean; - title: string; - applyCb: () => void; - applyBtnText: string; - prices?: CloudServerPrice; - instanceType?: CloudServerType; -}) => { - const { t } = useTranslation(); - const router = useRouter(); - const { lastRoute } = useGlobalStore(); - - return ( - - router.replace(lastRoute)}> - - - {t(title)} - - - -
- {prices ? ( - - - - - {t('Reference fee')} - - - - - ¥ - {new Decimal(prices?.diskPrice) - .plus(new Decimal(prices?.instancePrice)) - .plus(new Decimal(prices?.networkPrice)) - .toNumber()} - - - - - - - - ) : ( - - {t('Fee inquiry in progress')} - - )} -
- -
- ); -}; - -export default Header; diff --git a/frontend/providers/cloudserver/src/pages/cloudserver/create/index.tsx b/frontend/providers/cloudserver/src/pages/cloudserver/create/index.tsx deleted file mode 100644 index 7040f0652..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudserver/create/index.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { createCloudServer, getCloudServerPrice } from '@/api/cloudserver'; -import { useConfirm } from '@/hooks/useConfirm'; -import { useLoading } from '@/hooks/useLoading'; -import { useToast } from '@/hooks/useToast'; -import { useGlobalStore } from '@/store/global'; -import { CloudServerType, EditForm } from '@/types/cloudserver'; -import { CVMChargeType } from '@/types/region'; -import { serviceSideProps } from '@/utils/i18n'; -import { Box, Flex } from '@chakra-ui/react'; -import { useQuery } from '@tanstack/react-query'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { useCallback, useState } from 'react'; -import { FormProvider, useForm } from 'react-hook-form'; -import ErrorModal from './components/ErrorModal'; -import Form from './components/Form'; -import Header, { CostTipContent } from './components/Header'; -import { generateRandomPassword } from '@/utils/tools'; - -export default function EditOrder() { - const [errorMessage, setErrorMessage] = useState(''); - const { t } = useTranslation(); - const { toast } = useToast(); - const { Loading, setIsLoading } = useLoading(); - const router = useRouter(); - const [forceUpdate, setForceUpdate] = useState(false); - const { lastRoute } = useGlobalStore(); - const [instanceType, setInstanceType] = useState(); - - // form - const formHook = useForm({ - defaultValues: { - system: 'ubuntu', - publicIpAssigned: false, - internetMaxBandWidthOut: 1, - storages: [ - { - use: 'SystemDisk', - size: 50, - amount: 1 - } - ], - systemImageId: '', - period: '1', - counts: 1, - autoPassword: true, - password: generateRandomPassword() - // chargeType: CVMChargeType.postPaidByHour, - // zone: 'Guangzhou-6', - // virtualMachineArch: 'x86_64', - // virtualMachineType: 'costEffective', - // virtualMachinePackageFamily: 'A' - } - }); - - // watch form change, compute new yaml - formHook.watch((data: any) => { - setForceUpdate(!forceUpdate); - }); - - const { data: prices } = useQuery( - ['getCloudServerPrice', forceUpdate], - () => { - const temp = formHook.getValues(); - return getCloudServerPrice(temp); - }, - { - enabled: !!formHook.getValues('virtualMachinePackageName') - } - ); - - const submitSuccess = async (data: EditForm) => { - console.log(data); - setIsLoading(true); - try { - await createCloudServer(data); - toast({ - status: 'success', - title: 'success' - }); - router.push(lastRoute); - } catch (error) { - console.error(error); - setErrorMessage(JSON.stringify(error)); - } - setIsLoading(false); - }; - - const submitError = useCallback(() => { - const deepSearch = (obj: any): string => { - if (!obj || typeof obj !== 'object') return t('Submit Error'); - if (!!obj.message) { - return obj.message; - } - return deepSearch(Object.values(obj)[0]); - }; - - toast({ - title: deepSearch(formHook.formState.errors), - status: 'error', - position: 'top', - duration: 3000, - isClosable: true - }); - }, [formHook.formState.errors, t, toast]); - - const { openConfirm, ConfirmChild } = useConfirm({ - content: ( - - {formHook.getValues('chargeType') === CVMChargeType.prePaid ? ( - - ) : ( - {t('Are you sure to create a cloud host?')} - )} - - ) - }); - - return ( - -
{ - formHook.handleSubmit((data) => openConfirm(() => submitSuccess(data))(), submitError)(); - // openConfirm()(); - }} - applyBtnText="Submit" - /> - - -
- - - - - {!!errorMessage && ( - setErrorMessage('')} /> - )} - - ); -} - -export async function getServerSideProps(context: any) { - return { - props: { ...(await serviceSideProps(context)) } - }; -} diff --git a/frontend/providers/cloudserver/src/pages/cloudservers/components/DelModal.tsx b/frontend/providers/cloudserver/src/pages/cloudservers/components/DelModal.tsx deleted file mode 100644 index 05a66a169..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudservers/components/DelModal.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { - Box, - Button, - Input, - Modal, - ModalBody, - ModalCloseButton, - ModalContent, - ModalFooter, - ModalHeader, - ModalOverlay -} from '@chakra-ui/react'; -import { useCallback, useState } from 'react'; -import { updateCloudServerStatus } from '@/api/cloudserver'; -import { HandleEnum } from '@/types/cloudserver'; -import { useMessage } from '@sealos/ui'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; - -const DelModal = ({ - appName, - onClose, - onSuccess -}: { - appName: string; - onClose: () => void; - onSuccess: () => void; -}) => { - const { t } = useTranslation(); - const [inputValue, setInputValue] = useState(''); - const [loading, setLoading] = useState(false); - const { message: toast } = useMessage(); - const router = useRouter(); - - const handleDelApp = useCallback(async () => { - try { - setLoading(true); - await updateCloudServerStatus({ - instanceName: appName, - handle: HandleEnum.Delete - }); - toast({ - title: `${t('success')}`, - status: 'success' - }); - onSuccess(); - onClose(); - } catch (error: any) { - toast({ - title: typeof error === 'string' ? error : error.message || '删除出现了意外', - status: 'error' - }); - console.error(error); - } - setLoading(false); - }, [appName, toast, t, onSuccess, onClose]); - - return ( - - - - {t('Deletion warning')} - - - - {t('delete cloud server tip')} - - {t('Please enter')}{' '} - - {appName} - {' '} - {t('Confirm')} - - - - setInputValue(e.target.value)} - /> - - - - - - - - ); -}; - -export default DelModal; diff --git a/frontend/providers/cloudserver/src/pages/cloudservers/components/List.tsx b/frontend/providers/cloudserver/src/pages/cloudservers/components/List.tsx deleted file mode 100644 index 97c1cf347..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudservers/components/List.tsx +++ /dev/null @@ -1,284 +0,0 @@ -import { updateCloudServerStatus } from '@/api/cloudserver'; -import AppStatusTag from '@/components/AppStatusTag'; -import MyIcon from '@/components/Icon'; -import { CVMInstanceType, HandleEnum } from '@/types/cloudserver'; -import { formatTime } from '@/utils/tools'; -import { Box, Button, Center, Flex, FlexProps, MenuButton, Text } from '@chakra-ui/react'; -import { LogoutIcon, MyTable, SealosMenu, useMessage } from '@sealos/ui'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { useCallback, useMemo, useState } from 'react'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import DelModal from './DelModal'; -import { useConfirm } from '@/hooks/useConfirm'; -import { useCopyData } from '@/hooks/useCopyData'; -import { IntermediatePhases, IntermediateStates, PhaseEnum } from '@/types/cloudserver'; - -const OrderList = ({ apps = [], refetchApps }: { apps: any[]; refetchApps: () => void }) => { - const router = useRouter(); - const { t } = useTranslation(); - const { message: toast } = useMessage(); - const { copyData } = useCopyData(); - const [delAppName, setDelAppName] = useState(''); - - const { openConfirm, ConfirmChild } = useConfirm({ - content: t('close cloud server tip') - }); - - const handleWorkOrder = useCallback( - async (id: string, method: HandleEnum) => { - try { - await updateCloudServerStatus({ - instanceName: id, - handle: method - }); - toast({ - title: `success`, - status: 'success' - }); - } catch (error: any) { - toast({ - status: 'error', - title: error?.message - }); - } - refetchApps(); - }, - [refetchApps, toast] - ); - - const columns = useMemo< - { - title: string; - dataIndex?: keyof CVMInstanceType; - key: string; - render?: (item: any) => JSX.Element; - ItemStyle?: FlexProps; - }[] - >( - () => [ - { - title: t('Name'), - key: 'name', - render: (item: CVMInstanceType) => { - return ( - - {item.instanceName} - - ); - }, - ItemStyle: { - pl: '28px' - } - }, - { - title: t('Status'), - key: 'status', - render: (item: CVMInstanceType) => - }, - { - title: t('Create Time'), - key: 'createTime', - render: (item: any) => { - return ( - {formatTime(item.createTime, 'YYYY-MM-DD HH:mm')} - ); - } - }, - { - title: t('CPU'), - key: 'CPU', - dataIndex: 'cpu' - }, - { - title: t('Memory'), - key: 'Memory', - dataIndex: 'memory' - }, - { - title: t('sshName'), - key: 'sshName', - dataIndex: 'loginName' - }, - { - title: t('sshPassword'), - key: 'sshPassword', - render: (item: CVMInstanceType) => { - return ( - copyData(item.loginPassword)} - height={'12px'} - > - *********** - - - ); - } - }, - { - title: t('ssh port'), - key: 'ssh port', - dataIndex: 'loginPort' - }, - { - title: t('IP Address'), - key: 'IP-address', - render: (item: CVMInstanceType) => { - return ( - -
copyData(item?.privateIpAddresses?.join(',') || '')} - > - {item?.privateIpAddresses?.join(',')}(内) - -
- {item?.publicIpAddresses ? ( -
copyData(item?.publicIpAddresses?.join(',') || '')} - > - {item?.publicIpAddresses?.join(',')}(公) - -
- ) : ( - {t('Public IP is not enabled')} - )} -
- ); - } - }, - - { - title: t('Operation'), - key: 'control', - render: (item: CVMInstanceType) => ( - - - - - } - menuList={[ - { - child: ( - <> - - {t('Start')} - - ), - menuItemStyle: { - isDisabled: - IntermediatePhases.includes(item.phase) || - IntermediateStates.includes(item.state) || - item.phase === PhaseEnum.Started - }, - onClick: () => handleWorkOrder(item.instanceName, HandleEnum.Start) - }, - { - child: ( - <> - - {t('terminal')} - - ), - menuItemStyle: { - isDisabled: item.phase !== PhaseEnum.Started - }, - onClick: () => { - copyData( - item.loginPassword, - t('Password copied to clipboard') || 'Password copied to clipboard', - { - duration: 2000 - } - ); - const defaultCommand = `ssh ${item.loginName}@${item.privateIpAddresses}`; - console.log(defaultCommand); - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-terminal', - query: { - defaultCommand - }, - messageData: { type: 'new terminal', command: defaultCommand }, - appSize: 'maxmin' - }); - } - }, - { - child: ( - <> - - {t('ReStart')} - - ), - menuItemStyle: { - isDisabled: - IntermediatePhases.includes(item.phase) || - IntermediateStates.includes(item.state) || - item.phase !== PhaseEnum.Started - }, - onClick: () => handleWorkOrder(item.instanceName, HandleEnum.Restart) - }, - { - child: ( - <> - - {t('Stop')} - - ), - menuItemStyle: { - isDisabled: - IntermediatePhases.includes(item.phase) || - IntermediateStates.includes(item.state) || - item.phase !== PhaseEnum.Started - }, - onClick: openConfirm(() => handleWorkOrder(item.instanceName, HandleEnum.Stop)) - }, - { - child: ( - <> - - {t('Delete')} - - ), - menuItemStyle: { - _hover: { - color: 'red.600', - bg: 'rgba(17, 24, 36, 0.05)' - }, - isDisabled: - IntermediatePhases.includes(item.phase) || - IntermediateStates.includes(item.state) || - item.phase !== PhaseEnum.Stopped - }, - onClick: () => setDelAppName(item.instanceName) - } - ]} - /> - - ) - } - ], - [copyData, handleWorkOrder, openConfirm, t] - ); - - return ( - <> - - {!!delAppName && ( - setDelAppName('')} onSuccess={refetchApps} /> - )} - - - ); -}; - -export default OrderList; diff --git a/frontend/providers/cloudserver/src/pages/cloudservers/index.tsx b/frontend/providers/cloudserver/src/pages/cloudservers/index.tsx deleted file mode 100644 index fa4fa3c0a..000000000 --- a/frontend/providers/cloudserver/src/pages/cloudservers/index.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import MyIcon from '@/components/Icon'; -import Pagination from '@/components/Pagination'; -import { useLoading } from '@/hooks/useLoading'; -import useStore from '@/hooks/useStore'; -import useSessionStore from '@/store/session'; -import { serviceSideProps } from '@/utils/i18n'; -import { Box, Button, Flex, Image } from '@chakra-ui/react'; -import { useQuery } from '@tanstack/react-query'; -import { useTranslation } from 'next-i18next'; -import router from 'next/router'; -import { useState } from 'react'; -import List from './components/List'; -import { MockInstance } from '@/constants/vm'; -import { listCloudServer } from '@/api/cloudserver'; - -function Home() { - const { Loading } = useLoading(); - const { t } = useTranslation(); - const [initialized, setInitialized] = useState(false); - const [page, setPage] = useState(1); - const [pageSize, setPageSize] = useState(10); - const [startTime, setStartTime] = useState(() => { - const currentDate = new Date(); - currentDate.setMonth(currentDate.getMonth() - 1); - return currentDate; - }); - const [endTime, setEndTime] = useState(new Date()); - const user = useStore(useSessionStore, (state) => state.session?.user); - - const { data, refetch } = useQuery( - ['listCloudServer', page, pageSize], - () => - listCloudServer({ - page, - pageSize - }), - { - refetchInterval: 3000, - onSettled() { - setInitialized(true); - } - } - ); - - return ( - - - - logo - - - {t('Cloud host list')} - - - ({data?.total}) - - - - - - {data?.list && data?.list?.length > 0 ? ( - - - - ) : ( - - - {t('Empty List')} - - - )} - - {!!data?.total && ( - - )} - - ); -} - -export async function getServerSideProps(content: any) { - return { - props: { - ...(await serviceSideProps(content)) - } - }; -} - -export default Home; diff --git a/frontend/providers/cloudserver/src/services/backend/auth.ts b/frontend/providers/cloudserver/src/services/backend/auth.ts deleted file mode 100644 index 4b99a0690..000000000 --- a/frontend/providers/cloudserver/src/services/backend/auth.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DesktopTokenPayload } from '@/types/user'; -import { verify } from 'jsonwebtoken'; -import type { NextApiRequest } from 'next'; -import { ERROR_ENUM } from '../error'; - -const appJwtSecret = (process.env.JWT_SECRET_APP as string) || '123456789'; - -export const verifyAccessToken = async (req: NextApiRequest) => { - if (!req.headers) return Promise.reject(ERROR_ENUM.unAuthorization); - const { authorization } = req.headers; - if (!authorization) return Promise.reject(ERROR_ENUM.unAuthorization); - return verifyDesktopToken(authorization); -}; - -export const verifyDesktopToken: (token: string) => Promise = (token) => - new Promise((resolve, reject) => { - verify(token, appJwtSecret, (err, payload) => { - if (err) { - reject(err); - } else if (!payload) { - reject('payload is null'); - } else { - resolve(payload as DesktopTokenPayload); - } - }); - }); diff --git a/frontend/providers/cloudserver/src/services/backend/kubernetes.ts b/frontend/providers/cloudserver/src/services/backend/kubernetes.ts deleted file mode 100644 index 02f6e133a..000000000 --- a/frontend/providers/cloudserver/src/services/backend/kubernetes.ts +++ /dev/null @@ -1,276 +0,0 @@ -import * as k8s from '@kubernetes/client-node'; -import * as yaml from 'js-yaml'; - -export function K8sApiDefault(): k8s.KubeConfig { - const kc = new k8s.KubeConfig(); - kc.loadFromDefault(); - return kc; -} - -export function CheckIsInCluster(): [boolean, string] { - if ( - process.env.KUBERNETES_SERVICE_HOST !== undefined && - process.env.KUBERNETES_SERVICE_HOST !== '' && - process.env.KUBERNETES_SERVICE_PORT !== undefined && - process.env.KUBERNETES_SERVICE_PORT !== '' - ) { - return [ - true, - 'https://' + process.env.KUBERNETES_SERVICE_HOST + ':' + process.env.KUBERNETES_SERVICE_PORT - ]; - } - return [false, '']; -} - -/* init api */ -export function K8sApi(config = ''): k8s.KubeConfig { - const kc = new k8s.KubeConfig(); - config ? kc.loadFromString(config) : kc.loadFromCluster(); - - const cluster = kc.getCurrentCluster(); - - if (cluster !== null) { - let server: k8s.Cluster; - - const [inCluster, hosts] = CheckIsInCluster(); - if (inCluster && hosts !== '') { - server = { - name: cluster.name, - caData: cluster.caData, - caFile: cluster.caFile, - server: hosts, - skipTLSVerify: cluster.skipTLSVerify - }; - } else { - server = { - name: cluster.name, - caData: cluster.caData, - caFile: cluster.caFile, - server: 'https://apiserver.cluster.local:6443', - skipTLSVerify: cluster.skipTLSVerify - }; - } - kc.clusters.forEach((item, i) => { - if (item.name === cluster.name) { - kc.clusters[i] = server; - } - }); - } - - return kc; -} - -export type CRDMeta = { - group: string; // group - version: string; // version - namespace: string; // namespace - plural: string; // type -}; - -export async function createYaml( - kc: k8s.KubeConfig, - specs: k8s.KubernetesObject[] -): Promise { - const client = k8s.KubernetesObjectApi.makeApiClient(kc); - const validSpecs = specs.filter((s) => s && s.kind && s.metadata); - const created = [] as k8s.KubernetesObject[]; - - try { - for (const spec of validSpecs) { - spec.metadata = spec.metadata || {}; - spec.metadata.annotations = spec.metadata.annotations || {}; - delete spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration']; - spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration'] = - JSON.stringify(spec); - console.log('create yaml: ', spec.kind); - const response = await client.create(spec); - created.push(response.body); - } - } catch (error: any) { - console.log('create error'); - /* delete success specs */ - for (const spec of created) { - try { - console.log('delete:', spec.kind); - client.delete(spec); - } catch (error) { - error; - } - } - // console.error(error, '<=create error') - return Promise.reject(error); - } - return created; -} - -export async function updateYaml( - kc: k8s.KubeConfig, - specs: k8s.KubernetesObject[], - canCreate = false -): Promise { - const client = k8s.KubernetesObjectApi.makeApiClient(kc); - const validSpecs = specs.filter((s) => s && s.kind && s.metadata); - const created = [] as k8s.KubernetesObject[]; - - try { - for (const spec of validSpecs) { - spec.metadata = spec.metadata || {}; - spec.metadata.annotations = spec.metadata.annotations || {}; - delete spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration']; - spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration'] = - JSON.stringify(spec); - - console.log('update yaml: ', spec.kind); - const response = await client.create(spec); - created.push(response.body); - } - } catch (error: any) { - /* delete success specs */ - for (const spec of validSpecs) { - try { - console.log('delete:', spec.kind); - await client.delete(spec); - } catch (error) { - error; - } - } - if (error.body.reason === 'AlreadyExists' && canCreate) { - return updateYaml(kc, specs); - } - return Promise.reject(error); - } - return created; -} - -export async function replaceYaml( - kc: k8s.KubeConfig, - specs: k8s.KubernetesObject[] -): Promise { - const client = k8s.KubernetesObjectApi.makeApiClient(kc); - const validSpecs = specs.filter((s) => s && s.kind && s.metadata); - const succeed = [] as k8s.KubernetesObject[]; - - for (const spec of validSpecs) { - spec.metadata = spec.metadata || {}; - spec.metadata.annotations = spec.metadata.annotations || {}; - delete spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration']; - spec.metadata.annotations['kubectl.kubernetes.io/last-applied-configuration'] = - JSON.stringify(spec); - - try { - // @ts-ignore - const { body } = await client.read(spec); - console.log('replace yaml: ', spec.kind); - // update resource - const response = await client.replace({ - ...spec, - metadata: { - ...spec.metadata, - resourceVersion: body.metadata?.resourceVersion - } - }); - succeed.push(response.body); - } catch (e: any) { - // console.error(e?.body || e, "<=replace error") - // no yaml, create it - if (e?.body?.code && +e?.body?.code === 404) { - try { - console.log('create yaml: ', spec.kind); - const response = await client.create(spec); - succeed.push(response.body); - } catch (error: any) { - // console.error(error, '<=create error') - return Promise.reject(error); - } - } else { - return Promise.reject(e); - } - } - } - return succeed; -} - -export async function delYaml(kc: k8s.KubeConfig, specs: k8s.KubernetesObject[]) { - const client = k8s.KubernetesObjectApi.makeApiClient(kc); - const validSpecs = specs.filter((s) => s && s.kind && s.metadata); - - try { - for (const spec of validSpecs) { - console.log('delete:', spec.kind); - client.delete(spec); - } - } catch (error: any) { - // console.error(error, '<=create error') - return Promise.reject(error); - } -} - -export function GetUserDefaultNameSpace(user: string): string { - return 'ns-' + user; -} - -export async function getK8s({ kubeconfig }: { kubeconfig: string }) { - const kc = K8sApi(kubeconfig); - const kube_user = kc.getCurrentUser(); - const client = k8s.KubernetesObjectApi.makeApiClient(kc); - - if (kube_user === null) { - return Promise.reject('用户不存在'); - } - - const namespace = GetUserDefaultNameSpace(kube_user.name); - - const applyYamlList = async (yamlList: string[], type: 'create' | 'replace' | 'update') => { - // insert namespace - const formatYaml: k8s.KubernetesObject[] = yamlList - .map((item) => yaml.loadAll(item)) - .flat() - .map((item: any) => { - if (item.metadata) { - item.metadata.namespace = namespace; - } - return item; - }); - - if (type === 'create') { - return createYaml(kc, formatYaml); - } else if (type === 'replace') { - return replaceYaml(kc, formatYaml); - } else if (type === 'update') { - return updateYaml(kc, formatYaml, true); - } - return createYaml(kc, formatYaml); - }; - - const delYamlList = (yamlList: string[]) => { - // insert namespace - const formatYaml: k8s.KubernetesObject[] = yamlList - .map((item) => yaml.loadAll(item)) - .flat() - .map((item: any) => { - if (item.metadata) { - item.metadata.namespace = namespace; - } - return item; - }); - return delYaml(kc, formatYaml); - }; - - return Promise.resolve({ - kc, - apiClient: client, - k8sCore: kc.makeApiClient(k8s.CoreV1Api), - k8sApp: kc.makeApiClient(k8s.AppsV1Api), - k8sAutoscaling: kc.makeApiClient(k8s.AutoscalingV2Api), - k8sNetworkingApp: kc.makeApiClient(k8s.NetworkingV1Api), - k8sCustomObjects: kc.makeApiClient(k8s.CustomObjectsApi), - k8sEvents: kc.makeApiClient(k8s.EventsV1Api), - k8sAuth: kc.makeApiClient(k8s.RbacAuthorizationV1Api), - k8sBatch: kc.makeApiClient(k8s.BatchV1Api), - metricsClient: new k8s.Metrics(kc), - kube_user, - namespace, - applyYamlList, - delYamlList - }); -} diff --git a/frontend/providers/cloudserver/src/services/backend/response.ts b/frontend/providers/cloudserver/src/services/backend/response.ts deleted file mode 100644 index e2082cf61..000000000 --- a/frontend/providers/cloudserver/src/services/backend/response.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { NextApiResponse } from 'next'; -import { ERROR_RESPONSE } from '../error'; - -export const jsonRes = ( - res: NextApiResponse, - props?: { - code?: number; - message?: string; - data?: T; - error?: any; - } -) => { - const { code = 200, message = '', data = null, error } = props || {}; - - // Specified error - if (typeof error === 'string' && ERROR_RESPONSE[error]) { - return res.json(ERROR_RESPONSE[error]); - } - - // another error - let msg = message; - if ((code < 200 || code >= 400) && !message) { - msg = error?.body?.message || error?.message || '请求错误'; - if (typeof error === 'string') { - msg = error; - } - console.log('===error===\n', error?.body || error); - } - - res.json({ - code, - statusText: '', - message: msg, - data: data || error || null - }); -}; diff --git a/frontend/providers/cloudserver/src/services/db/mongodb.ts b/frontend/providers/cloudserver/src/services/db/mongodb.ts deleted file mode 100644 index 4002b3621..000000000 --- a/frontend/providers/cloudserver/src/services/db/mongodb.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { MongoClient } from 'mongodb'; - -export async function connectToDatabase() { - if (global.mongodb) { - return global.mongodb; - } - const uri = process.env.MONGODB_URI || ''; - global.mongodb = new MongoClient(uri); - // global.mongodb = 'connecting'; - try { - global.mongodb.on('error', (err) => { - global.mongodb = null; - }); - global.mongodb.on('close', () => { - global.mongodb = null; - }); - await global.mongodb.connect(); - return global.mongodb; - } catch (error) { - console.log('error->', 'mongo connect error'); - global.mongodb = null; - return Promise.reject(error); - } -} diff --git a/frontend/providers/cloudserver/src/services/error.ts b/frontend/providers/cloudserver/src/services/error.ts deleted file mode 100644 index 058cfe09b..000000000 --- a/frontend/providers/cloudserver/src/services/error.ts +++ /dev/null @@ -1,19 +0,0 @@ -export enum ERROR_ENUM { - unAuthorization = 'unAuthorization' -} - -export const ERROR_RESPONSE: Record< - any, - { - code: number; - statusText: string; - message: string; - data?: any; - } -> = { - [ERROR_ENUM.unAuthorization]: { - code: 403, - statusText: ERROR_ENUM.unAuthorization, - message: '凭证错误' - } -}; diff --git a/frontend/providers/cloudserver/src/services/kubernet.ts b/frontend/providers/cloudserver/src/services/kubernet.ts deleted file mode 100644 index 48413378f..000000000 --- a/frontend/providers/cloudserver/src/services/kubernet.ts +++ /dev/null @@ -1,50 +0,0 @@ -export interface ApiResp { - code: number; - message: string; - data?: T; -} - -export const isApiResp = (x: any): x is ApiResp => - typeof x.code === 'number' && typeof x.message === 'string'; - -export const showStatus = (status: number) => { - let message = ''; - switch (status) { - case 400: - message = '请求错误(400)'; - break; - case 401: - message = '未授权,请重新登录(401)'; - break; - case 403: - message = '拒绝访问(403)'; - break; - case 404: - message = '请求出错(404)'; - break; - case 408: - message = '请求超时(408)'; - break; - case 500: - message = '服务器错误(500)'; - break; - case 501: - message = '服务未实现(501)'; - break; - case 502: - message = '网络错误(502)'; - break; - case 503: - message = '服务不可用(503)'; - break; - case 504: - message = '网络超时(504)'; - break; - case 505: - message = 'HTTP版本不受支持(505)'; - break; - default: - message = `连接出错(${status})!`; - } - return `${message},请检查网络或联系管理员!`; -}; diff --git a/frontend/providers/cloudserver/src/services/request.ts b/frontend/providers/cloudserver/src/services/request.ts deleted file mode 100644 index 5c9952e10..000000000 --- a/frontend/providers/cloudserver/src/services/request.ts +++ /dev/null @@ -1,95 +0,0 @@ -import useSessionStore from '@/store/session'; -import axios, { - AxiosHeaders, - AxiosRequestConfig, - AxiosResponse, - InternalAxiosRequestConfig -} from 'axios'; -import type { ApiResp } from './kubernet'; -import { isApiResp, showStatus } from './kubernet'; -import { getUserToken } from '@/utils/user'; - -const request = axios.create({ - baseURL: '/', - withCredentials: true, - timeout: 60000 -}); - -// request interceptor -request.interceptors.request.use( - (config: InternalAxiosRequestConfig) => { - let _headers: AxiosHeaders = config.headers; - _headers['Authorization'] = getUserToken(); - - if (!config.headers || config.headers['Content-Type'] === '') { - _headers['Content-Type'] = 'application/json'; - } - - config.headers = _headers; - return config; - }, - (error: any) => { - error.data = {}; - error.data.msg = 'Server abnormality, please contact the administrator!'; - return Promise.resolve(error); - } -); - -// response interceptor -request.interceptors.response.use( - (response: AxiosResponse) => { - const { status, data } = response; - - if (status < 200 || status >= 300 || !isApiResp(data)) { - return Promise.reject( - status + ':' + showStatus(status) + ', ' + typeof data === 'string' ? data : String(data) - ); - } - - const apiResp = data as ApiResp; - if (apiResp.code < 200 || apiResp.code >= 400) { - return Promise.reject(apiResp); - } - - response.data = apiResp.data; - return response.data; - }, - (error: any) => { - if (axios.isCancel(error)) { - return Promise.reject('cancel request' + String(error)); - } else { - error.errMessage = 'Server abnormality, please contact the administrator!'; - } - return Promise.reject(error); - } -); - -export function GET( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.get(url, { - params: data, - ...config - }); -} - -export function POST( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.post(url, data, config); -} - -export function DELETE( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.delete(url, { - params: data, - ...config - }); -} diff --git a/frontend/providers/cloudserver/src/services/requestLaf.ts b/frontend/providers/cloudserver/src/services/requestLaf.ts deleted file mode 100644 index c895fe4a8..000000000 --- a/frontend/providers/cloudserver/src/services/requestLaf.ts +++ /dev/null @@ -1,80 +0,0 @@ -import axios, { - AxiosHeaders, - AxiosRequestConfig, - AxiosResponse, - InternalAxiosRequestConfig -} from 'axios'; - -/** - * token from app headers improtant - * ./request.ts - */ -const request = axios.create({ - baseURL: process.env.LAF_BASE_URL, - withCredentials: true, - timeout: 60000 -}); - -// request interceptor -request.interceptors.request.use( - (config: InternalAxiosRequestConfig) => { - let _headers: AxiosHeaders = config.headers; - - if (!config.headers || config.headers['Content-Type'] === '') { - _headers['Content-Type'] = 'application/json'; - } - - config.headers = _headers; - return config; - }, - (error: any) => { - error.data = {}; - error.data.msg = 'Server abnormality, please contact the administrator!'; - return Promise.resolve(error); - } -); - -// response interceptor -request.interceptors.response.use( - (response: AxiosResponse) => { - return response.data; - }, - (error: any) => { - if (axios.isCancel(error)) { - return Promise.reject('cancel request' + String(error)); - } else { - error.errMessage = 'Server abnormality, please contact the administrator!'; - } - return Promise.reject(error); - } -); - -export function GET( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.get(url, { - params: data, - ...config - }); -} - -export function POST( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.post(url, data, config); -} - -export function DELETE( - url: string, - data?: { [key: string]: any }, - config?: AxiosRequestConfig -): Promise { - return request.delete(url, { - params: data, - ...config - }); -} diff --git a/frontend/providers/cloudserver/src/store/env.ts b/frontend/providers/cloudserver/src/store/env.ts deleted file mode 100644 index 7fb176807..000000000 --- a/frontend/providers/cloudserver/src/store/env.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { getSystemEnv } from '@/api/platform'; -import { SystemEnvResponse } from '@/pages/api/platform/getEnv'; -import { create } from 'zustand'; -import { immer } from 'zustand/middleware/immer'; - -export let Domain: string | undefined; - -type EnvState = { - SystemEnv: SystemEnvResponse; - initSystemEnv: () => Promise; -}; - -const useEnvStore = create()( - immer((set, get) => ({ - SystemEnv: { - domain: '', - env_storage_className: '', - migrate_file_image: '', - minio_url: '' - }, - initSystemEnv: async () => { - const data = await getSystemEnv(); - Domain = data.domain; - set((state) => { - state.SystemEnv = data; - }); - return data; - } - })) -); - -export default useEnvStore; diff --git a/frontend/providers/cloudserver/src/store/global.ts b/frontend/providers/cloudserver/src/store/global.ts deleted file mode 100644 index c638165fa..000000000 --- a/frontend/providers/cloudserver/src/store/global.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { create } from 'zustand'; -import { devtools } from 'zustand/middleware'; -import { immer } from 'zustand/middleware/immer'; - -type State = { - screenWidth: number; - setScreenWidth: (e: number) => void; - loading: boolean; - setLoading: (val: boolean) => void; - lastRoute: string; - setLastRoute: (val: string) => void; -}; - -export const useGlobalStore = create()( - devtools( - immer((set, get) => ({ - screenWidth: 1440, - setScreenWidth(e: number) { - set((state) => { - state.screenWidth = e; - }); - }, - loading: false, - setLoading(val: boolean) { - set((state) => { - state.loading = val; - }); - }, - lastRoute: '/', - setLastRoute(val) { - set((state) => { - state.lastRoute = val; - }); - } - })) - ) -); diff --git a/frontend/providers/cloudserver/src/store/session.ts b/frontend/providers/cloudserver/src/store/session.ts deleted file mode 100644 index b2e9a9197..000000000 --- a/frontend/providers/cloudserver/src/store/session.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { SessionV1 } from 'sealos-desktop-sdk'; -import { create } from 'zustand'; -import { immer } from 'zustand/middleware/immer'; - -type SessionState = { - session: SessionV1 | undefined; - setSession: (ss: SessionV1) => void; - delSession: () => void; - token: string; - setToken: (token: string) => void; - delToken: () => void; -}; - -const useSessionStore = create()( - immer((set, get) => ({ - session: {} as SessionV1, - token: '', - setSession: (ss: SessionV1) => set({ session: ss }), - delSession: () => { - set({ session: undefined }); - }, - setToken: (token) => set({ token: token }), - delToken: () => { - set({ token: '' }); - } - })) -); - -export default useSessionStore; diff --git a/frontend/providers/cloudserver/src/styles/reset.scss b/frontend/providers/cloudserver/src/styles/reset.scss deleted file mode 100644 index 7ac926de6..000000000 --- a/frontend/providers/cloudserver/src/styles/reset.scss +++ /dev/null @@ -1,151 +0,0 @@ -body, -h1, -h2, -h3, -h4, -hr, -p, -blockquote, -dl, -dt, -dd, -ul, -ol, -li, -pre, -form, -fieldset, -legend, -button, -input, -textarea, -th, -td { - margin: 0; -} -body, -button, -input, -select, -textarea { - font: 12px/1.5tahoma, arial, \5b8b\4f53; -} -// h1, h2, h3, h4, h5, h6{ font-size:100%; } -address, -cite, -dfn, -em, -var { - font-style: normal; -} - -small { - font-size: 12px; -} -ul, -ol { - list-style: none; - padding: 0; -} -a { - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -sup { - vertical-align: text-top; -} -sub { - vertical-align: text-bottom; -} -legend { - color: #000; -} -fieldset, -img { - border: 0; -} -button, -input, -select, -textarea { - font-size: 100%; -} -table { - border-collapse: collapse; - border-spacing: 0; -} - -* { - box-sizing: border-box; -} - -.icon { - width: 1em; - height: 1em; - vertical-align: -0.15em; - fill: currentColor; - overflow: hidden; -} - -input::placeholder, -textarea::placeholder { - color: var(--chakra-colors-blackAlpha-400); -} - -#__next { - height: 100%; -} - -::-webkit-scrollbar, -::-webkit-scrollbar { - width: 6px; - height: 6px; -} -::-webkit-scrollbar-track, -::-webkit-scrollbar-track { - background: transparent !important; - border-radius: 2px; -} -::-webkit-scrollbar-thumb, -::-webkit-scrollbar-thumb { - background: rgba(189, 193, 197, 1) !important; - border-radius: 2px; -} -::-webkit-scrollbar-thumb:hover, -::-webkit-scrollbar-thumb:hover { - background: rgba(189, 193, 197, 1) !important; -} - -div { - &::-webkit-scrollbar-thumb, - &::-webkit-scrollbar-thumb { - background: transparent !important; - border-radius: 2px; - transition: 1s; - } - &:hover { - &::-webkit-scrollbar-thumb, - &::-webkit-scrollbar-thumb { - background: rgba(189, 193, 197, 0.5) !important; - } - &::-webkit-scrollbar-thumb:hover, - &::-webkit-scrollbar-thumb:hover { - background: rgba(189, 193, 197, 1) !important; - } - } -} - -div.rdp { - --rdp-cell-size: 40px; - --rdp-accent-color: black; - --rdp-background-color: #f4f6f8; - /* Switch to dark colors for dark themes */ - // --rdp-accent-color-dark: #3003e1; - // --rdp-background-color-dark: #180270; - /* Outline border for focused elements */ - --rdp-outline: 2px solid var(--rdp-accent-color); - /* Outline border for focused and selected elements */ - --rdp-outline-selected: 2px solid rgba(0, 0, 0, 0.75); -} diff --git a/frontend/providers/cloudserver/src/types/adapt.ts b/frontend/providers/cloudserver/src/types/adapt.ts deleted file mode 100644 index 5869e3e32..000000000 --- a/frontend/providers/cloudserver/src/types/adapt.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CVMInstanceType, PhaseEnum, StateEnum } from './cloudserver'; - -export default function adaptCloudServerListItem(item: CVMInstanceType): CVMInstanceType { - const status = - item.state === StateEnum.Changing - ? PhaseEnum.Changing - : item.state === StateEnum.Restarting - ? PhaseEnum.Restarting - : item.phase; - - return { - ...item, - phase: status - }; -} diff --git a/frontend/providers/cloudserver/src/types/cloudserver.ts b/frontend/providers/cloudserver/src/types/cloudserver.ts deleted file mode 100644 index 788339a43..000000000 --- a/frontend/providers/cloudserver/src/types/cloudserver.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { CVMChargeType } from './region'; - -export type EditForm = { - system: string; - systemImageId: string; - publicIpAssigned: boolean; - internetMaxBandWidthOut: number; - password: string; - autoPassword: boolean; - storages: StorageType[]; - virtualMachinePackageFamily: string; - virtualMachinePackageName: string; - virtualMachineType: string; - virtualMachineArch: string; - chargeType: CVMChargeType; - zone: string; - period: string; - counts: number; -}; - -export type StorageType = { - type?: string; - size: number; - amount: number; - use: 'SystemDisk' | 'DataDisk'; -}; - -export type BandwidthPricingTier = { - minBandwidth: number; - maxBandwidth: number; - pricePerMbps: number; -}; - -export type CloudServerType = { - cpu?: number; - memory?: number; - gpu?: number; - virtualMachinePackageFamily: string; - virtualMachinePackageName: string; - instancePrice: number; - diskPerG: number; - networkSpeedBoundary: number; - networkSpeedUnderSpeedBoundaryPerHour: number; - networkSpeedAboveSpeedBoundaryPerHour: number; - status: CloudServerStatus; - bandwidthPricingTiers: BandwidthPricingTier[]; -}; - -export enum CloudServerStatus { - Available = 'available', - Unavailable = 'unavailable' -} - -export interface OperatingSystem { - id: string; - os: string; - version: string; - architect: string; - img?: string; -} - -export interface OperatingSystems { - [key: string]: { - images: OperatingSystem[]; - url: string; - }; -} - -export enum CloudServerVendors { - Tencent = 'tencent' -} - -export enum PhaseEnum { - Creating = 'Creating', - Created = 'Created', - Starting = 'Starting', - Started = 'Started', - Stopping = 'Stopping', - Stopped = 'Stopped', - Deleting = 'Deleting', - Deleted = 'Deleted', - // status form state - Restarting = 'Restarting', - Changing = 'Changing' -} - -export enum StateEnum { - Running = 'Running', - Stopped = 'Stopped', - Restarting = 'Restarting', - Deleted = 'Deleted', - Changing = 'Changing' -} - -export const IntermediateStates: StateEnum[] = [StateEnum.Changing, StateEnum.Restarting]; - -export const IntermediatePhases: PhaseEnum[] = [ - PhaseEnum.Creating, - PhaseEnum.Starting, - PhaseEnum.Stopping, - PhaseEnum.Deleting -]; - -export interface CVMInstanceType { - _id: string; - phase: PhaseEnum; - state: StateEnum; - namespace: string; - sealosUserId: string; - cpu: number; - memory: number; - gpu: number; - disk: number; - publicNetworkAccess: boolean; - internetMaxBandwidthOut: number | null; - imageId: string; - instanceName: string; - cloudProvider: string; - createTime: string; - updateTime: string; - instanceId: string; - publicIpAddresses: string[]; - privateIpAddresses: string[]; - loginName: string; - loginPassword: string; - loginPort: string; -} - -export enum HandleEnum { - Start = 'Start', - Stop = 'Stop', - Restart = 'Restart', - Delete = 'Delete' -} - -export type CloudServerPrice = { - instancePrice: number; - networkPrice: number; - diskPrice: number; -}; - -export type CreateCloudServerPayload = { - imageId: string; - systemDisk: number; - dataDisks: number[]; - internetMaxBandwidthOut?: number; - loginPassword: string; - virtualMachinePackageFamily: string; - virtualMachinePackageName: string; - loginName: string; - metaData: { - [key: string]: any; - }; - zone: string; - virtualMachineType: string; - virtualMachineArch: string; - chargeType: CVMChargeType; - period: number; - counts: number; -}; diff --git a/frontend/providers/cloudserver/src/types/index.ts b/frontend/providers/cloudserver/src/types/index.ts deleted file mode 100644 index 20a24318e..000000000 --- a/frontend/providers/cloudserver/src/types/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MongoClient } from 'mongodb'; - -declare global { - var mongodb: MongoClient | null; -} diff --git a/frontend/providers/cloudserver/src/types/region.ts b/frontend/providers/cloudserver/src/types/region.ts deleted file mode 100644 index a7923e65b..000000000 --- a/frontend/providers/cloudserver/src/types/region.ts +++ /dev/null @@ -1,26 +0,0 @@ -export type VirtualMachineType = { - virtualMachineType: string; - virtualMachinePackageFamily: string[]; -}; - -export type CVMArchType = { - arch: string; - virtualMachineType: VirtualMachineType[]; -}; - -export type CVMZoneType = { - zone: string; - arch: CVMArchType[]; -}; - -export enum CVMChargeType { - postPaidByHour = 'postPaidByHour', - prePaid = 'prePaid' -} - -export type CVMRegionType = { - regionId: string; - chargeType: CVMChargeType; - regionName: string; - zone: CVMZoneType[]; -}; diff --git a/frontend/providers/cloudserver/src/types/user.ts b/frontend/providers/cloudserver/src/types/user.ts deleted file mode 100644 index 0653e2f03..000000000 --- a/frontend/providers/cloudserver/src/types/user.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type DesktopTokenPayload = { - regionUid: string; - userCrUid: string; - userCrName: string; - workspaceUid: string; - workspaceId: string; - userUid: string; - userId: string; -}; diff --git a/frontend/providers/cloudserver/src/utils/cookieUtils.ts b/frontend/providers/cloudserver/src/utils/cookieUtils.ts deleted file mode 100644 index be69f2aaf..000000000 --- a/frontend/providers/cloudserver/src/utils/cookieUtils.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Cookies from 'js-cookie'; - -export const LANG_KEY = 'NEXT_LOCALE'; - -export const setLangStore = (value: string) => { - return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); -}; - -export const getLangStore = () => { - return Cookies.get(LANG_KEY); -}; - -export const removeLangStore = () => { - Cookies.remove(LANG_KEY); -}; diff --git a/frontend/providers/cloudserver/src/utils/crypto.ts b/frontend/providers/cloudserver/src/utils/crypto.ts deleted file mode 100644 index 7d78b7f3b..000000000 --- a/frontend/providers/cloudserver/src/utils/crypto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as crypto from 'crypto'; - -export const hashCrypto = (text: string): string => { - const hash = crypto.createHash('sha256'); - hash.update(text); - return hash.digest('hex'); -}; diff --git a/frontend/providers/cloudserver/src/utils/i18n.ts b/frontend/providers/cloudserver/src/utils/i18n.ts deleted file mode 100644 index 8e6d1544a..000000000 --- a/frontend/providers/cloudserver/src/utils/i18n.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; -import { LANG_KEY } from './cookieUtils'; - -export const serviceSideProps = (content: any) => { - return serverSideTranslations( - content.req.cookies[LANG_KEY] || 'en', - undefined, - null, - content.locales - ); -}; diff --git a/frontend/providers/cloudserver/src/utils/tools.ts b/frontend/providers/cloudserver/src/utils/tools.ts deleted file mode 100644 index c728a41c3..000000000 --- a/frontend/providers/cloudserver/src/utils/tools.ts +++ /dev/null @@ -1,14 +0,0 @@ -import dayjs from 'dayjs'; -import { customAlphabet } from 'nanoid'; - -export const formatTime = (time: string | number | Date, format = 'YYYY-MM-DD HH:mm:ss') => { - return dayjs(time).format(format); -}; - -export const generateRandomPassword = () => { - const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz', 4); - const nanoidUpper = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 4); - const nanoidNumber = customAlphabet('0123456789', 4); - const password = nanoid() + nanoidUpper() + nanoidNumber(); - return password; -}; diff --git a/frontend/providers/cloudserver/src/utils/user.ts b/frontend/providers/cloudserver/src/utils/user.ts deleted file mode 100644 index 13b70355e..000000000 --- a/frontend/providers/cloudserver/src/utils/user.ts +++ /dev/null @@ -1,16 +0,0 @@ -import useSessionStore from '@/store/session'; - -// edge -export const getUserToken = () => { - let token: string = - process.env.NODE_ENV === 'development' ? process.env.NEXT_PUBLIC_MOCK_USER || '' : ''; - try { - const temp = useSessionStore.getState()?.token; - if (!token && temp) { - token = temp; - } - } catch (err) { - console.error(err); - } - return token; -}; diff --git a/frontend/providers/cloudserver/tsconfig.json b/frontend/providers/cloudserver/tsconfig.json deleted file mode 100644 index f2bc03096..000000000 --- a/frontend/providers/cloudserver/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "src/**/*.ts", "src/**/*.tsx"], - "extends": "../../tsconfig.web.json" -}