import { useState, useEffect } from 'react' import Header from './components/Header' import Sidebar from './components/Sidebar' import Feed from './pages/Feed' import CreatePost from './pages/CreatePost' import History from './pages/History' import Settings from './pages/Settings' import Search from './pages/Search' import PostDetail from './pages/PostDetail' import { api } from './api' export default function App() { const [activeTab, setActiveTab] = useState('feed') const [user, setUser] = useState(null) const [showLogin, setShowLogin] = useState(true) const [loginEmail, setLoginEmail] = useState('') const [loginPassword, setLoginPassword] = useState('') const [isRegistering, setIsRegistering] = useState(false) const [loginError, setLoginError] = useState(null) const [searchQuery, setSearchQuery] = useState('') const [headerSearchQuery, setHeaderSearchQuery] = useState('') const [viewingPostId, setViewingPostId] = useState(null) // Check for saved user on mount useEffect(() => { const savedUser = localStorage.getItem('voicevault_user') if (savedUser) { try { const userData = JSON.parse(savedUser) setUser(userData) api.setUserId(userData.user_id) setShowLogin(false) } catch (err) { console.error('Failed to parse saved user:', err) localStorage.removeItem('voicevault_user') } } }, []) const handleLogin = async (e) => { e.preventDefault() setLoginError(null) try { const response = isRegistering ? await api.register(loginEmail, loginPassword, loginEmail.split('@')[0]) : await api.login(loginEmail, loginPassword) setUser(response.user) localStorage.setItem('voicevault_user', JSON.stringify(response.user)) setShowLogin(false) setLoginEmail('') setLoginPassword('') } catch (err) { setLoginError(err.message) } } const handleLogout = () => { setUser(null) localStorage.removeItem('voicevault_user') setShowLogin(true) setActiveTab('feed') setViewingPostId(null) } const handleSearch = async (query) => { setSearchQuery(query) if (query.trim() && user?.user_id) { try { const results = await api.searchRAG(query, user.user_id) console.log('Search results:', results) // You could display these results in a modal or separate view } catch (err) { console.error('Search error:', err) } } } const handleNavigateToSearch = (query) => { setActiveTab('search') setHeaderSearchQuery(query) setViewingPostId(null) // Clear any post detail view } const handleViewPost = (postId) => { setViewingPostId(postId) } const handleBackFromPost = () => { setViewingPostId(null) } const handleTabChange = (tab) => { setActiveTab(tab) setViewingPostId(null) } const handlePostCreated = () => { // Switch to feed after creating a post setActiveTab('feed') setViewingPostId(null) } const handleUserUpdate = (updatedUser) => { setUser(updatedUser) localStorage.setItem('voicevault_user', JSON.stringify(updatedUser)) } // Render current page const renderPage = () => { if (!user) return null // If viewing a specific post, show PostDetail if (viewingPostId) { return } switch (activeTab) { case 'create': return case 'search': return case 'history': return case 'settings': return default: return } } // Login/Register Screen if (showLogin) { return (

VoiceVault

Archive your audio memories

{loginError && (
{loginError}
)}
setLoginEmail(e.target.value)} placeholder="your@email.com" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#f4b840] focus:border-transparent" required />
setLoginPassword(e.target.value)} placeholder="••••••••" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#f4b840] focus:border-transparent" required />
) } // Main App return (
{renderPage()}
) }