"use client"; import React, { useCallback, useMemo } from "react"; import { Save, RefreshCw, Download, AlertTriangle, CheckCircle2, Hash, GitBranch, Sparkles, } from "lucide-react"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { Separator } from "~/components/ui/separator"; import { cn } from "~/lib/utils"; import { useDesignerStore } from "../state/store"; export interface BottomStatusBarProps { onSave?: () => void; onValidate?: () => void; onExport?: () => void; onOpenCommandPalette?: () => void; onRecalculateHash?: () => void; className?: string; saving?: boolean; validating?: boolean; exporting?: boolean; lastSavedAt?: Date; } export function BottomStatusBar({ onSave, onValidate, onExport, className, saving, validating, exporting, }: BottomStatusBarProps) { const steps = useDesignerStore((s) => s.steps); const lastPersistedHash = useDesignerStore((s) => s.lastPersistedHash); const currentDesignHash = useDesignerStore((s) => s.currentDesignHash); const lastValidatedHash = useDesignerStore((s) => s.lastValidatedHash); const pendingSave = useDesignerStore((s) => s.pendingSave); const actionCount = useMemo( () => steps.reduce((sum, st) => sum + st.actions.length, 0), [steps], ); const hasUnsaved = useMemo( () => Boolean(currentDesignHash) && currentDesignHash !== lastPersistedHash && !pendingSave, [currentDesignHash, lastPersistedHash, pendingSave], ); const validationStatus = useMemo<"unvalidated" | "valid" | "drift">(() => { if (!currentDesignHash || !lastValidatedHash) return "unvalidated"; if (currentDesignHash !== lastValidatedHash) return "drift"; return "valid"; }, [currentDesignHash, lastValidatedHash]); const validationBadge = (() => { switch (validationStatus) { case "valid": return (
Valid
); case "drift": return (
Modified
); default: return (
Unvalidated
); } })(); const unsavedBadge = hasUnsaved && !pendingSave ? ( Unsaved ) : null; const savingIndicator = pendingSave || saving ? (
Saving...
) : null; return (
{/* Status Indicators */}
{validationBadge} {unsavedBadge} {savingIndicator}
{/* Stats */}
{steps.length} {actionCount}
{/* Actions */}
); } export default BottomStatusBar;