"use client"; import { useCallback, useState } from "react"; import { IconGitCommit, IconGitPullRequest, IconCloudDownload, IconCloudUpload, IconGitCherryPick, IconGitMerge, IconDots, IconCheck, IconLoader2, IconAlertTriangle, } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose, } from "@kandev/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from "@kandev/ui/dropdown-menu"; import { Input } from "@kandev/ui/input"; import { Textarea } from "@kandev/ui/textarea"; import { Checkbox } from "@kandev/ui/checkbox"; import { Label } from "@kandev/ui/label"; import { useGitOperations } from "@/hooks/use-git-operations"; import { useSessionGit } from "@/hooks/domains/session/use-session-git"; import type { FileInfo } from "@/lib/state/slices"; import { useToast } from "@/components/toast-provider"; import { CommitSummary, MobilePRBranchSummary, PRSubmitButton, } from "./session-mobile-top-bar-dialog-parts"; export function computeUncommittedStats(files: Record | undefined) { let additions = 0; let deletions = 0; if (files) { for (const file of Object.values(files) as FileInfo[]) { additions += file.additions || 0; deletions += file.deletions || 0; } } return { additions, deletions, count: files ? Object.keys(files).length : 0 }; } type GitOperationRunner = () => Promise<{ success: boolean; output: string; error?: string }>; function useGitToast() { const { toast } = useToast(); return useCallback( async (operation: GitOperationRunner, operationName: string) => { try { const result = await operation(); if (result.success) { toast({ title: `${operationName} successful`, description: result.output.slice(0, 200) || `${operationName} completed successfully`, variant: "success", }); } else { toast({ title: `${operationName} failed`, description: result.error || "An error occurred", variant: "error", }); } } catch (error) { toast({ title: `${operationName} failed`, description: error instanceof Error ? error.message : "An unexpected error occurred", variant: "error", }); } }, [toast], ); } function useCommitDialogForm( onOpenChange: (open: boolean) => void, onCommit: (message: string, stageAll: boolean) => void, ) { const [commitMessage, setCommitMessage] = useState(""); const [commitBody, setCommitBody] = useState(""); const [stageAll, setStageAll] = useState(true); const handleOpen = (isOpen: boolean) => { if (isOpen) { setCommitMessage(""); setCommitBody(""); setStageAll(true); } onOpenChange(isOpen); }; const handleCommit = () => { const title = commitMessage.trim(); const body = commitBody.trim(); const fullMessage = body ? `${title}\n\n${body}` : title; onCommit(fullMessage, stageAll); }; return { commitMessage, setCommitMessage, commitBody, setCommitBody, stageAll, setStageAll, handleOpen, handleCommit, }; } export function CommitDialog({ open, onOpenChange, uncommittedCount, uncommittedAdditions, uncommittedDeletions, isGitLoading, onCommit, }: { open: boolean; onOpenChange: (open: boolean) => void; uncommittedCount: number; uncommittedAdditions: number; uncommittedDeletions: number; isGitLoading: boolean; onCommit: (message: string, stageAll: boolean) => void; }) { const form = useCommitDialogForm(onOpenChange, onCommit); return ( Commit Changes
form.setCommitMessage(e.target.value)} autoFocus />