// js/components/DiagnosisQuestions.jsx // 24개 진단 질문 페이지 window.DiagnosisQuestions = function({ productInfo, onComplete, onBack }) { const { useState, useCallback, useEffect } = React; const questions = window.PCODE_QUESTIONS; const helpers = window.PCODE_HELPERS; const totalQuestions = questions.length; const [currentIndex, setCurrentIndex] = useState(0); const [answers, setAnswers] = useState({}); const [selectedAnswer, setSelectedAnswer] = useState(null); const [isAnimating, setIsAnimating] = useState(false); const currentQuestion = questions[currentIndex]; const progress = Math.round(((currentIndex + 1) / totalQuestions) * 100); const answeredCount = Object.keys(answers).length; // 현재 질문의 저장된 답변 로드 useEffect(() => { if (currentQuestion) { setSelectedAnswer(answers[currentQuestion.id] || null); } }, [currentIndex, currentQuestion, answers]); // 답변 선택 const handleSelectAnswer = useCallback((score) => { setSelectedAnswer(score); }, []); // 다음 질문 const handleNext = useCallback(() => { if (selectedAnswer === null) return; const newAnswers = { ...answers, [currentQuestion.id]: selectedAnswer }; setAnswers(newAnswers); if (currentIndex < totalQuestions - 1) { setIsAnimating(true); setTimeout(() => { setCurrentIndex(prev => prev + 1); setIsAnimating(false); }, 200); } else { // 마지막 질문 완료 onComplete(newAnswers); } }, [selectedAnswer, answers, currentQuestion, currentIndex, totalQuestions, onComplete]); // 이전 질문 const handlePrev = useCallback(() => { if (currentIndex > 0) { setIsAnimating(true); setTimeout(() => { setCurrentIndex(prev => prev - 1); setIsAnimating(false); }, 200); } else { onBack(); } }, [currentIndex, onBack]); // 키보드 단축키 useEffect(() => { const handleKeyPress = (e) => { if (e.key >= '1' && e.key <= '5') { handleSelectAnswer(parseInt(e.key)); } else if (e.key === 'Enter' && selectedAnswer !== null) { handleNext(); } else if (e.key === 'ArrowLeft') { handlePrev(); } }; window.addEventListener('keydown', handleKeyPress); return () => window.removeEventListener('keydown', handleKeyPress); }, [handleSelectAnswer, handleNext, handlePrev, selectedAnswer]); // 축별 색상 const axisColors = { US: { bg: 'from-blue-500 to-pink-500', badge: 'bg-blue-100 text-blue-700', text: 'text-blue-600' }, TC: { bg: 'from-green-500 to-yellow-500', badge: 'bg-green-100 text-green-700', text: 'text-green-600' }, FE: { bg: 'from-red-500 to-purple-500', badge: 'bg-red-100 text-red-700', text: 'text-red-600' }, PG: { bg: 'from-gray-500 to-yellow-500', badge: 'bg-gray-100 text-gray-700', text: 'text-gray-600' }, }; const axisColor = axisColors[currentQuestion.axis] || axisColors.US; // 답변 옵션 const answerOptions = [ { score: 1, label: '전혀 아니다', emoji: '😞', short: '매우\n아님', color: 'hover:border-red-400 hover:bg-red-50', selectedColor: 'border-red-400 bg-red-50 ring-red-200' }, { score: 2, label: '아니다', emoji: '🙁', short: '아님', color: 'hover:border-orange-400 hover:bg-orange-50', selectedColor: 'border-orange-400 bg-orange-50 ring-orange-200' }, { score: 3, label: '중립', emoji: '😐', short: '중립', color: 'hover:border-gray-400 hover:bg-gray-50', selectedColor: 'border-gray-400 bg-gray-50 ring-gray-200' }, { score: 4, label: '그렇다', emoji: '🙂', short: '그렇다', color: 'hover:border-blue-400 hover:bg-blue-50', selectedColor: 'border-blue-400 bg-blue-50 ring-blue-200' }, { score: 5, label: '매우 그렇다', emoji: '😄', short: '매우\n그렇다', color: 'hover:border-indigo-400 hover:bg-indigo-50', selectedColor: 'border-indigo-400 bg-indigo-50 ring-indigo-200' }, ]; return (
{productInfo.productName}
{productInfo.category}
{currentIndex + 1} / {totalQuestions}
{answeredCount}개 완료
{currentQuestion.hint}
)}{answerOptions[selectedAnswer - 1]?.label} 선택됨
💡 키보드 단축키: 숫자 1-5로 선택, Enter로 다음, ← 이전
{/* 이전에 답한 문항 미니맵 */}진행 현황