Skip to content
Clone
b2ab8a5
37 lines 1.4 KB
import { CircleCheck } from 'lucide-react'
import { useEffect } from 'react'
import { useNavigate } from 'react-router-dom'
import { callbackUrl, clearCallbackUrl } from '@/entities/auth-callback'
import { useSession } from '@/entities/session'
import { routes } from '@/shared/config'
import { t } from '@/shared/i18n'
import { Alert, Heading, SessionCheck } from '@/shared/ui'
/// 登录成功后的停留时间:既要让用户看见成功态,又要保证 1 秒内进入工作台。
const SUCCESS_REDIRECT_DELAY_MS = 400
/// 没有回跳地址时的默认落点。
const DEFAULT_SUCCESS_TARGET = '/app/@me'
export function AccountPage() {
const navigate = useNavigate()
const { user, loading, task } = useSession({
onUnauthenticated: () => navigate(routes.login, { replace: true }),
})
useEffect(() => {
if (!user) return
const target = callbackUrl.get() || DEFAULT_SUCCESS_TARGET
const timer = setTimeout(() => {
clearCallbackUrl()
location.replace(target)
}, SUCCESS_REDIRECT_DELAY_MS)
return () => clearTimeout(timer)
}, [user])
if (loading || !user) return <SessionCheck loading={loading} notice={task.notice} onRetry={() => location.reload()} />
return (
<>
<Heading title={t('account.titleDone')} description={t('account.descriptionDone')} icon={CircleCheck} success />
<Alert notice={task.notice} />
</>
)
}