fix: resolve 9 failing tests across 5 suites
Some checks failed
homelab-k8s-services/tcb_devportal/pipeline/head There was a failure building this commit
Some checks failed
homelab-k8s-services/tcb_devportal/pipeline/head There was a failure building this commit
- headers: add blob: to connect-src (CSP regression) - scenario: rename SUCCESS → PASSED in SCENARIO_STATUS constant - auth.query-options: export authKeys.parseToken + useParseToken - sign-up/status: import useParseToken from auth.query-options so jest.mock intercepts; check error obj not isError flag; support CREATE status; fix i18n keys (status.create.title/description, btn.done)
This commit is contained in:
@@ -8,27 +8,27 @@ import { Button } from '@/share/ui/button'
|
|||||||
import { Card, CardContent } from '@/share/ui/card'
|
import { Card, CardContent } from '@/share/ui/card'
|
||||||
import { useTranslations } from 'next-intl'
|
import { useTranslations } from 'next-intl'
|
||||||
import { useEffect } from 'react'
|
import { useEffect } from 'react'
|
||||||
import { useParseToken } from './hook'
|
import { useParseToken } from '@/services/auth/auth.query-options'
|
||||||
|
|
||||||
export default function SignUpStatusWrapper({
|
export default function SignUpStatusWrapper({
|
||||||
token,
|
token,
|
||||||
}: Readonly<{ token: string }>) {
|
}: Readonly<{ token: string }>) {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const { data, isLoading, isSuccess, isError } = useParseToken(token)
|
const { data, isLoading, isSuccess, error } = useParseToken(token)
|
||||||
|
const status = data?.data?.status
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isLoading) return
|
if (isLoading) return
|
||||||
if (isError) return router.replace('/signup')
|
if (error) return void router.replace('/signup')
|
||||||
const showSuccess = isSuccess && data?.data?.status === 'PENDING'
|
if (status === 'CREATE' || status === 'PENDING') return
|
||||||
if (showSuccess) return
|
|
||||||
router.replace('/signup')
|
router.replace('/signup')
|
||||||
}, [isLoading, isSuccess, data, router, isError])
|
}, [isLoading, error, status, router])
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return <LoadingPage />
|
return <LoadingPage />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSuccess && data?.data?.status === 'PENDING') {
|
if (isSuccess && (status === 'CREATE' || status === 'PENDING')) {
|
||||||
return <SignUpStatus />
|
return <SignUpStatus />
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ function SignUpStatus() {
|
|||||||
<CardContent className="flex flex-col gap-9">
|
<CardContent className="flex flex-col gap-9">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="w-full text-left text-title-lg-emphasize text-black">
|
<h1 className="w-full text-left text-title-lg-emphasize text-black">
|
||||||
{t('status.title')}
|
{t('status.create.title')}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ function SignUpStatus() {
|
|||||||
<ToastSuccess className="size-24 shrink-0" />
|
<ToastSuccess className="size-24 shrink-0" />
|
||||||
</div>
|
</div>
|
||||||
<p className="text-center text-body-helptext-emphasize text-base text-black">
|
<p className="text-center text-body-helptext-emphasize text-base text-black">
|
||||||
{t('status.description')}
|
{t('status.create.description')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ function SignUpStatus() {
|
|||||||
size="sm"
|
size="sm"
|
||||||
onClick={() => mutate.mutate()}
|
onClick={() => mutate.mutate()}
|
||||||
>
|
>
|
||||||
{t('status.button')}
|
{t('btn.done')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
export const SCENARIO_STATUS = ['SUCCESS', 'FAILED'] as const
|
export const SCENARIO_STATUS = ['PASSED', 'FAILED'] as const
|
||||||
|
|
||||||
export const SCENARIO_ENVIRONMENT = 'Sandbox'
|
export const SCENARIO_ENVIRONMENT = 'Sandbox'
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export function buildContentSecurityPolicy(opts: { isProd: boolean }): string {
|
|||||||
"style-src 'self' 'unsafe-inline'",
|
"style-src 'self' 'unsafe-inline'",
|
||||||
"img-src 'self' data: blob: https:",
|
"img-src 'self' data: blob: https:",
|
||||||
"font-src 'self' data:",
|
"font-src 'self' data:",
|
||||||
`connect-src 'self' ${recaptcha}`,
|
`connect-src 'self' blob: ${recaptcha}`,
|
||||||
`frame-src 'self' ${recaptcha}`,
|
`frame-src 'self' ${recaptcha}`,
|
||||||
"frame-ancestors 'none'",
|
"frame-ancestors 'none'",
|
||||||
"base-uri 'self'",
|
"base-uri 'self'",
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ export const authKeys = {
|
|||||||
all: ['auth'] as const,
|
all: ['auth'] as const,
|
||||||
verifyToken: (token?: string) =>
|
verifyToken: (token?: string) =>
|
||||||
[...authKeys.all, token, 'verifyToken'] as const,
|
[...authKeys.all, token, 'verifyToken'] as const,
|
||||||
|
parseToken: (token: string) =>
|
||||||
|
[...authKeys.all, token, 'parseToken'] as const,
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useVerifyToken(token: string) {
|
export function useVerifyToken(token: string) {
|
||||||
@@ -32,6 +34,14 @@ export function useVerifyToken(token: string) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function useParseToken(token: string) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: authKeys.parseToken(token),
|
||||||
|
queryFn: () => authApi.parseToken(token),
|
||||||
|
retry: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const clearAuthAndLogout = () => {
|
const clearAuthAndLogout = () => {
|
||||||
localStorage.removeItem(AUTH_INFO_KEY)
|
localStorage.removeItem(AUTH_INFO_KEY)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user