You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.4 KiB
TypeScript

// frontend/components/inbox/CaptureRow.tsx
"use client";
import { Icon } from "@/components/Icon";
import type { IconName } from "@/components/icons/paths";
import type { UiInboxItem } from "@/lib/types";
import ReasonLine from "./ReasonLine";
import RouteChips from "./RouteChips";
export default function CaptureRow({
item: c,
onConfirm,
onReType,
}: {
item: UiInboxItem;
onConfirm: (id: string) => void;
onReType: (id: string) => void;
}) {
const kindIcon: IconName = c.kind === "voice" ? "mic" : c.kind === "image" ? "image" : "pen";
const canAct = c.status === "classified"; // 원본의 new(분류 완료, 액션 가능)
return (
<div className={"sb-cap" + (c.fresh ? " fresh" : "")}>
<div className={"cap-k " + c.kind}>
<Icon name={kindIcon} />
</div>
<div className="sb-body">
<div className="sb-raw">{c.raw}</div>
{c.status === "thinking" ? (
<div className="sb-think" role="status" aria-live="polite">
<span className="tdot" />
<span className="tdot" />
<span className="tdot" />
</div>
) : c.status === "error" ? (
<div className="sb-err" role="alert">
.{" "}
<button className="sb-retry" onClick={() => onReType(c.id)}>
</button>
</div>
) : c.classification ? (
<>
<RouteChips r={c.classification} editable={canAct} onReType={() => onReType(c.id)} />
<ReasonLine reason={c.classification.reason} fallbackUsed={c.fallbackUsed} />
{canAct && (
<div className="sb-acts">
<button className="sb-ok" onClick={() => onConfirm(c.id)}>
<Icon name="tick" w={3} />
,
</button>
<button className="sb-alt" onClick={() => onReType(c.id)}>
<Icon name="swap" />
</button>
</div>
)}
</>
) : null}
</div>
<span className="cap-time">
{c.status === "confirmed" ? (
<span className="sb-done">
<Icon name="tick" w={3} />
</span>
) : (
c.time
)}
</span>
</div>
);
}