'use client'; import { forwardRef, useState, useTransition, useRef, ReactNode } from 'react'; import type { YearReviewCategory } from '@prisma/client'; import { createYearReviewItem } from '@/actions/year-review'; import { YEAR_REVIEW_BY_CATEGORY } from '@/lib/types'; interface YearReviewSectionProps { category: YearReviewCategory; sessionId: string; isDraggingOver: boolean; children: ReactNode; } export const YearReviewSection = forwardRef( ({ category, sessionId, isDraggingOver, children, ...props }, ref) => { const [isAdding, setIsAdding] = useState(false); const [newContent, setNewContent] = useState(''); const [isPending, startTransition] = useTransition(); const isSubmittingRef = useRef(false); const config = YEAR_REVIEW_BY_CATEGORY[category]; async function handleAdd() { if (isSubmittingRef.current || !newContent.trim()) { setIsAdding(false); return; } isSubmittingRef.current = true; startTransition(async () => { await createYearReviewItem(sessionId, { content: newContent.trim(), category, }); setNewContent(''); setIsAdding(false); isSubmittingRef.current = false; }); } function handleKeyDown(e: React.KeyboardEvent) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleAdd(); } else if (e.key === 'Escape') { setIsAdding(false); setNewContent(''); } } return (
{/* Header */}
{config.icon}

{config.title}

{config.description}

{/* Items */}
{children} {/* Add Form */} {isAdding && (