'use client'; import { useState, ReactNode } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Pencil, X, Check, Loader2 } from 'lucide-react'; interface EditableSectionProps { title: string; description?: string; icon?: ReactNode; children: ReactNode; editForm?: ReactNode; onSave?: () => Promise; onCancel?: () => void; isEditing?: boolean; onEditChange?: (isEditing: boolean) => void; canEdit?: boolean; className?: string; } export function EditableSection({ title, description, icon, children, editForm, onSave, onCancel, isEditing: externalIsEditing, onEditChange, canEdit = true, className = '', }: EditableSectionProps) { const [internalIsEditing, setInternalIsEditing] = useState(false); const [isSaving, setIsSaving] = useState(false); // Use external or internal state const isEditing = externalIsEditing ?? internalIsEditing; const setIsEditing = onEditChange ?? setInternalIsEditing; const handleSave = async () => { if (!onSave) return; setIsSaving(true); try { await onSave(); setIsEditing(false); } catch (error) { console.error('Error saving:', error); } finally { setIsSaving(false); } }; const handleCancel = () => { onCancel?.(); setIsEditing(false); }; return (
{icon} {title} {description && {description}}
{canEdit && !isEditing && ( )}
{isEditing && editForm ? (
{editForm}
) : ( children )}
); } // Simple inline edit buttons for list items interface ItemActionsProps { onEdit?: () => void; onDelete?: () => void; isDeleting?: boolean; } export function ItemActions({ onEdit, onDelete, isDeleting }: ItemActionsProps) { return (
{onEdit && ( )} {onDelete && ( )}
); }