import { useState } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { GitCommit, Loader2 } from "lucide-react"; import { getElectronAPI } from "@/lib/electron"; import { toast } from "sonner"; interface WorktreeInfo { path: string; branch: string; isMain: boolean; hasChanges?: boolean; changedFilesCount?: number; } interface CommitWorktreeDialogProps { open: boolean; onOpenChange: (open: boolean) => void; worktree: WorktreeInfo | null; onCommitted: () => void; } export function CommitWorktreeDialog({ open, onOpenChange, worktree, onCommitted, }: CommitWorktreeDialogProps) { const [message, setMessage] = useState(""); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const handleCommit = async () => { if (!worktree || !message.trim()) return; setIsLoading(true); setError(null); try { const api = getElectronAPI(); if (!api?.worktree?.commit) { setError("Worktree API not available"); return; } const result = await api.worktree.commit(worktree.path, message); if (result.success && result.result) { if (result.result.committed) { toast.success("Changes committed", { description: `Commit ${result.result.commitHash} on ${result.result.branch}`, }); onCommitted(); onOpenChange(false); setMessage(""); } else { toast.info("No changes to commit", { description: result.result.message, }); } } else { setError(result.error || "Failed to commit changes"); } } catch (err) { setError(err instanceof Error ? err.message : "Failed to commit"); } finally { setIsLoading(false); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && e.metaKey && !isLoading && message.trim()) { handleCommit(); } }; if (!worktree) return null; return ( Commit Changes Commit changes in the{" "} {worktree.branch} {" "} worktree. {worktree.changedFilesCount && ( ({worktree.changedFilesCount} file {worktree.changedFilesCount > 1 ? "s" : ""} changed) )}