'use client'; import { useState } from 'react'; import Link from 'next/link'; import { CalendarIcon, FileTextIcon, PlusIcon, SearchIcon } from 'lucide-react'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { Dialog, DialogClose, DialogContent, DialogHeader, DialogTitle, } from '@kit/ui/dialog'; import { Input } from '@kit/ui/input'; import { Progress } from '@kit/ui/progress'; import type { CreatePRDData } from '../_lib/schemas/create-prd.schema'; import { createPRDAction } from '../_lib/server/prd-server-actions'; import { CreatePRDForm } from './create-prd-form'; interface PRDSummary { filename: string; title: string; lastUpdated: string; progress: number; totalStories: number; completedStories: number; } interface PRDManagerClientProps { initialPrds: PRDSummary[]; } export function PRDManagerClient({ initialPrds }: PRDManagerClientProps) { const [prds, setPrds] = useState(initialPrds); const [searchTerm, setSearchTerm] = useState(''); const [showCreateForm, setShowCreateForm] = useState(false); const handleCreatePRD = async (data: CreatePRDData) => { const result = await createPRDAction(data); if (result.success && result.data) { const newPRD: PRDSummary = { filename: result.data.filename, title: result.data.title, lastUpdated: result.data.lastUpdated, progress: result.data.progress, totalStories: result.data.totalStories, completedStories: result.data.completedStories, }; setPrds((prev) => [...prev, newPRD]); setShowCreateForm(false); // Note: In a production app, you might want to trigger a router.refresh() // to reload the server component and get the most up-to-date data } else { // Error handling will be managed by the form component via the action result throw new Error(result.error || 'Failed to create PRD'); } }; const filteredPrds = prds.filter( (prd) => prd.title.toLowerCase().includes(searchTerm.toLowerCase()) || prd.filename.toLowerCase().includes(searchTerm.toLowerCase()), ); return (
{/* Header with search and create button */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* PRD List */} {filteredPrds.length === 0 ? (

{searchTerm ? 'No PRDs match your search' : 'No PRDs found'}

{!searchTerm && ( )}
) : (
{filteredPrds.map((prd) => ( {prd.title} {/* Progress */}
Progress {prd.completedStories}/{prd.totalStories} stories
{prd.progress}%
{/* Metadata */}
Updated {prd.lastUpdated}
{/* Filename */}
{prd.filename}
))}
)} {/* Create PRD Form Modal */} {showCreateForm && ( Create New PRD
)}
); }