fix: decouple AI completion from history save failures and improve history API errors

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-16 21:31:20 +08:00
parent 123a5cce6d
commit 187b08c3e1
8 changed files with 145 additions and 53 deletions
+10 -2
View File
@@ -17,7 +17,7 @@ import RegionSelect, {
useRegionLocation,
} from "@/components/shared/region-select";
import { streamAiCompletion } from "@/lib/ai/client-stream";
import { saveHistoryEntry } from "@/lib/history/storage";
import { saveHistoryEntrySafe } from "@/lib/history/storage";
import type { GuaResult } from "@/lib/calc/hexagram";
import todayJson from "@/lib/data/today.json";
@@ -34,6 +34,7 @@ export default function LiuyaoForm() {
const [guaData, setGuaData] = useState<GuaResult | null>(null);
const [completion, setCompletion] = useState("");
const [error, setError] = useState("");
const [warning, setWarning] = useState("");
const [isLoading, setIsLoading] = useState(false);
const location = useRegionLocation(provinceCode, cityCode);
@@ -65,6 +66,7 @@ export default function LiuyaoForm() {
}
setError("");
setWarning("");
setCompletion("");
setIsLoading(true);
@@ -86,7 +88,7 @@ export default function LiuyaoForm() {
},
setCompletion,
);
await saveHistoryEntry({
const saveResult = await saveHistoryEntrySafe({
mode: "liuyao",
title: guaData!.result.guaTitle,
question,
@@ -104,6 +106,9 @@ export default function LiuyaoForm() {
卦象: guaData!.result.guaTitle,
},
});
if (!saveResult.ok) {
setWarning(saveResult.error);
}
} catch (e) {
setError(e instanceof Error ? e.message : String(e));
} finally {
@@ -122,6 +127,7 @@ export default function LiuyaoForm() {
setGuaData(null);
setCompletion("");
setError("");
setWarning("");
setIsLoading(false);
}
@@ -129,6 +135,7 @@ export default function LiuyaoForm() {
setGuaData(data);
setCompletion("");
setError("");
setWarning("");
}
const downloadPreamble =
@@ -145,6 +152,7 @@ export default function LiuyaoForm() {
isLoading={isLoading}
onCompletion={handleAnalyze}
error={error}
warning={warning}
emptyHint="完成起卦后,点击「AI 解读」"
downloadFilename={
completion && guaData