- Global toast stack (success/error/info) replacing hidden notice/syncError - Shared Modal: focus trap, Escape, focus restore, scroll lock; all dialogs migrated - ConfirmDialog tone prop; limit-override now warning-styled - Single-entry delete now requires confirmation, per-row busy spinner - Onboarding no longer closes on failed save; inline error + skip option
34 lines
935 B
TypeScript
34 lines
935 B
TypeScript
import { AlertTriangle, Loader2 } from "lucide-react";
|
|
import type { SetupStatus } from "../types";
|
|
|
|
type StatusRailProps = {
|
|
busyAction: string | null;
|
|
setupStatus: SetupStatus;
|
|
};
|
|
|
|
export function StatusRail({ busyAction, setupStatus }: StatusRailProps) {
|
|
if (!busyAction && setupStatus.state === "ok") return null;
|
|
return (
|
|
<div className="mt-3 grid gap-2">
|
|
{busyAction && (
|
|
<div className="status-card">
|
|
<Loader2 className="animate-spin" size={17} aria-hidden="true" />
|
|
Working on {actionLabel(busyAction)}...
|
|
</div>
|
|
)}
|
|
{setupStatus.state === "error" && (
|
|
<div className="status-card status-card--warning">
|
|
<AlertTriangle size={17} aria-hidden="true" />
|
|
{setupStatus.message}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function actionLabel(value: string) {
|
|
return value
|
|
.replace(/^quick-/, "quick add ")
|
|
.replace(/-/g, " ");
|
|
}
|