// 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}개 완료

{/* 진행 바 */}
시작 {progress}% 완료 완료
{/* 질문 영역 */}
{/* 축 배지 */}
{currentQuestion.axisLabel} 문항 {currentIndex + 1}
{/* 질문 카드 */}
{currentIndex + 1}

{currentQuestion.question}

{currentQuestion.hint && (

{currentQuestion.hint}

)}
{/* 답변 옵션 */}
{/* 모바일: 수직 나열 / 데스크탑: 가로 나열 */}
{answerOptions.map(option => ( ))}
{/* 모바일 버전 */}
{answerOptions.map(option => ( ))}
{/* 선택 상태 표시 */} {selectedAnswer !== null && (

{answerOptions[selectedAnswer - 1]?.label} 선택됨

)} {/* 네비게이션 버튼 */}
{/* 키보드 안내 (데스크탑) */}

💡 키보드 단축키: 숫자 1-5로 선택, Enter로 다음, ← 이전

{/* 이전에 답한 문항 미니맵 */}

진행 현황

{questions.map((q, idx) => { const isAnswered = answers[q.id] !== undefined; const isCurrent = idx === currentIndex; return (
{idx + 1}
); })}
); };