feat: make birth-time rectification a soft homepage flow

This commit is contained in:
Jesse_Chen
2026-07-21 06:28:47 +08:00
parent 5c8d965f16
commit fc1e9f1085
11 changed files with 727 additions and 115 deletions
@@ -69,7 +69,7 @@ export function BirthTimeIntakeFields({ value, onPatch }: BirthTimeIntakeProps)
</div>
<dl>
<div>
<dt>{displayState.kind === "candidate" ? "当前工作排盘时间" : "当前排盘时间"}</dt>
<dt>{displayState.kind === "candidate" ? "待验证候选时间" : "当前排盘时间"}</dt>
<dd>{displayState.activeTime}</dd>
</div>
<div>
@@ -78,7 +78,7 @@ export function BirthTimeIntakeFields({ value, onPatch }: BirthTimeIntakeProps)
</div>
</dl>
{displayState.kind === "candidate" && (
<p></p>
<p>使</p>
)}
</section>
)}
@@ -0,0 +1,75 @@
"use client";
import { useId } from "react";
type UnverifiedBirthTimeChoiceProps = Readonly<{
canUseUnverifiedTime: boolean;
unverifiedTime?: string | null;
pending?: boolean;
onUseUnverifiedTime: () => void;
onRectifyFirst: () => void;
onCancel: () => void;
}>;
export function UnverifiedBirthTimeChoice({
canUseUnverifiedTime,
unverifiedTime,
pending = false,
onUseUnverifiedTime,
onRectifyFirst,
onCancel,
}: UnverifiedBirthTimeChoiceProps) {
const titleId = useId();
const descriptionId = useId();
return (
<section
aria-busy={pending}
aria-describedby={descriptionId}
aria-labelledby={titleId}
aria-live="polite"
className="onboarding-card birth-time-transition-card"
role="dialog"
>
<div className="onboarding-card-heading">
<b id={titleId}></b>
<small>使 Jyotisha</small>
</div>
<p id={descriptionId}>
{canUseUnverifiedTime
? "你可以只在当前聊天临时使用填报时间,也可以先完成生时校正再问。新建聊天后会再次温和提醒。"
: "你目前没有可直接使用的具体分钟,系统不会替你猜一个时间。可以先校正再继续这个问题。"}
</p>
<div className="onboarding-card-actions">
{canUseUnverifiedTime && (
<button
className="button-secondary"
disabled={pending}
type="button"
onClick={onUseUnverifiedTime}
>
{unverifiedTime
? `先用 ${unverifiedTime}(未校正)询问`
: "先用未校正时间询问"}
</button>
)}
<button
className="button-primary"
disabled={pending}
type="button"
onClick={onRectifyFirst}
>
{pending ? "正在进入生时校正…" : "先校正再询问"}
</button>
<button
className="button-secondary"
disabled={pending}
type="button"
onClick={onCancel}
>
</button>
</div>
</section>
);
}