'use client'; import { useState } from 'react'; import styles from './FeedbackWidget.module.css'; export default function FeedbackWidget({ imageHash, predictedId, top5, isOodScreen, onFeedbackSuccess }) { const [feedbackState, setFeedbackState] = useState('idle'); const [errorMessage, setErrorMessage] = useState(''); const sendFeedback = async (isCorrect, userCorrectionId = null) => { setFeedbackState('submitting'); try { const response = await fetch('/api/feedback', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ image_hash: imageHash, predicted_id: predictedId, is_correct: isCorrect, user_correction_id: userCorrectionId, is_ood_screen: isOodScreen || false }) }); if (!response.ok) { if (response.status === 429) { throw new Error("Muitas requisições. Tente novamente mais tarde."); } throw new Error("Erro ao salvar feedback"); } setFeedbackState('success'); if (onFeedbackSuccess) { onFeedbackSuccess(isCorrect); } setTimeout(() => { setFeedbackState('hidden'); }, 3000); } catch (error) { setFeedbackState('error'); setErrorMessage(error.message); setTimeout(() => setFeedbackState('idle'), 4000); } }; if (feedbackState === 'hidden') { return null; } if (feedbackState === 'success') { return (
Feedback sent, thank you!
); } return (
{feedbackState === 'idle' || feedbackState === 'error' ? (
{isOodScreen ? "Did PokedexNet get this right?" : "Was this prediction accurate?"} {feedbackState === 'error' && {errorMessage}}
) : feedbackState === 'submitting' ? (
Sending feedback...
) : feedbackState === 'dislike_menu' ? (
What Pokémon is it really?
{top5 && top5.slice(1).map(pred => ( ))}
) : null} {(feedbackState === 'idle' || feedbackState === 'error' || feedbackState === 'dislike_menu') && ( By submitting feedback, your image may be anonymously stored for model improvement. )}
); }