import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { ArrowDown, ArrowUp, GripVertical } from 'lucide-react'; import { useEffect, useMemo, useState } from 'react'; interface Props { question: ExamQuestion; answer: any; onAnswerChange: (answer: any) => void; } interface OrderingItem { id: number; text: string; } const OrderingQuestion = ({ question, answer, onAnswerChange }: Props) => { const rawItems = question.options?.items || []; const items = useMemo(() => { return rawItems.map((item: any, index: number) => { if (typeof item === 'string') { return { id: index, text: item }; } if (item && typeof item === 'object') { const text = typeof item.text === 'string' ? item.text : typeof item.label === 'string' ? item.label : ''; return { id: index, text }; } return { id: index, text: '' }; }); }, [rawItems]); const defaultOrderedItems = useMemo(() => { const buildFromOrder = (order: number[] | undefined) => { if (!order || order.length !== items.length) { return null; } const uniqueCount = new Set(order).size; if (uniqueCount !== items.length) { return null; } const mapped = order.map((id) => items.find((item) => item.id === Number(id))).filter((item): item is OrderingItem => Boolean(item)); return mapped.length === items.length ? mapped : null; }; const fromAnswer = buildFromOrder(answer?.order as number[] | undefined); if (fromAnswer) { return fromAnswer; } const fromCorrectOrder = buildFromOrder(question.options?.correct_order as number[] | undefined); if (fromCorrectOrder) { return fromCorrectOrder; } return [...items].sort(() => Math.random() - 0.5); }, [answer?.order, question.options?.correct_order, items]); const [orderedItems, setOrderedItems] = useState(defaultOrderedItems); useEffect(() => { setOrderedItems(defaultOrderedItems); }, [defaultOrderedItems]); const updateAnswer = (newItems: OrderingItem[]) => { setOrderedItems(newItems); onAnswerChange({ order: newItems.map((item) => item.id), }); }; const moveItem = (index: number, direction: 'up' | 'down') => { if ((direction === 'up' && index === 0) || (direction === 'down' && index === orderedItems.length - 1)) { return; } const newItems = [...orderedItems]; const swapIndex = direction === 'up' ? index - 1 : index + 1; [newItems[index], newItems[swapIndex]] = [newItems[swapIndex], newItems[index]]; updateAnswer(newItems); }; const shuffleItems = () => { const shuffled = [...orderedItems].sort(() => Math.random() - 0.5); updateAnswer(shuffled); }; return (

Arrange the following items in the correct order:

{orderedItems.map((item, index) => (
{index + 1}

{item.text}

))}

Tip: Use the arrow buttons to move items up or down.

); }; export default OrderingQuestion;