From 447ed8e8c00e6919ed6af4512967fc22efd55c29 Mon Sep 17 00:00:00 2001 From: Prathmesh Ravindra Salunkhe Date: Mon, 20 Jul 2026 13:48:12 +0530 Subject: [PATCH] signin flow fix --- app/(Auth)/login/page.tsx | 6 +- app/(Auth)/signin/page.tsx | 75 +++++++- .../Cprofile/completeProfile/page.tsx | 123 ++++++++++++ app/(Cinterface)/Cprofile/page.tsx | 8 +- .../Fprofile/completeProfile/page.tsx | 122 ++++++++++++ app/api/profile/ClientProfile/route.ts | 182 ++++++++++++------ app/api/profile/FreelancerProfile/route.ts | 50 +++-- app/api/signin/route.ts | 10 +- components/Fprofile.tsx | 2 +- types/User.ts | 4 +- 10 files changed, 483 insertions(+), 99 deletions(-) create mode 100644 app/(Cinterface)/Cprofile/completeProfile/page.tsx create mode 100644 app/(Finterface)/Fprofile/completeProfile/page.tsx diff --git a/app/(Auth)/login/page.tsx b/app/(Auth)/login/page.tsx index aa27575..7c61205 100644 --- a/app/(Auth)/login/page.tsx +++ b/app/(Auth)/login/page.tsx @@ -25,7 +25,6 @@ declare global { render: (container: string, options: { sitekey: string, callback: (token: string) => void }) => void; }; onTurnstileSuccess: (token: string) => void; - __turnstileRendered: boolean; } } @@ -36,6 +35,7 @@ const Login = () => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const tokenRef = useRef(''); + const widgetRendered = useRef(false); useEffect(() => { const existingScript = document.querySelector('script[src="https://challenges.cloudflare.com/turnstile/v0/api.js"]'); @@ -115,8 +115,8 @@ const Login = () => { }; useEffect(() => { - if (window.__turnstileRendered) return; - window.__turnstileRendered = true; + if (widgetRendered.current) return; + widgetRendered.current = true; const renderTurnstile = () => { if (!window.turnstile) return; diff --git a/app/(Auth)/signin/page.tsx b/app/(Auth)/signin/page.tsx index 7122c6e..44eb275 100644 --- a/app/(Auth)/signin/page.tsx +++ b/app/(Auth)/signin/page.tsx @@ -1,5 +1,5 @@ "use client" -import { useState } from 'react'; +import { useState, useRef, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { signIn } from "next-auth/react"; import Link from 'next/link'; @@ -16,6 +16,16 @@ import { } from '@/components/ui/card'; import Banner from '@/components/Banner'; +declare global { + interface Window { + turnstile: { + render: (container: string, options: { sitekey: string, callback: (token: string) => void }) => void; + }; + onTurnstileSuccess: (token: string) => void; + } +} + + const SignIn = () => { const router = useRouter(); const searchParams = useSearchParams() @@ -23,6 +33,51 @@ const SignIn = () => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, seterror] = useState("") + const tokenRef = useRef(''); + const widgetRendered = useRef(false); + + useEffect(() => { + const existingScript = document.querySelector('script[src="https://challenges.cloudflare.com/turnstile/v0/api.js"]'); + + if (!existingScript) { + const script = document.createElement("script"); + script.src = "https://challenges.cloudflare.com/turnstile/v0/api.js"; + script.async = true; + document.body.appendChild(script); + } + + window.onTurnstileSuccess = (token: string) => { + tokenRef.current = token; + }; + + return () => { + delete window.onTurnstileSuccess; + }; + }, []); + + useEffect(() => { + if (widgetRendered.current) return; + widgetRendered.current = true; + + const renderTurnstile = () => { + if (!window.turnstile) return; + + window.turnstile.render("#turnstile-container", { + sitekey: process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY!, + callback: (token) => (tokenRef.current = token), + }); + }; + + if (!window.turnstile) { + const script = document.createElement("script"); + script.src = "https://challenges.cloudflare.com/turnstile/v0/api.js"; + script.async = true; + script.onload = renderTurnstile; + document.body.appendChild(script); + } else { + renderTurnstile(); + } + }, []); const role = searchParams.get('role') @@ -50,6 +105,8 @@ const SignIn = () => { } try { + console.log("Turnstile Token before /api/signin:", tokenRef.current); + const res = await fetch('/api/signin', { method: "POST", headers: { @@ -72,20 +129,25 @@ const SignIn = () => { else if (res.status === 200) { seterror("") + console.log("Turnstile token passed to signIn:", tokenRef.current); const loginResult = await signIn("credentials", { redirect: false, email, password, + 'cf-turnstile-response': tokenRef.current, }); - if (loginResult.ok) { + console.log("loginResult:", loginResult); + + if (loginResult?.ok) { if (role === "Client") { - router.replace("/Cdash"); + router.replace("/Cprofile/completeProfile"); } else { - router.replace("/Fdash"); + router.replace("/Fprofile/completeProfile"); } } else { - router.push("/login"); + console.error("signIn error:", loginResult?.error); + seterror(loginResult?.error || 'Authentication failed after sign-in'); } } else { @@ -148,6 +210,9 @@ const SignIn = () => { required /> + +
+ {error &&

{error}

}