"use client"; import { AlertCircleIcon, CheckIcon, ClockIcon, SaveIcon } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Spinner } from "@/components/ui/spinner"; import type { SaveState } from "@/hooks/use-manual-save"; import { cn } from "@/lib/utils"; import { FloatingSavePanel } from "./floating-save-panel"; interface SaveFeedbackProps { state: SaveState; issues?: readonly string[]; conflictVersion?: number | null; canOverwrite?: boolean; onReloadLatest?: () => void; onOverwrite?: () => void; } function SaveText({ children }: { children: string }) { const ref = useRef(null); useEffect(() => { const text = ref.current; if (!text) return; let active = true; const fit = () => { if (!active) return; text.style.removeProperty("font-size"); const width = text.clientWidth; if (width > 0 && text.scrollWidth > width) { const fontSize = Number.parseFloat(window.getComputedStyle(text).fontSize); text.style.fontSize = `${Math.floor(fontSize * width / text.scrollWidth * 10) / 10}px`; } }; fit(); const observer = typeof ResizeObserver !== "undefined" ? new ResizeObserver(fit) : null; if (text.parentElement) observer?.observe(text.parentElement); window.addEventListener("resize", fit); void document.fonts?.ready.then(fit); return () => { active = false; observer?.disconnect(); window.removeEventListener("resize", fit); }; }, [children]); return {children}; } function SaveFeedback({ state, issues = [], conflictVersion, canOverwrite = false, onReloadLatest, onOverwrite, }: SaveFeedbackProps) { const [showIssues, setShowIssues] = useState(false); if (state === "saving") return ( กำลังบันทึก… ); if (state === "unsaved") return ( ยังไม่ได้บันทึก ); if (state === "incomplete") return (
{showIssues ? ( ) : null}
); if (state === "conflict") return ( ); if (state === "error") return (
บันทึกไม่สำเร็จ
); return ( บันทึกแล้ว ); } export function SaveStatus({ canSave, onSave, ...props }: SaveFeedbackProps & { canSave: boolean; onSave: () => void }) { return ( <>
); }