src/features/auth/ConfirmInvitePage.tsx — nuevo componente con tres estados:
idle: pantalla de bienvenida + botón "Confirmar acceso" (estado inicial con params válidos)
loading: botón con spinner mientras se llama a verifyOtp
error: mensaje descriptivo + link a /login (token vacío/incorrecto en params, o fallo en verifyOtp)
El verifyOtp solo se llama al click del usuario — nunca al montar, por eso el pre-scan del email no consume el token.
src/router.tsx — ruta /auth/confirm agregada como pública (PUBLIC_PATHS) + confirmInviteRoute en el árbol de rutas.
tests/features/auth/confirm-invite.test.tsx — 6 tests cubriendo: no-call on mount, error con params vacíos, error con type distinto, llamada correcta a verifyOtp, navegación en éxito, y error con mensaje de detalle.
ResetPasswordPage no requiere cambios — updateUser({ password }) solo necesita sesión activa, que verifyOtp crea en el paso previo.
This commit is contained in:
@@ -7,6 +7,7 @@ import { SettingsPage } from '@/features/settings/SettingsPage'
|
||||
import { ResourceCatalogPage } from '@/features/resources/ResourceCatalogPage'
|
||||
import { LoginPage } from '@/features/login/LoginPage'
|
||||
import { ResetPasswordPage } from '@/features/auth/ResetPasswordPage'
|
||||
import { ConfirmInvitePage } from '@/features/auth/ConfirmInvitePage'
|
||||
import { AdminLayout } from '@/features/admin/AdminLayout'
|
||||
import { OrganizationsPage } from '@/features/admin/OrganizationsPage'
|
||||
import { OrganizationDetailPage } from '@/features/admin/OrganizationDetailPage'
|
||||
@@ -31,7 +32,7 @@ function ReportPageWithSuspense() {
|
||||
)
|
||||
}
|
||||
|
||||
const PUBLIC_PATHS = ['/login', '/reset-password']
|
||||
const PUBLIC_PATHS = ['/login', '/reset-password', '/auth/confirm']
|
||||
|
||||
function RootComponent() {
|
||||
const { user, loading, pendingPasswordReset } = useAuth()
|
||||
@@ -90,6 +91,12 @@ const resetPasswordRoute = createRoute({
|
||||
component: ResetPasswordPage,
|
||||
})
|
||||
|
||||
const confirmInviteRoute = createRoute({
|
||||
getParentRoute: () => rootRoute,
|
||||
path: '/auth/confirm',
|
||||
component: ConfirmInvitePage,
|
||||
})
|
||||
|
||||
const indexRoute = createRoute({
|
||||
getParentRoute: () => rootRoute,
|
||||
path: '/',
|
||||
@@ -161,6 +168,7 @@ const adminUsersRoute = createRoute({
|
||||
const routeTree = rootRoute.addChildren([
|
||||
loginRoute,
|
||||
resetPasswordRoute,
|
||||
confirmInviteRoute,
|
||||
indexRoute,
|
||||
importRoute,
|
||||
workspaceRoute,
|
||||
|
||||
Reference in New Issue
Block a user