diff --git a/frontend/my-react-app/src/components/Header.tsx b/frontend/my-react-app/src/components/Header.tsx index 8d13af8..379029c 100644 --- a/frontend/my-react-app/src/components/Header.tsx +++ b/frontend/my-react-app/src/components/Header.tsx @@ -21,6 +21,7 @@ const Header: React.FC = () => { const open = Boolean(anchorEl); const navigate = useNavigate(); const { isAuthenticated, logout, user } = useAuth(); + const [headerSearch, setHeaderSearch] = useState(""); {/* Gotta handle functions at the start! */} const handleClick = (event: React.MouseEvent) => { @@ -109,34 +110,60 @@ const Header: React.FC = () => { {/* Search Bar */} - - - - ), +
{ + e.preventDefault(); + const trimmed = headerSearch.trim(); + if (trimmed.length === 0) { + navigate('/events'); + } else { + navigate(`/events?search=${encodeURIComponent(trimmed)}`); + } }} - /> + > + setHeaderSearch(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Escape') { + setHeaderSearch(''); + } + }} + sx={{ + "& .MuiOutlinedInput-root": { + backgroundColor: "white", + borderRadius: "25px", + "& fieldset": { + borderColor: "var(--charcoal-25)", + }, + "&:hover fieldset": { + borderColor: "var(--fluorescent-cyan)", + }, + "&.Mui-focused fieldset": { + borderColor: "var(--fluorescent-cyan)", + }, + }, + }} + InputProps={{ + startAdornment: ( + + + + + + ), + }} + /> +
{/* User Menu */} diff --git a/frontend/my-react-app/src/pages/EventsPage.tsx b/frontend/my-react-app/src/pages/EventsPage.tsx index c5752ce..d58222e 100644 --- a/frontend/my-react-app/src/pages/EventsPage.tsx +++ b/frontend/my-react-app/src/pages/EventsPage.tsx @@ -1,5 +1,5 @@ import { useState, useMemo, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useSearchParams } from 'react-router-dom'; import { Box, Container, @@ -122,6 +122,13 @@ function EventsPage() { const [sortBy, setSortBy] = useState('date'); const [filterCategory, setFilterCategory] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); + const [searchParams, setSearchParams] = useSearchParams(); + + // Initialize search query from URL param on mount / param change + useEffect(() => { + const qp = searchParams.get('search') || ''; + setSearchQuery(qp); + }, [searchParams]); // Get min and max prices from events const { minPrice, maxPrice } = useMemo(() => { @@ -262,7 +269,17 @@ function EventsPage() { label="Search events" variant="outlined" value={searchQuery} - onChange={(e) => setSearchQuery(e.target.value)} + onChange={(e) => { + const val = e.target.value; + setSearchQuery(val); + if (val.trim().length > 0) { + setSearchParams({ search: val }); + } else { + // Remove param if empty + searchParams.delete('search'); + setSearchParams(searchParams); + } + }} placeholder="Search by title, description, or location..." />