mirror of
https://github.com/Hackdex-App/hackdex-website.git
synced 2026-04-24 15:06:53 -05:00
Fix issues with auth page redirects
This commit is contained in:
parent
15fc02c400
commit
e9201f6e51
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 && (
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user