fix(reports): trust verified proxy origin
Staging Backend Quality Gate / validate (push) Successful in 12m13s
Staging Backend Quality Gate / publish (push) Has been cancelled

This commit is contained in:
Jesse_Chen
2026-08-09 00:54:55 +08:00
parent 32b683ebef
commit 17430a1f21
12 changed files with 148 additions and 45 deletions
@@ -21,6 +21,7 @@ import { useRef, useState } from "react";
import { useRouter } from "next/navigation";
import { FileText } from "lucide-react";
import { toast } from "sonner";
export const DEFAULT_REPORT_THEMES = ["career", "marriage", "wealth", "timing"] as const;
@@ -155,7 +156,6 @@ export function GeneratePersonalReportButton({
}: GeneratePersonalReportButtonProps) {
const router = useRouter();
const [submitting, setSubmitting] = useState(false);
const [notice, setNotice] = useState<string | null>(null);
const inFlight = useRef(false);
async function handleGenerate() {
@@ -164,11 +164,10 @@ export function GeneratePersonalReportButton({
}
inFlight.current = true;
setSubmitting(true);
setNotice(null);
try {
const requestId = createReportRequestId();
if (requestId === null) {
setNotice("请使用支持安全请求标识的现代浏览器。");
toast.error("请使用支持安全请求标识的现代浏览器。");
return;
}
const body = buildPersonalReportCreateRequest(requestId, sessionId);
@@ -189,9 +188,9 @@ export function GeneratePersonalReportButton({
router.push(`/reports/${encodeURIComponent(outcome.reportId)}`);
return;
}
setNotice(outcome.message);
toast.error(outcome.message);
} catch {
setNotice("网络异常,请检查连接后重试。");
toast.error("网络异常,请检查连接后重试。");
} finally {
inFlight.current = false;
setSubmitting(false);
@@ -203,31 +202,15 @@ export function GeneratePersonalReportButton({
: "生成个人报告;服务端将校验本次咨询是否存在可用证据,无证据时会提示。";
return (
<div className="flex flex-wrap items-center gap-2">
<button
type="button"
className="inline-flex items-center gap-1.5 rounded-lg border border-border bg-canvas px-3 py-1.5 text-sm text-ink transition-colors hover:bg-canvas-muted disabled:pointer-events-none disabled:opacity-50"
onClick={() => void handleGenerate()}
disabled={submitting}
title={title}
aria-describedby="personal-report-entry-note"
>
<FileText aria-hidden="true" className="size-4" />
{submitting ? "正在生成…" : "生成个人报告"}
</button>
{notice !== null ? (
<span id="personal-report-entry-note" role="status" className="max-w-56 text-xs text-warning">
{notice}
</span>
) : evidenceState === "unknown" ? (
<span id="personal-report-entry-note" className="max-w-56 text-xs text-ink-tertiary">
</span>
) : (
<span id="personal-report-entry-note" className="sr-only">
</span>
)}
</div>
<button
type="button"
className="inline-flex min-h-11 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-lg border border-border bg-canvas px-3 py-1.5 text-sm text-ink transition-colors hover:bg-canvas-muted disabled:pointer-events-none disabled:opacity-50"
onClick={() => void handleGenerate()}
disabled={submitting}
title={title}
>
<FileText aria-hidden="true" className="size-4" />
{submitting ? "正在生成…" : "生成个人报告"}
</button>
);
}