fix(小宝预警): 保证建议不为空并显示更新中

This commit is contained in:
Script Generator
2026-06-30 14:55:13 +08:00
parent 1daa2f7ec4
commit b365ce65a3
7 changed files with 356 additions and 17 deletions

View File

@@ -1,9 +1,10 @@
'use client';
import { CalendarClock, Sparkles, X } from 'lucide-react';
import { CalendarClock, Loader2, Sparkles, X } from 'lucide-react';
import type { XiaobaoVersionRisk } from '@/lib/xiaobao-risk';
import { formatDateTime } from '@/lib/format';
import { formatRemainingWork } from '@/lib/xiaobao-warning-view';
import { buildRuleBasedRiskInsight } from '@/lib/xiaobao-risk-suggestion';
export function XiaobaoWarningDrawer({
risk,
@@ -22,6 +23,7 @@ export function XiaobaoWarningDrawer({
...(evidence?.todayRisks ?? []),
...(evidence?.progressNotes ?? []),
];
const aiInsight = risk.aiInsight ?? buildRuleBasedRiskInsight(risk);
return (
<div className="fixed inset-0 z-50 flex justify-end bg-black/40">
@@ -95,16 +97,17 @@ export function XiaobaoWarningDrawer({
</Section>
<Section title="小宝建议">
{risk.aiInsight ? (
{risk.aiInsightUpdating && <InsightUpdatingNotice source={risk.aiInsightSource} />}
{aiInsight ? (
<div className="space-y-2">
<div className="rounded-lg border border-[var(--line)] bg-[var(--bg-card)] p-3">
<p className="flex items-start gap-1.5 text-[12px] font-medium text-[var(--ink)]">
<Sparkles className="mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--accent)]" />
<span>{risk.aiInsight.summary}</span>
<span>{aiInsight.summary}</span>
</p>
<p className="mt-2 text-[12px] leading-5 text-[var(--ink-soft)]">{risk.aiInsight.forecast}</p>
<p className="mt-2 text-[12px] leading-5 text-[var(--ink-soft)]">{aiInsight.forecast}</p>
</div>
{risk.aiInsight.suggestedActions.map((action) => (
{aiInsight.suggestedActions.map((action) => (
<div key={action} className="rounded-lg border border-[var(--line)] bg-[var(--bg-card)] p-3 text-[12px] leading-5 text-[var(--ink-soft)]">
{action}
</div>
@@ -146,6 +149,18 @@ function Section({ title, children }: { title: string; children: React.ReactNode
);
}
function InsightUpdatingNotice({ source }: { source?: XiaobaoVersionRisk['aiInsightSource'] }) {
const detail = source === 'previous_ai'
? '当前先显示上一条建议,生成完成后会自动替换。'
: '当前先显示规则建议,生成完成后会自动替换。';
return (
<div className="flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-[12px] leading-5 text-amber-800">
<Loader2 className="mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin" />
<span>{detail}</span>
</div>
);
}
function Empty({ text }: { text: string }) {
return (
<div className="rounded-lg border border-dashed border-[var(--line)] bg-[var(--bg-card)] p-3 text-[12px] text-[var(--ink-muted)]">