'use client'; import { useState, useTransition, useEffect } from 'react'; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, DragEndEvent, } from '@dnd-kit/core'; import { SortableContext, sortableKeyboardCoordinates, horizontalListSortingStrategy, arrayMove, } from '@dnd-kit/sortable'; import type { MotivatorCard as MotivatorCardType } from '@/lib/types'; import { MotivatorCard } from './MotivatorCard'; import { MotivatorSummary } from './MotivatorSummary'; import { InfluenceZone } from './InfluenceZone'; import { reorderMotivatorCards, updateCardInfluence } from '@/actions/moving-motivators'; interface MotivatorBoardProps { sessionId: string; cards: MotivatorCardType[]; canEdit: boolean; } type Step = 'ranking' | 'influence' | 'summary'; export function MotivatorBoard({ sessionId, cards: initialCards, canEdit }: MotivatorBoardProps) { const [cards, setCards] = useState(initialCards); const [step, setStep] = useState('ranking'); const [isPending, startTransition] = useTransition(); // Sync local state with props when they change (e.g., from SSE refresh) useEffect(() => { setCards(initialCards); }, [initialCards]); const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8, }, }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); // Sort cards by orderIndex const sortedCards = [...cards].sort((a, b) => a.orderIndex - b.orderIndex); function handleDragEnd(event: DragEndEvent) { const { active, over } = event; if (!over || active.id === over.id) return; const oldIndex = sortedCards.findIndex((c) => c.id === active.id); const newIndex = sortedCards.findIndex((c) => c.id === over.id); const newCards = arrayMove(sortedCards, oldIndex, newIndex).map((card, index) => ({ ...card, orderIndex: index + 1, })); setCards(newCards); // Persist to server startTransition(async () => { await reorderMotivatorCards( sessionId, newCards.map((c) => c.id) ); }); } function handleInfluenceChange(cardId: string, influence: number) { setCards((prev) => prev.map((c) => (c.id === cardId ? { ...c, influence } : c))); startTransition(async () => { await updateCardInfluence(cardId, sessionId, influence); }); } function nextStep() { if (step === 'ranking') setStep('influence'); else if (step === 'influence') setStep('summary'); } function prevStep() { if (step === 'influence') setStep('ranking'); else if (step === 'summary') setStep('influence'); } return (
{/* Progress Steps */}
setStep('ranking')} />
setStep('influence')} />
setStep('summary')} />
{/* Step Content */} {step === 'ranking' && (

Classez vos motivations par importance

Glissez les cartes de gauche (moins important) à droite (plus important)

{/* Importance axis */}
← Moins important Plus important →
{/* Cards container */}
c.id)} strategy={horizontalListSortingStrategy} >
{sortedCards.map((card) => ( ))}
{/* Next button */}
)} {step === 'influence' && (

Évaluez l'influence de chaque motivation

Pour chaque carte, indiquez si cette motivation a une influence positive ou négative sur votre situation actuelle

{/* Navigation buttons */}
)} {step === 'summary' && (

Récapitulatif de vos Moving Motivators

Voici l'analyse de vos motivations et leur impact

{/* Navigation buttons */}
)}
); } function StepIndicator({ number, label, active, completed, onClick, }: { number: number; label: string; active: boolean; completed: boolean; onClick: () => void; }) { return ( ); }