import { Check, ChevronDown, GitCommit, RefreshCw, Sparkles } from 'lucide-react'; import { useState } from 'react'; import MicButton from '../../../mic-button/view/MicButton'; import type { ConfirmationRequest } from '../../types/types'; // Persists commit messages across unmount/remount, keyed by project path const commitMessageCache = new Map(); type CommitComposerProps = { isMobile: boolean; projectPath: string; selectedFileCount: number; isHidden: boolean; onCommit: (message: string) => Promise; onGenerateMessage: () => Promise; onRequestConfirmation: (request: ConfirmationRequest) => void; }; export default function CommitComposer({ isMobile, projectPath, selectedFileCount, isHidden, onCommit, onGenerateMessage, onRequestConfirmation, }: CommitComposerProps) { const [commitMessage, setCommitMessageRaw] = useState(() => commitMessageCache.get(projectPath) ?? ''); const setCommitMessage = (msg: string) => { setCommitMessageRaw(msg); if (msg) { commitMessageCache.set(projectPath, msg); } else { commitMessageCache.delete(projectPath); } }; const [isCommitting, setIsCommitting] = useState(false); const [isGeneratingMessage, setIsGeneratingMessage] = useState(false); const [isCollapsed, setIsCollapsed] = useState(isMobile); const handleCommit = async (message = commitMessage) => { const trimmedMessage = message.trim(); if (!trimmedMessage || selectedFileCount === 0 || isCommitting) { return false; } setIsCommitting(true); try { const success = await onCommit(trimmedMessage); if (success) { setCommitMessage(''); } return success; } finally { setIsCommitting(false); } }; const handleGenerateMessage = async () => { if (selectedFileCount === 0 || isGeneratingMessage) { return; } setIsGeneratingMessage(true); try { const generatedMessage = await onGenerateMessage(); if (generatedMessage) { setCommitMessage(generatedMessage); } } finally { setIsGeneratingMessage(false); } }; const requestCommitConfirmation = () => { const trimmedMessage = commitMessage.trim(); if (!trimmedMessage || selectedFileCount === 0 || isCommitting) { return; } onRequestConfirmation({ type: 'commit', message: `Commit ${selectedFileCount} file${selectedFileCount !== 1 ? 's' : ''} with message: "${trimmedMessage}"?`, onConfirm: async () => { await handleCommit(trimmedMessage); }, }); }; return (
{isMobile && isCollapsed ? (
) : (
{isMobile && (
Commit Changes
)}