登录或注册失败时重置cf小组件

This commit is contained in:
mtvpls
2025-12-13 13:46:47 +08:00
parent 8678d5fe49
commit d2cd4f6955
2 changed files with 44 additions and 14 deletions
+20 -5
View File
@@ -80,6 +80,7 @@ function LoginPageClient() {
const [turnstileToken, setTurnstileToken] = useState<string | null>(null); const [turnstileToken, setTurnstileToken] = useState<string | null>(null);
const [turnstileLoaded, setTurnstileLoaded] = useState(false); const [turnstileLoaded, setTurnstileLoaded] = useState(false);
const [siteConfig, setSiteConfig] = useState<any>(null); const [siteConfig, setSiteConfig] = useState<any>(null);
const [turnstileWidgetId, setTurnstileWidgetId] = useState<string | null>(null);
const { siteName } = useSite(); const { siteName } = useSite();
@@ -155,12 +156,13 @@ function LoginPageClient() {
const container = document.getElementById('turnstile-container'); const container = document.getElementById('turnstile-container');
if (container && (window as any).turnstile) { if (container && (window as any).turnstile) {
(window as any).turnstile.render('#turnstile-container', { const widgetId = (window as any).turnstile.render('#turnstile-container', {
sitekey: siteConfig.TurnstileSiteKey, sitekey: siteConfig.TurnstileSiteKey,
callback: (token: string) => { callback: (token: string) => {
setTurnstileToken(token); setTurnstileToken(token);
}, },
}); });
setTurnstileWidgetId(widgetId);
} }
}, [turnstileLoaded, siteConfig]); }, [turnstileLoaded, siteConfig]);
@@ -204,13 +206,26 @@ function LoginPageClient() {
const redirect = searchParams.get('redirect') || '/'; const redirect = searchParams.get('redirect') || '/';
router.replace(redirect); router.replace(redirect);
} else if (res.status === 401) {
setError('密码错误');
} else { } else {
const data = await res.json().catch(() => ({})); // 登录失败,重置Turnstile
setError(data.error ?? '服务器错误'); if (siteConfig?.LoginRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) {
(window as any).turnstile.reset(turnstileWidgetId);
setTurnstileToken(null);
}
if (res.status === 401) {
setError('密码错误');
} else {
const data = await res.json().catch(() => ({}));
setError(data.error ?? '服务器错误');
}
} }
} catch (error) { } catch (error) {
// 网络错误,重置Turnstile
if (siteConfig?.LoginRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) {
(window as any).turnstile.reset(turnstileWidgetId);
setTurnstileToken(null);
}
setError('网络错误,请稍后重试'); setError('网络错误,请稍后重试');
} finally { } finally {
setLoading(false); setLoading(false);
+23 -8
View File
@@ -80,6 +80,7 @@ function RegisterPageClient() {
const [turnstileToken, setTurnstileToken] = useState<string | null>(null); const [turnstileToken, setTurnstileToken] = useState<string | null>(null);
const [turnstileLoaded, setTurnstileLoaded] = useState(false); const [turnstileLoaded, setTurnstileLoaded] = useState(false);
const [siteConfig, setSiteConfig] = useState<any>(null); const [siteConfig, setSiteConfig] = useState<any>(null);
const [turnstileWidgetId, setTurnstileWidgetId] = useState<string | null>(null);
const { siteName } = useSite(); const { siteName } = useSite();
@@ -133,12 +134,13 @@ function RegisterPageClient() {
const container = document.getElementById('turnstile-container'); const container = document.getElementById('turnstile-container');
if (container && (window as any).turnstile) { if (container && (window as any).turnstile) {
(window as any).turnstile.render('#turnstile-container', { const widgetId = (window as any).turnstile.render('#turnstile-container', {
sitekey: siteConfig.TurnstileSiteKey, sitekey: siteConfig.TurnstileSiteKey,
callback: (token: string) => { callback: (token: string) => {
setTurnstileToken(token); setTurnstileToken(token);
}, },
}); });
setTurnstileWidgetId(widgetId);
} }
}, [turnstileLoaded, siteConfig]); }, [turnstileLoaded, siteConfig]);
@@ -183,16 +185,29 @@ function RegisterPageClient() {
// 注册成功,跳转到登录页 // 注册成功,跳转到登录页
const redirect = searchParams.get('redirect') || '/login'; const redirect = searchParams.get('redirect') || '/login';
router.replace(redirect); router.replace(redirect);
} else if (res.status === 400) {
const data = await res.json().catch(() => ({}));
setError(data.error || '注册失败');
} else if (res.status === 409) {
setError('用户名已存在');
} else { } else {
const data = await res.json().catch(() => ({})); // 注册失败,重置Turnstile
setError(data.error ?? '服务器错误'); if (siteConfig?.RegistrationRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) {
(window as any).turnstile.reset(turnstileWidgetId);
setTurnstileToken(null);
}
if (res.status === 400) {
const data = await res.json().catch(() => ({}));
setError(data.error || '注册失败');
} else if (res.status === 409) {
setError('用户名已存在');
} else {
const data = await res.json().catch(() => ({}));
setError(data.error ?? '服务器错误');
}
} }
} catch (error) { } catch (error) {
// 网络错误,重置Turnstile
if (siteConfig?.RegistrationRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) {
(window as any).turnstile.reset(turnstileWidgetId);
setTurnstileToken(null);
}
setError('网络错误,请稍后重试'); setError('网络错误,请稍后重试');
} finally { } finally {
setLoading(false); setLoading(false);