From f0883c19efff30f06db7f3bc887b471b933a1f8f Mon Sep 17 00:00:00 2001 From: giancarlo Date: Wed, 27 Mar 2024 14:30:23 +0800 Subject: [PATCH] Implement redirect control in multi-factor auth container The update adds a rerouting functionality upon successful multi-factor authentication, replacing a console log action previously triggered upon success. The change enhances the authentication flow by redirecting users to a specified path upon validation. Additionally, minor refactorings are done such as replacing direct routing paths with path configs and adjusting import statements. --- apps/web/app/auth/callback/error/page.tsx | 19 +++++++++---------- apps/web/app/auth/sign-up/page.tsx | 1 + apps/web/app/auth/verify/page.tsx | 14 +++++++++++--- .../multi-factor-challenge-container.tsx | 14 ++++++++++++-- .../components/sign-up-methods-container.tsx | 3 +-- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/apps/web/app/auth/callback/error/page.tsx b/apps/web/app/auth/callback/error/page.tsx index 18961fc29..779de670b 100644 --- a/apps/web/app/auth/callback/error/page.tsx +++ b/apps/web/app/auth/callback/error/page.tsx @@ -1,9 +1,12 @@ +import Link from 'next/link'; import { redirect } from 'next/navigation'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { Button } from '@kit/ui/button'; import { Trans } from '@kit/ui/trans'; +import pathsConfig from '~/config/paths.config'; + interface Params { searchParams: { error: string; @@ -15,7 +18,7 @@ function AuthCallbackErrorPage({ searchParams }: Params) { // if there is no error, redirect the user to the sign-in page if (!error) { - redirect('/auth/sign-in'); + redirect(pathsConfig.auth.signIn); } return ( @@ -32,15 +35,11 @@ function AuthCallbackErrorPage({ searchParams }: Params) { - - -
- -
+ ); } diff --git a/apps/web/app/auth/sign-up/page.tsx b/apps/web/app/auth/sign-up/page.tsx index 8c5792a15..e42570e14 100644 --- a/apps/web/app/auth/sign-up/page.tsx +++ b/apps/web/app/auth/sign-up/page.tsx @@ -37,6 +37,7 @@ function SignUpPage({ searchParams }: Props) { providers={authConfig.providers} paths={{ callback: pathsConfig.auth.callback, + appHome: pathsConfig.app.home, }} inviteToken={inviteToken} /> diff --git a/apps/web/app/auth/verify/page.tsx b/apps/web/app/auth/verify/page.tsx index bf5c1e308..40424969d 100644 --- a/apps/web/app/auth/verify/page.tsx +++ b/apps/web/app/auth/verify/page.tsx @@ -8,6 +8,12 @@ import pathsConfig from '~/config/paths.config'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; import { withI18n } from '~/lib/i18n/with-i18n'; +interface Props { + searchParams: { + next?: string; + }; +} + export const generateMetadata = async () => { const i18n = await createI18nServerInstance(); @@ -16,7 +22,7 @@ export const generateMetadata = async () => { }; }; -async function VerifyPage() { +async function VerifyPage(props: Props) { const client = getSupabaseServerComponentClient(); const needsMfa = await checkRequiresMultiFactorAuthentication(client); @@ -24,10 +30,12 @@ async function VerifyPage() { redirect(pathsConfig.auth.signIn); } + const redirectPath = props.searchParams.next ?? pathsConfig.app.home; + return ( { - console.log('2'); + paths={{ + redirectPath, }} /> ); diff --git a/packages/features/auth/src/components/multi-factor-challenge-container.tsx b/packages/features/auth/src/components/multi-factor-challenge-container.tsx index beb02dfbc..cffcfbf17 100644 --- a/packages/features/auth/src/components/multi-factor-challenge-container.tsx +++ b/packages/features/auth/src/components/multi-factor-challenge-container.tsx @@ -3,6 +3,8 @@ import type { FormEventHandler } from 'react'; import { useCallback, useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; + import { useMutation } from '@tanstack/react-query'; import useFetchAuthFactors from '@kit/supabase/hooks/use-fetch-mfa-factors'; @@ -17,14 +19,22 @@ import Spinner from '@kit/ui/spinner'; import { Trans } from '@kit/ui/trans'; export function MultiFactorChallengeContainer({ - onSuccess, + paths, }: React.PropsWithChildren<{ - onSuccess: () => void; + paths: { + redirectPath: string; + }; }>) { + const router = useRouter(); + const [factorId, setFactorId] = useState(''); const [verifyCode, setVerifyCode] = useState(''); const verifyMFAChallenge = useVerifyMFAChallenge(); + const onSuccess = useCallback(() => { + router.replace(paths.redirectPath); + }, [router, paths.redirectPath]); + const onSubmitClicked: FormEventHandler = useCallback( (event) => { void (async () => { diff --git a/packages/features/auth/src/components/sign-up-methods-container.tsx b/packages/features/auth/src/components/sign-up-methods-container.tsx index 0908ed3f7..312bc2836 100644 --- a/packages/features/auth/src/components/sign-up-methods-container.tsx +++ b/packages/features/auth/src/components/sign-up-methods-container.tsx @@ -2,8 +2,7 @@ import type { Provider } from '@supabase/supabase-js'; -import { isBrowser } from '@supabase/ssr'; - +import { isBrowser } from '@kit/shared/utils'; import { Divider } from '@kit/ui/divider'; import { If } from '@kit/ui/if';