diff --git a/web/app/account/account-page/index.tsx b/web/app/account/account-page/index.tsx index 53f7692e6c..b42b481eba 100644 --- a/web/app/account/account-page/index.tsx +++ b/web/app/account/account-page/index.tsx @@ -15,6 +15,7 @@ import { ToastContext } from '@/app/components/base/toast' import AppIcon from '@/app/components/base/app-icon' import Avatar from '@/app/components/base/avatar' import { IS_CE_EDITION } from '@/config' +import Input from '@/app/components/base/input' const titleClassName = ` text-sm font-medium text-gray-900 @@ -31,6 +32,7 @@ const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/ export default function AccountPage() { const { t } = useTranslation() + const { systemFeatures } = useAppContext() const { mutateUserProfile, userProfile, apps } = useAppContext() const { notify } = useContext(ToastContext) const [editNameModalVisible, setEditNameModalVisible] = useState(false) @@ -41,6 +43,9 @@ export default function AccountPage() { const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [showDeleteAccountModal, setShowDeleteAccountModal] = useState(false) + const [showCurrentPassword, setShowCurrentPassword] = useState(false) + const [showPassword, setShowPassword] = useState(false) + const [showConfirmPassword, setShowConfirmPassword] = useState(false) const handleEditName = () => { setEditNameModalVisible(true) @@ -158,8 +163,8 @@ export default function AccountPage() { { - IS_CE_EDITION && ( -
- {`${t('login.joinTipStart')} ${checkRes.workspace_name} ${t('login.joinTipEnd')}`} -
-+ {t('login.checkCode.didNotReceiveCode')} + {time > 0 && {Math.round(time / 1000)}s} + { + time <= 0 && {t('login.checkCode.resend')} + } +
+} diff --git a/web/app/components/swr-initor.tsx b/web/app/components/swr-initor.tsx index ce126512fa..89141359d6 100644 --- a/web/app/components/swr-initor.tsx +++ b/web/app/components/swr-initor.tsx @@ -1,10 +1,11 @@ 'use client' import { SWRConfig } from 'swr' -import { useEffect, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import type { ReactNode } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import useRefreshToken from '@/hooks/use-refresh-token' +import { fetchSetupStatus } from '@/service/common' type SwrInitorProps = { children: ReactNode @@ -21,27 +22,60 @@ const SwrInitor = ({ const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token') const [init, setInit] = useState(false) - useEffect(() => { - if (!(consoleToken || refreshToken || consoleTokenFromLocalStorage || refreshTokenFromLocalStorage)) { - router.replace('/signin') - return + const isSetupFinished = useCallback(async () => { + try { + if (localStorage.getItem('setup_status') === 'finished') + return true + const setUpStatus = await fetchSetupStatus() + if (setUpStatus.step !== 'finished') { + localStorage.removeItem('setup_status') + return false + } + localStorage.setItem('setup_status', 'finished') + return true } - if (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage) - getNewAccessToken() - - if (consoleToken && refreshToken) { - localStorage.setItem('console_token', consoleToken) - localStorage.setItem('refresh_token', refreshToken) - getNewAccessToken().then(() => { - router.replace('/apps', { forceOptimisticNavigation: false } as any) - }).catch(() => { - router.replace('/signin') - }) + catch (error) { + console.error(error) + return false } - - setInit(true) }, []) + const setRefreshToken = useCallback(async () => { + try { + if (!(consoleToken || refreshToken || consoleTokenFromLocalStorage || refreshTokenFromLocalStorage)) + return Promise.reject(new Error('No token found')) + + if (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage) + await getNewAccessToken() + + if (consoleToken && refreshToken) { + localStorage.setItem('console_token', consoleToken) + localStorage.setItem('refresh_token', refreshToken) + await getNewAccessToken() + } + } + catch (error) { + return Promise.reject(error) + } + }, [consoleToken, refreshToken, consoleTokenFromLocalStorage, refreshTokenFromLocalStorage, getNewAccessToken]) + + useEffect(() => { + (async () => { + try { + const isFinished = await isSetupFinished() + if (!isFinished) { + router.replace('/install') + return + } + await setRefreshToken() + setInit(true) + } + catch (error) { + router.replace('/signin') + } + })() + }, [isSetupFinished, setRefreshToken, router]) + return init ? (
+
+
+ {t('login.checkCode.validTime')}
+
+ {t('login.resetPasswordDesc')} +
++ {t('login.changePasswordTip')} +
+
+
+
+ {t('login.checkCode.validTime')}
+
{t('login.welcome')}
-{t('login.joinTipStart')}{workspaceName}{t('login.joinTipEnd')}
+{t('login.welcome')}
+{t('login.noLoginMethod')}
+{t('login.noLoginMethodTip')}
+{t('login.createSample')}
+{t('login.createSample')}