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 (