diff --git a/src/app/[locale]/auth/account/page.tsx b/src/app/[locale]/auth/account/page.tsx index 7010a93c..7901e7f5 100644 --- a/src/app/[locale]/auth/account/page.tsx +++ b/src/app/[locale]/auth/account/page.tsx @@ -6,11 +6,14 @@ import { redirect } from '@/lib/locale/navigation'; export default async function AccountPage({ params, + searchParams, }: { params: Promise<{ locale: Locale }>; + searchParams: Promise<{ r?: string }>; }) { const { locale } = await params; setRequestLocale(locale); + const { r: redirectTo } = await searchParams; const { user } = await api.auth.state(); @@ -21,5 +24,5 @@ export default async function AccountPage({ return redirect({ href: '/', locale }); } - return ; + return ; } diff --git a/src/app/[locale]/auth/page.tsx b/src/app/[locale]/auth/page.tsx index 22745b22..d7c9ddff 100644 --- a/src/app/[locale]/auth/page.tsx +++ b/src/app/[locale]/auth/page.tsx @@ -13,10 +13,11 @@ export default async function SignInPage({ searchParams, }: { params: Promise<{ locale: Locale }>; - searchParams: Promise<{ error?: string }>; + searchParams: Promise<{ r?: string; error?: string }>; }) { const { locale } = await params; - let { error } = await searchParams; + let { r: redirectTo, error } = await searchParams; + setRequestLocale(locale); const t = await getTranslations('auth'); @@ -41,18 +42,21 @@ export default async function SignInPage({

{t('signInWith')}

- + {t('hackerspaceAccount')}
- + ); } diff --git a/src/app/api/auth/feide/route.ts b/src/app/api/auth/feide/route.ts index 217af3f6..b4966515 100644 --- a/src/app/api/auth/feide/route.ts +++ b/src/app/api/auth/feide/route.ts @@ -24,8 +24,10 @@ export async function GET(request: NextRequest) { const cookieStore = await cookies(); const storedState = cookieStore.get('feide-state')?.value; const codeVerifier = cookieStore.get('feide-code-verifier')?.value; + const redirectTo = cookieStore.get('feide-redirect-to')?.value; cookieStore.delete('feide-state'); cookieStore.delete('feide-code-verifier'); + cookieStore.delete('feide-redirect-to'); if ( !( @@ -184,5 +186,7 @@ export async function GET(request: NextRequest) { const session = await createSession(sessionToken, user.id); await setSessionTokenCookie(sessionToken, session.expiresAt); - return NextResponse.redirect(new URL('/', env.NEXT_PUBLIC_SITE_URL)); + return NextResponse.redirect( + new URL(redirectTo ?? '/', env.NEXT_PUBLIC_SITE_URL), + ); } diff --git a/src/components/auth/AccountSignInForm.tsx b/src/components/auth/AccountSignInForm.tsx index 2a40a404..9bc959c8 100644 --- a/src/components/auth/AccountSignInForm.tsx +++ b/src/components/auth/AccountSignInForm.tsx @@ -9,7 +9,7 @@ import type { TRPCClientError } from '@/lib/api/types'; import { useRouter } from '@/lib/locale/navigation'; import { accountSignInSchema } from '@/validations/auth/accountSignInSchema'; -function AccountSignInForm() { +function AccountSignInForm({ redirectTo }: { redirectTo?: string }) { const router = useRouter(); const t = useTranslations('auth'); const formSchema = accountSignInSchema(useTranslations()); @@ -40,7 +40,8 @@ function AccountSignInForm() { password: '', }, onSubmit: () => { - router.push('/'); + // Honestly, this is somewhat cursed, but it works to let TS know we assume the string is a valid path + router.push((redirectTo as Parameters[0]) ?? '/'); router.refresh(); }, }); diff --git a/src/components/auth/FeideButton.tsx b/src/components/auth/FeideButton.tsx index 30ff57fb..cd1dfc1a 100644 --- a/src/components/auth/FeideButton.tsx +++ b/src/components/auth/FeideButton.tsx @@ -6,7 +6,7 @@ import { Button } from '@/components/ui/Button'; import { Spinner } from '@/components/ui/Spinner'; import { api } from '@/lib/api/client'; -function FeideButton() { +function FeideButton({ redirectTo }: { redirectTo?: string }) { const router = useRouter(); const signInMutation = api.auth.signInFeide.useMutation({ onSuccess: (data) => { @@ -17,7 +17,7 @@ function FeideButton() { return (