From a3443070f380ee9fcdd522ab64d212ff3aadf6dd Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 22 Jun 2026 03:04:13 +0000 Subject: [PATCH] auto: fix protected auth redirect race Co-authored-by: Ummara Ali Syeda --- client-next/src/app/settings/topics/page.js | 25 +++++++++++---------- client-next/src/app/start/page.js | 11 ++++----- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/client-next/src/app/settings/topics/page.js b/client-next/src/app/settings/topics/page.js index fd732c1..f0f2c34 100644 --- a/client-next/src/app/settings/topics/page.js +++ b/client-next/src/app/settings/topics/page.js @@ -1,6 +1,6 @@ 'use client' -import { useState, useEffect } from 'react' +import { useState, useEffect, useCallback } from 'react' import { useAuth } from '@/context/AuthContext' import { useRouter } from 'next/navigation' import Link from 'next/link' @@ -20,22 +20,14 @@ function flattenTopics(topics) { } export default function TopicsPage() { - const { user } = useAuth() + const { user, isLoading: authLoading } = useAuth() const router = useRouter() const [followed, setFollowed] = useState([]) const [allTopics, setAllTopics] = useState([]) const [loading, setLoading] = useState(true) const [actionLoading, setActionLoading] = useState(null) - useEffect(() => { - if (!user) { - router.push('/login') - return - } - loadData() - }, [user]) - - async function loadData() { + const loadData = useCallback(async () => { setLoading(true) try { const [followedData, topicsData] = await Promise.all([ @@ -49,7 +41,16 @@ export default function TopicsPage() { } finally { setLoading(false) } - } + }, []) + + useEffect(() => { + if (authLoading) return + if (!user) { + router.replace('/login') + return + } + loadData() + }, [user, authLoading, router, loadData]) const followedSlugs = new Set(followed.map(t => t.topic)) diff --git a/client-next/src/app/start/page.js b/client-next/src/app/start/page.js index 26b5b7c..583e61c 100644 --- a/client-next/src/app/start/page.js +++ b/client-next/src/app/start/page.js @@ -90,7 +90,7 @@ function CustomTagInput({ customTagInput, setCustomTagInput, parseCustomTags }) } export default function Start() { - const { user } = useAuth() + const { user, isLoading } = useAuth() const router = useRouter() const [doi, setDoi] = useState('') @@ -112,17 +112,14 @@ export default function Start() { .catch(() => {}) }, []) - const [isReady, setIsReady] = useState(false) - useEffect(() => { + if (isLoading) return if (!user) { router.replace('/login') - } else { - setIsReady(true) } - }, [user, router]) + }, [user, isLoading, router]) - if (!isReady || !user) { + if (isLoading || !user) { return null }