From 28f7da5f419ff0395d59cb4fddb6cc2ce504a050 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 9 Mar 2026 21:55:42 +0300 Subject: [PATCH] web: open reset form immediately for reset links --- web/src/app/App.tsx | 30 +++++++++++++++++++----------- web/src/components/AuthPanel.tsx | 12 ++++++++++-- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/web/src/app/App.tsx b/web/src/app/App.tsx index 70eaf51..72067db 100644 --- a/web/src/app/App.tsx +++ b/web/src/app/App.tsx @@ -15,6 +15,15 @@ const PENDING_NOTIFICATION_NAV_KEY = "bm_pending_notification_nav"; const PENDING_RESET_PASSWORD_TOKEN_KEY = "bm_pending_reset_password_token"; export function App() { + const [pendingResetToken, setPendingResetToken] = useState(() => { + const tokenFromLink = extractPasswordResetTokenFromLocation(); + if (tokenFromLink) { + window.localStorage.setItem(PENDING_RESET_PASSWORD_TOKEN_KEY, tokenFromLink); + window.history.replaceState(null, "", "/"); + return tokenFromLink; + } + return window.localStorage.getItem(PENDING_RESET_PASSWORD_TOKEN_KEY); + }); const accessToken = useAuthStore((s) => s.accessToken); const me = useAuthStore((s) => s.me); const loadMe = useAuthStore((s) => s.loadMe); @@ -71,16 +80,10 @@ export function App() { }, []); useEffect(() => { - const resetToken = extractPasswordResetTokenFromLocation(); - if (!resetToken) { - return; - } - window.localStorage.setItem(PENDING_RESET_PASSWORD_TOKEN_KEY, resetToken); - if (accessToken) { + if (pendingResetToken && accessToken) { logout(); } - window.history.replaceState(null, "", "/"); - }, [accessToken, logout]); + }, [pendingResetToken, accessToken, logout]); useEffect(() => { const nav = extractNotificationNavigationFromLocation(); @@ -154,15 +157,20 @@ export function App() { })(); }, [accessToken, joiningInvite, loadChats, me, setActiveChatId, setFocusedMessage, showToast]); - if (!accessToken || !me) { - const pendingResetToken = window.localStorage.getItem(PENDING_RESET_PASSWORD_TOKEN_KEY); + if (pendingResetToken) { return ( window.localStorage.removeItem(PENDING_RESET_PASSWORD_TOKEN_KEY)} + onResetTokenConsumed={() => { + window.localStorage.removeItem(PENDING_RESET_PASSWORD_TOKEN_KEY); + setPendingResetToken(null); + }} /> ); } + if (!accessToken || !me) { + return ; + } return ( <> diff --git a/web/src/components/AuthPanel.tsx b/web/src/components/AuthPanel.tsx index 5544b60..b087ec0 100644 --- a/web/src/components/AuthPanel.tsx +++ b/web/src/components/AuthPanel.tsx @@ -14,7 +14,7 @@ interface AuthPanelProps { export function AuthPanel({ initialResetToken = null, onResetTokenConsumed }: AuthPanelProps) { const login = useAuthStore((s) => s.login); const loading = useAuthStore((s) => s.loading); - const [step, setStep] = useState("email"); + const [step, setStep] = useState(initialResetToken?.trim() ? "reset" : "email"); const [email, setEmail] = useState(""); const [name, setName] = useState(""); const [username, setUsername] = useState(""); @@ -161,13 +161,21 @@ export function AuthPanel({ initialResetToken = null, onResetTokenConsumed }: Au return (

- {step === "email" ? "Sign in to BenyaMessenger" : step === "register" ? "Create account" : "Enter credentials"} + {step === "email" + ? "Sign in to BenyaMessenger" + : step === "register" + ? "Create account" + : step === "reset" + ? "Reset password" + : "Enter credentials"}

{step === "email" ? "Enter your email to continue" : step === "register" ? "This email is not registered yet. Complete registration." + : step === "reset" + ? "Enter a new password for your account." : step === "password" ? "Enter your password" : "Two-factor authentication is enabled"}