|
|
| 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; |
|
|