'use client'; import { useState, useEffect } 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 { Markdown } from '@/components/ui/markdown'; import { Label } from '@/components/ui/label'; import { Feature } from '@/store/app-store'; import { Check, RefreshCw, Edit2, Eye } from 'lucide-react'; import { Spinner } from '@/components/ui/spinner'; interface PlanApprovalDialogProps { open: boolean; onOpenChange: (open: boolean) => void; feature: Feature | null; planContent: string; onApprove: (editedPlan?: string) => void; onReject: (feedback?: string) => void; isLoading?: boolean; viewOnly?: boolean; } export function PlanApprovalDialog({ open, onOpenChange, feature, planContent, onApprove, onReject, isLoading = false, viewOnly = false, }: PlanApprovalDialogProps) { const [isEditMode, setIsEditMode] = useState(false); const [editedPlan, setEditedPlan] = useState(planContent); const [showRejectFeedback, setShowRejectFeedback] = useState(false); const [rejectFeedback, setRejectFeedback] = useState(''); // Reset state when dialog opens or plan content changes useEffect(() => { if (open) { setEditedPlan(planContent); setIsEditMode(false); setShowRejectFeedback(false); setRejectFeedback(''); } }, [open, planContent]); const handleApprove = () => { // Only pass edited plan if it was modified const wasEdited = editedPlan !== planContent; onApprove(wasEdited ? editedPlan : undefined); }; const handleReject = () => { if (showRejectFeedback) { onReject(rejectFeedback.trim() || undefined); } else { setShowRejectFeedback(true); } }; const handleCancelReject = () => { setShowRejectFeedback(false); setRejectFeedback(''); }; const handleClose = (open: boolean) => { if (!open && !isLoading) { onOpenChange(false); } }; return ( {viewOnly ? 'View Plan' : 'Review Plan'} {viewOnly ? 'View the generated plan for this feature.' : 'Review the generated plan before implementation begins.'} {feature && ( Feature: {feature.description.slice(0, 150)} {feature.description.length > 150 ? '...' : ''} )}
{/* Mode Toggle - Only show when not in viewOnly mode */} {!viewOnly && (
)} {/* Plan Content */}
{isEditMode && !viewOnly ? (