diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index ffaa97f..a6564e5 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5,6 +5,7 @@ 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 { api } from './api' export default function App() { @@ -16,6 +17,7 @@ export default function App() { const [isRegistering, setIsRegistering] = useState(false) const [loginError, setLoginError] = useState(null) const [searchQuery, setSearchQuery] = useState('') + const [headerSearchQuery, setHeaderSearchQuery] = useState('') // Check for saved user on mount useEffect(() => { @@ -38,10 +40,10 @@ export default function App() { setLoginError(null) try { - const response = isRegistering + 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) @@ -61,7 +63,7 @@ export default function App() { const handleSearch = async (query) => { setSearchQuery(query) - + if (query.trim() && user?.user_id) { try { const results = await api.searchRAG(query, user.user_id) @@ -73,6 +75,11 @@ export default function App() { } } + const handleNavigateToSearch = (query) => { + setActiveTab('search') + setHeaderSearchQuery(query) + } + const handlePostCreated = () => { // Switch to feed after creating a post setActiveTab('feed') @@ -90,6 +97,8 @@ export default function App() { switch (activeTab) { case 'create': return + case 'search': + return case 'history': return case 'settings': @@ -165,8 +174,8 @@ export default function App() { }} className="text-sm text-gray-600 hover:text-gray-900" > - {isRegistering - ? 'Already have an account? Log in' + {isRegistering + ? 'Already have an account? Log in' : "Don't have an account? Register"} @@ -178,10 +187,10 @@ export default function App() { // Main App return (
-
+
- +
{renderPage()} diff --git a/frontend/src/components/AudioPostCard.jsx b/frontend/src/components/AudioPostCard.jsx index a36b40d..5dc8a2c 100644 --- a/frontend/src/components/AudioPostCard.jsx +++ b/frontend/src/components/AudioPostCard.jsx @@ -178,6 +178,12 @@ export default function AudioPostCard({ post }) { }`}> {post.status} + + {post.language && ( + + {post.language.toUpperCase()} + + )}
{post.status === 'ready' && ( @@ -205,6 +211,8 @@ export default function AudioPostCard({ post }) { + + {/* Description */} {post.description && (

@@ -212,6 +220,7 @@ export default function AudioPostCard({ post }) {

)} + {/* Audio Player - Only show if ready */} {post.status === 'ready' && ( <> @@ -325,15 +334,6 @@ export default function AudioPostCard({ post }) {

Failed to process this recording. Please try uploading again.

)} - - {/* Language Tag */} - {post.language && ( -
- - {post.language.toUpperCase()} - -
- )} ) diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 63c26b4..ca291f5 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -1,13 +1,21 @@ import { Search, LogOut } from 'lucide-react' import { useState } from 'react' -export default function Header({ onSearch, onLogout }) { +export default function Header({ onSearch, onLogout, onNavigateToSearch }) { const [searchQuery, setSearchQuery] = useState('') const handleSearch = (e) => { - const query = e.target.value - setSearchQuery(query) - onSearch?.(query) + e.preventDefault() + if (searchQuery.trim()) { + onNavigateToSearch?.(searchQuery.trim()) + onSearch?.(searchQuery.trim()) + } + } + + const handleKeyPress = (e) => { + if (e.key === 'Enter') { + handleSearch(e) + } } return ( @@ -24,18 +32,19 @@ export default function Header({ onSearch, onLogout }) { {/* Center: Search Bar */} -
+
setSearchQuery(e.target.value)} + onKeyPress={handleKeyPress} className="w-full bg-gray-50 border border-gray-300 rounded-lg pl-10 pr-4 py-2 text-sm text-gray-900 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#f4b840] focus:border-transparent" />
-
+ {/* Right: Logout */}
diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx index 3ade81c..753c1e1 100644 --- a/frontend/src/components/Sidebar.jsx +++ b/frontend/src/components/Sidebar.jsx @@ -1,9 +1,10 @@ -import { Plus, Home, History, Settings } from 'lucide-react' +import { Plus, Home, History, Settings, Search } from 'lucide-react' export default function Sidebar({ user, activeTab, onTabChange }) { const navItems = [ { id: 'create', label: 'Make an Archive Post', icon: Plus }, { id: 'feed', label: 'My Feed', icon: Home }, + { id: 'search', label: 'Search Archives', icon: Search }, { id: 'history', label: 'History', icon: History }, { id: 'settings', label: 'Settings', icon: Settings } ] @@ -23,7 +24,7 @@ export default function Sidebar({ user, activeTab, onTabChange }) { } return 'U' } - + return (