'use client'; import { forwardRef, useState, useTransition, useRef, ReactNode } from 'react'; import type { SwotCategory } from '@prisma/client'; import { createSwotItem } from '@/actions/swot'; import { QuadrantHelpPanel } from './QuadrantHelp'; interface SwotQuadrantProps { category: SwotCategory; title: string; icon: string; sessionId: string; isDraggingOver: boolean; children: ReactNode; } const categoryStyles: Record = { STRENGTH: { bg: 'bg-strength-bg', border: 'border-strength-border', text: 'text-strength', }, WEAKNESS: { bg: 'bg-weakness-bg', border: 'border-weakness-border', text: 'text-weakness', }, OPPORTUNITY: { bg: 'bg-opportunity-bg', border: 'border-opportunity-border', text: 'text-opportunity', }, THREAT: { bg: 'bg-threat-bg', border: 'border-threat-border', text: 'text-threat', }, }; export const SwotQuadrant = forwardRef( ({ category, title, icon, sessionId, isDraggingOver, children, ...props }, ref) => { const [isAdding, setIsAdding] = useState(false); const [newContent, setNewContent] = useState(''); const [isPending, startTransition] = useTransition(); const [showHelp, setShowHelp] = useState(false); const isSubmittingRef = useRef(false); const styles = categoryStyles[category]; async function handleAdd() { if (isSubmittingRef.current || !newContent.trim()) { setIsAdding(false); return; } isSubmittingRef.current = true; startTransition(async () => { await createSwotItem(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 */}
{icon}

{title}

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