import { useState, useEffect, useRef } from 'react'; import messageDatabase from './data.json'; import './App.css'; export default function ChatDisplay() { const [isActive, setIsActive] = useState(false); const [showModal, setShowModal] = useState(true); const [currentMessageIndex, setCurrentMessageIndex] = useState( Math.floor(Math.random() * messageDatabase.length) ); const [showFeedback, setShowFeedback] = useState(false); const [message, setMessage] = useState(() => messageDatabase[currentMessageIndex].question); const [messagesSent, setMessagesSent] = useState(false); const [sentMessage, setSentMessage] = useState(''); const [isThinking, setIsThinking] = useState(false); const [userGuessCorrect, setUserGuessCorrect] = useState(false); const [showAnswer, setShowAnswer] = useState(false); const [showTopAnimation, setShowTopAnimation] = useState(false); const [animatedMessages, setAnimatedMessages] = useState({ userMessage: false, thinking: false, feedback: false }); const [reasoningButtonActive, setReasoningButtonActive] = useState(false); const [searchButtonActive, setSearchButtonActive] = useState(false); const getRandomMessageIndex = () => { let newIndex; do { newIndex = Math.floor(Math.random() * messageDatabase.length); } while (newIndex === currentMessageIndex && messageDatabase.length > 1); return newIndex; }; const loadNewQuestion = () => { const newIndex = getRandomMessageIndex(); setCurrentMessageIndex(newIndex); setMessage(messageDatabase[newIndex].question); setMessagesSent(false); setShowFeedback(false); setShowAnswer(false); setSentMessage(''); }; const isMessageTypeMatching = () => { const currentType = messageDatabase[currentMessageIndex].type; // Match reasoning type with reasoning button if (currentType === "reasoning" && reasoningButtonActive) return true; // Match search/standard type with search button if ((currentType === "search" || currentType === "standard") && searchButtonActive) return true; // Match default/standard type with no button selection if (currentType === "standard" && !reasoningButtonActive && !searchButtonActive) return true; return false; }; const handleUserGuess = () => { const isCorrect = isMessageTypeMatching(); setUserGuessCorrect(isCorrect); setShowFeedback(true); }; const handleSubmit = (e) => { e.preventDefault(); if (!message.trim()) return; // When "Send" is clicked (not in Next state) if (!messagesSent) { setSentMessage(message); setMessagesSent(true); setIsThinking(true); setMessage(''); // Clear input immediately when Send is clicked setTimeout(() => { setIsThinking(false); handleUserGuess(); }, 1500); } }; const handleKeyPress = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSubmit(e); } }; useEffect(() => { if (!messagesSent) { setAnimatedMessages({ userMessage: false, thinking: false, feedback: false }); } }, [messagesSent]); function UserMessage({ text }) { const shouldAnimate = !animatedMessages.userMessage; useEffect(() => { if (shouldAnimate) { setAnimatedMessages(prev => ({ ...prev, userMessage: true })); } }, [shouldAnimate]); return (
{text}
🎉 Congratulations! You correctly identified this as a{shouldBeReasoning ? ' reasoning' : ' standard'} prompt.
❌ Incorrect. This is a{shouldBeReasoning ? ' reasoning' : ' standard'} prompt.
{shouldBeReasoning ? "This prompt requires detailed explanation and step-by-step reasoning to solve the problem." : "This prompt requires a direct, concise answer without detailed explanation."}
Every prompt counts! Choosing the right AI model saves energy and protects our planet. 🌎✨
Play smart, pick wisely, and reduce your digital footprint! 🌱💡