From 57e1d3be311c30c0c6086a354cc5447f7b489604 Mon Sep 17 00:00:00 2001 From: jingyang <3161362058@qq.com> Date: Tue, 2 Apr 2024 11:55:06 +0800 Subject: [PATCH] fix:terminal already exists Signed-off-by: jingyang <3161362058@qq.com> --- .../terminal/{.env => .env.template} | 0 .../src/components/terminal/index.tsx | 4 +- .../providers/terminal/src/pages/api/apply.ts | 2 + .../providers/terminal/src/pages/index.tsx | 6 ++- .../terminal/src/service/kubernetes.ts | 2 +- .../providers/terminal/src/service/request.ts | 9 +--- .../providers/terminal/src/store/session.ts | 41 +++++++++++++++++ .../providers/terminal/src/stores/session.ts | 46 ------------------- frontend/providers/terminal/src/utils/user.ts | 16 +++++++ 9 files changed, 68 insertions(+), 58 deletions(-) rename frontend/providers/terminal/{.env => .env.template} (100%) create mode 100644 frontend/providers/terminal/src/store/session.ts delete mode 100644 frontend/providers/terminal/src/stores/session.ts create mode 100644 frontend/providers/terminal/src/utils/user.ts diff --git a/frontend/providers/terminal/.env b/frontend/providers/terminal/.env.template similarity index 100% rename from frontend/providers/terminal/.env rename to frontend/providers/terminal/.env.template diff --git a/frontend/providers/terminal/src/components/terminal/index.tsx b/frontend/providers/terminal/src/components/terminal/index.tsx index 7c9a3a63dce..b6b66802bbf 100644 --- a/frontend/providers/terminal/src/components/terminal/index.tsx +++ b/frontend/providers/terminal/src/components/terminal/index.tsx @@ -5,7 +5,7 @@ import { nanoid } from 'nanoid'; import { useRouter } from 'next/router'; import { useEffect, useRef, useState } from 'react'; import styles from './index.module.scss'; -import useSessionStore from '@/stores/session'; +import useSessionStore from '@/store/session'; type Terminal = { id: string; @@ -18,7 +18,7 @@ function Terminal({ url, site }: { url: string; site: string }) { const iframeRef = useRef(null); const { query } = router; const session = useSessionStore((s) => s.session); - const nsid = session.user.nsid; + const nsid = session?.user?.nsid; const [tabContents, setTabContents] = useState([ { id: tabId, diff --git a/frontend/providers/terminal/src/pages/api/apply.ts b/frontend/providers/terminal/src/pages/api/apply.ts index 30683727b8d..a4414063cb4 100644 --- a/frontend/providers/terminal/src/pages/api/apply.ts +++ b/frontend/providers/terminal/src/pages/api/apply.ts @@ -37,6 +37,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (terminalStatus.availableReplicas > 0) { // temporarily add domain scheme return jsonRes(res, { data: terminalStatus.domain || '' }); + } else { + return jsonRes(res, { code: 201, data: terminalStatus.domain || '' }); } } } catch (error) {} diff --git a/frontend/providers/terminal/src/pages/index.tsx b/frontend/providers/terminal/src/pages/index.tsx index 235c9ecd327..6975092f0c6 100644 --- a/frontend/providers/terminal/src/pages/index.tsx +++ b/frontend/providers/terminal/src/pages/index.tsx @@ -1,6 +1,6 @@ import Terminal from '@/components/terminal'; import request from '@/service/request'; -import useSessionStore from '@/stores/session'; +import useSessionStore from '@/store/session'; import { Box, Flex, Spinner, useToast } from '@chakra-ui/react'; import { useQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; @@ -26,7 +26,9 @@ export default function Index(props: ServiceEnv) { try { const result = await sealosApp.getSession(); setSession(result); - } catch (error) {} + } catch (error) { + console.log('App is not running in desktop'); + } }; initApp(); }, [setSession]); diff --git a/frontend/providers/terminal/src/service/kubernetes.ts b/frontend/providers/terminal/src/service/kubernetes.ts index c79d435c6e9..eed1d933f90 100644 --- a/frontend/providers/terminal/src/service/kubernetes.ts +++ b/frontend/providers/terminal/src/service/kubernetes.ts @@ -14,7 +14,7 @@ export function K8sApi(config: string): k8s.KubeConfig { kc.loadFromString(config); const cluster = kc.getCurrentCluster(); - if (cluster !== null) { + if (cluster !== null && process.env.NODE_ENV !== 'development') { let server: k8s.Cluster; const [inCluster, hosts] = CheckIsInCluster(); diff --git a/frontend/providers/terminal/src/service/request.ts b/frontend/providers/terminal/src/service/request.ts index 3d8e26c9109..d763471bfa5 100644 --- a/frontend/providers/terminal/src/service/request.ts +++ b/frontend/providers/terminal/src/service/request.ts @@ -1,6 +1,6 @@ // http.ts import { ApiResp } from '@/interfaces/api'; -import useSessionStore from '@/stores/session'; +import { getUserKubeConfig } from '@/utils/user'; import axios, { AxiosRequestConfig, AxiosResponse, RawAxiosRequestHeaders } from 'axios'; const request = axios.create({ @@ -14,14 +14,9 @@ request.interceptors.request.use( (config: AxiosRequestConfig) => { // auto append service prefix let _headers: RawAxiosRequestHeaders = config.headers || {}; - const session = useSessionStore.getState().session; if (config.url && config.url?.startsWith('/api/')) { - _headers['Authorization'] = encodeURIComponent(session?.kubeconfig || ''); - } - - if (process.env.NODE_ENV === 'development') { - _headers['Authorization'] = encodeURIComponent(process.env.NEXT_PUBLIC_MOCK_KUBECONFIG || ''); + _headers['Authorization'] = encodeURIComponent(getUserKubeConfig()); } if (!config.headers || config.headers['Content-Type'] === '') { diff --git a/frontend/providers/terminal/src/store/session.ts b/frontend/providers/terminal/src/store/session.ts new file mode 100644 index 00000000000..43692884b07 --- /dev/null +++ b/frontend/providers/terminal/src/store/session.ts @@ -0,0 +1,41 @@ +import * as yaml from 'js-yaml'; +import type { SessionV1 as Session } from 'sealos-desktop-sdk/*'; +import { create } from 'zustand'; +import { immer } from 'zustand/middleware/immer'; + +type SessionState = { + session: Session; + setSession: (ss: Session) => void; + setSessionProp: (key: keyof Session, value: any) => void; + getSession: () => Session; + delSession: () => void; + isUserLogin: () => boolean; + getKubeconfigToken: () => string; +}; + +const useSessionStore = create()( + immer((set, get) => ({ + session: {} as Session, + setSession: (ss: Session) => set({ session: ss }), + setSessionProp: (key: keyof Session, value: any) => { + set((state) => { + state.session[key] = value; + }); + }, + getSession: () => get().session, + delSession: () => { + set({ session: undefined }); + }, + isUserLogin: () => !!get().session?.user, + getKubeconfigToken: () => { + if (get().session?.kubeconfig === '') { + return ''; + } + const doc = yaml.load(get().session.kubeconfig); + //@ts-ignore + return doc?.users[0]?.user?.token; + } + })) +); + +export default useSessionStore; diff --git a/frontend/providers/terminal/src/stores/session.ts b/frontend/providers/terminal/src/stores/session.ts deleted file mode 100644 index 94aab533968..00000000000 --- a/frontend/providers/terminal/src/stores/session.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { sessionKey } from '@/interfaces/session'; -import type { SessionV1 as Session } from 'sealos-desktop-sdk/*'; -import * as yaml from 'js-yaml'; -import { create } from 'zustand'; -import { devtools } from 'zustand/middleware'; -import { immer } from 'zustand/middleware/immer'; - -type SessionState = { - session: Session; - setSession: (ss: Session) => void; - setSessionProp: (key: keyof Session, value: any) => void; - getSession: () => Session; - delSession: () => void; - isUserLogin: () => boolean; - getKubeconfigToken: () => string; -}; - -const useSessionStore = create()( - devtools( - immer((set, get) => ({ - session: {} as Session, - setSession: (ss: Session) => set({ session: ss }), - setSessionProp: (key: keyof Session, value: any) => { - set((state) => { - state.session[key] = value; - }); - }, - getSession: () => get().session, - delSession: () => { - set({ session: undefined }); - }, - isUserLogin: () => !!get().session?.user, - getKubeconfigToken: () => { - if (get().session?.kubeconfig === '') { - return ''; - } - const doc = yaml.load(get().session.kubeconfig); - //@ts-ignore - return doc?.users[0]?.user?.token; - } - })), - { name: sessionKey } - ) -); - -export default useSessionStore; diff --git a/frontend/providers/terminal/src/utils/user.ts b/frontend/providers/terminal/src/utils/user.ts new file mode 100644 index 00000000000..2572a4c4320 --- /dev/null +++ b/frontend/providers/terminal/src/utils/user.ts @@ -0,0 +1,16 @@ +import useSessionStore from '@/store/session'; + +// Edge +export const getUserKubeConfig = () => { + let kubeConfig: string = + process.env.NODE_ENV === 'development' ? process.env.NEXT_PUBLIC_MOCK_USER || '' : ''; + try { + const session = useSessionStore.getState()?.session; + if (!kubeConfig && session) { + kubeConfig = session?.kubeconfig; + } + } catch (err) { + console.error(err); + } + return kubeConfig; +};