|
|
|
|
|
import React, { useState, useEffect } from 'react'; |
|
|
import ChatInterface from './components/ChatInterface'; |
|
|
import { LanguageProvider } from './contexts/LanguageContext'; |
|
|
import LanguageSelector from './components/LanguageSelector'; |
|
|
import FeedbackPage from './components/FeedbackPage'; |
|
|
import UserFeedbackAnalysisPage from './components/UserFeedbackAnalysisPage'; |
|
|
import { Review } from './types'; |
|
|
|
|
|
function App() { |
|
|
const [page, setPage] = useState<'chat' | 'feedback' | 'userexperience'>('chat'); |
|
|
|
|
|
|
|
|
const [reviews, setReviews] = useState<Review[]>(() => { |
|
|
try { |
|
|
const storedReviews = window.localStorage.getItem('emotimate-reviews'); |
|
|
return storedReviews ? JSON.parse(storedReviews) : []; |
|
|
} catch (error) { |
|
|
console.error("Error reading reviews from localStorage", error); |
|
|
return []; |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
try { |
|
|
window.localStorage.setItem('emotimate-reviews', JSON.stringify(reviews)); |
|
|
} catch (error) { |
|
|
console.error("Error saving reviews to localStorage", error); |
|
|
} |
|
|
}, [reviews]); |
|
|
|
|
|
const handleAddReview = (review: Omit<Review, 'id' | 'date'>) => { |
|
|
const newReview: Review = { |
|
|
...review, |
|
|
id: `User-${Math.random().toString(36).substr(2, 4).toUpperCase()}`, |
|
|
date: new Date().toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }), |
|
|
}; |
|
|
setReviews(prev => [...prev, newReview]); |
|
|
}; |
|
|
|
|
|
const handleDeleteReview = (reviewId: string) => { |
|
|
setReviews(prev => prev.filter(review => review.id !== reviewId)); |
|
|
}; |
|
|
|
|
|
const buttonClasses = "text-sm sm:text-base text-slate-600 hover:text-blue-600 font-medium transition-colors px-3 py-2 rounded-lg hover:bg-slate-200"; |
|
|
|
|
|
return ( |
|
|
<LanguageProvider> |
|
|
<div className="flex flex-col h-screen bg-slate-100 font-sans"> |
|
|
<header className="w-full bg-white shadow-md px-4 py-3 sm:p-4 z-10"> |
|
|
<div className="max-w-4xl mx-auto flex justify-between items-center"> |
|
|
<h1 className="text-xl sm:text-2xl font-bold bg-gradient-to-r from-blue-500 to-violet-500 text-transparent bg-clip-text">EmotiMate</h1> |
|
|
<div className="flex items-center gap-2 sm:gap-4"> |
|
|
{page === 'chat' && ( |
|
|
<> |
|
|
<LanguageSelector /> |
|
|
<button onClick={() => setPage('feedback')} className={buttonClasses} aria-label="Go to feedback page"> |
|
|
Feedback |
|
|
</button> |
|
|
<button onClick={() => setPage('userexperience')} className={buttonClasses} aria-label="Go to user experience page"> |
|
|
User Experience |
|
|
</button> |
|
|
</> |
|
|
)} |
|
|
{page === 'feedback' && ( |
|
|
<> |
|
|
<button onClick={() => setPage('userexperience')} className={buttonClasses} aria-label="Go to user experience page"> |
|
|
User Experience |
|
|
</button> |
|
|
<button onClick={() => setPage('chat')} className={buttonClasses} aria-label="Go back to home page"> |
|
|
Home |
|
|
</button> |
|
|
</> |
|
|
)} |
|
|
{page === 'userexperience' && ( |
|
|
<> |
|
|
<button onClick={() => setPage('feedback')} className={buttonClasses} aria-label="Go to feedback page"> |
|
|
Feedback |
|
|
</button> |
|
|
<button onClick={() => setPage('chat')} className={buttonClasses} aria-label="Go back to home page"> |
|
|
Home |
|
|
</button> |
|
|
</> |
|
|
)} |
|
|
</div> |
|
|
</div> |
|
|
</header> |
|
|
<main className="flex-grow overflow-auto custom-scrollbar"> |
|
|
{page === 'chat' && <ChatInterface />} |
|
|
{page === 'feedback' && <FeedbackPage onGoHome={() => setPage('chat')} onAddReview={handleAddReview} />} |
|
|
{page === 'userexperience' && <UserFeedbackAnalysisPage reviews={reviews} onDeleteReview={handleDeleteReview} />} |
|
|
</main> |
|
|
</div> |
|
|
</LanguageProvider> |
|
|
); |
|
|
} |
|
|
|
|
|
export default App; |
|
|
|