提交 Turnstile 集成源文件改动

This commit is contained in:
2569718930@qq.com
2026-06-16 03:49:49 +08:00
parent e896ffa7ac
commit a94e6ecaf9
8 changed files with 147 additions and 7 deletions
@@ -11,6 +11,8 @@ import {
getSupabaseBrowserClient,
hasSupabasePublicEnv,
} from "@/lib/supabase/client";
import { TurnstileWidget } from "@/components/security/TurnstileWidget";
import { getTurnstileTokenForAction, isTurnstileEnabled } from "@/lib/turnstile-client";
import type { UserFeedbackEntry } from "@/types/ops";
export type FeedbackCategory = "bug" | "data" | "idea" | "payment" | "account" | "other";
@@ -111,6 +113,8 @@ export function UserFeedbackModal({
const [submitting, setSubmitting] = useState(false);
const [error, setError] = useState("");
const [submitted, setSubmitted] = useState(false);
const [turnstileToken, setTurnstileToken] = useState("");
const [turnstileResetKey, setTurnstileResetKey] = useState(0);
useEffect(() => {
if (!open) return;
@@ -120,6 +124,8 @@ export function UserFeedbackModal({
setLoginEmailContact("");
setError("");
setSubmitted(false);
setTurnstileToken("");
setTurnstileResetKey((value) => value + 1);
}, [open, draft?.category]);
useEffect(() => {
@@ -158,13 +164,20 @@ export function UserFeedbackModal({
if (!open) return null;
const canSubmit = message.trim().length >= 3 && !submitting;
const canSubmit =
message.trim().length >= 3 &&
!submitting &&
(!isTurnstileEnabled() || Boolean(turnstileToken));
const submit = async () => {
if (!canSubmit) return;
setSubmitting(true);
setError("");
try {
const turnstile_token = getTurnstileTokenForAction(
turnstileToken,
"feedback_submit",
);
const res = await fetch("/api/feedback", {
method: "POST",
headers: { "Content-Type": "application/json" },
@@ -174,6 +187,7 @@ export function UserFeedbackModal({
contact: contact.trim() || undefined,
source: draft?.source || "terminal",
context: buildRuntimeContext(draft?.context || {}),
turnstile_token,
}),
});
if (!res.ok) {
@@ -188,6 +202,8 @@ export function UserFeedbackModal({
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
setError(message.slice(0, 220));
setTurnstileToken("");
setTurnstileResetKey((value) => value + 1);
} finally {
setSubmitting(false);
}
@@ -296,6 +312,12 @@ export function UserFeedbackModal({
: "会自动附带终端上下文:城市、槽位、数据源状态、浏览器和会话诊断信息。"}
</div>
<TurnstileWidget
action="feedback_submit"
onToken={setTurnstileToken}
resetKey={turnstileResetKey}
/>
{error && (
<div className="rounded border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700">
{isEn ? "Submit failed: " : "提交失败:"}{error}