Fix issues with auth page redirects

This commit is contained in:
Jared Schoeny 2025-10-27 13:30:21 -10:00
parent 15fc02c400
commit e9201f6e51
4 changed files with 31 additions and 24 deletions

View File

@ -1,7 +1,5 @@
import LoginForm from "@/components/Auth/LoginForm";
import Link from "next/link";
import { createClient } from "@/utils/supabase/server";
import { redirect } from "next/navigation";
interface LoginPageProps {
searchParams: Promise<{ redirectTo?: string }>;
@ -10,12 +8,6 @@ interface LoginPageProps {
export default async function LoginPage({ searchParams }: LoginPageProps) {
const { redirectTo } = await searchParams;
const supabase = await createClient();
const { data: { user } } = await supabase.auth.getUser();
if (user) {
return redirect(redirectTo ? `/${redirectTo}` : "/account");
}
return (
<div className="mx-auto my-auto max-w-md w-full px-6 py-10">
<div className="card p-6">

View File

@ -1,5 +1,3 @@
import { createClient } from "@/utils/supabase/server";
import { redirect } from "next/navigation";
import Link from "next/link";
import SignupForm from "@/components/Auth/SignupForm";
@ -10,12 +8,6 @@ interface SignupPageProps {
export default async function SignupPage({ searchParams }: SignupPageProps) {
const { redirectTo } = await searchParams;
const supabase = await createClient();
const { data: { user } } = await supabase.auth.getUser();
if (user) {
return redirect(redirectTo ? `/${redirectTo}` : "/account");
}
return (
<div className="mx-auto my-auto max-w-md w-full px-6 py-10">
<div className="card p-6">

View File

@ -3,11 +3,12 @@
import React, { useActionState, useEffect} from "react";
import { FiEye, FiEyeOff } from "react-icons/fi";
import { AuthActionState, login } from "@/app/login/actions";
import { redirect, useSearchParams } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import { useAuthContext } from "@/contexts/AuthContext";
export default function LoginForm() {
const { setUser } = useAuthContext();
const router = useRouter();
const { user, setUser } = useAuthContext();
const [email, setEmail] = React.useState("");
const [password, setPassword] = React.useState("");
const [showPassword, setShowPassword] = React.useState(false);
@ -18,19 +19,30 @@ export default function LoginForm() {
"Email verification failed. Try again or request a new link." :
state?.error || null;
const redirectTo = searchParams.get("redirectTo");
const navigatedRef = React.useRef(false);
const emailValid = /.+@.+\..+/.test(email);
const passwordValid = password.length > 1;
const isValid = emailValid && passwordValid;
// Update context and immediately redirect after successful login
useEffect(() => {
if (state && state.error === null) {
if (state && state.error === null && !navigatedRef.current) {
setUser(state.user);
if (state.redirectTo) {
redirect(state.redirectTo);
}
const to = state.redirectTo || (redirectTo && redirectTo.startsWith('/') && !redirectTo.startsWith('//') ? redirectTo : '/account');
navigatedRef.current = true;
router.replace(to);
}
}, [state]);
}, [state, setUser, router, redirectTo]);
// Redirect when user becomes available in context
useEffect(() => {
if (!user || navigatedRef.current) return;
const isValidInternalPath = !!redirectTo && redirectTo.startsWith('/') && !redirectTo.startsWith('//');
const to = isValidInternalPath ? (redirectTo as string) : '/account';
navigatedRef.current = true;
router.replace(to);
}, [user, redirectTo, router]);
return (
<form className="grid gap-5 group">

View File

@ -1,13 +1,16 @@
"use client";
import React, { useActionState, useEffect } from "react";
import { useSearchParams } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import { FiEye, FiEyeOff } from "react-icons/fi";
import { AuthActionState, signup } from "@/app/signup/actions";
import { useAuthContext } from "@/contexts/AuthContext";
import { validateEmail, validatePassword } from "@/utils/auth";
export default function SignupForm() {
const router = useRouter();
const searchParams = useSearchParams();
const { user } = useAuthContext();
const [email, setEmail] = React.useState("");
const [password, setPassword] = React.useState("");
const [confirm, setConfirm] = React.useState("");
@ -39,6 +42,14 @@ export default function SignupForm() {
}
}, []);
// Redirect if user already authenticated (e.g., opened signup while logged in)
useEffect(() => {
if (!user) return;
const isValidInternalPath = !!redirectTo && redirectTo.startsWith('/') && !redirectTo.startsWith('//');
const to = isValidInternalPath ? (redirectTo as string) : '/account';
router.replace(to);
}, [user, redirectTo, router]);
return (
<form className="grid gap-5 group">
{redirectTo && (