Skip to content

Commit 8296fc2

Browse files
committed
add search suggestion feature
1 parent d8990d9 commit 8296fc2

File tree

1 file changed

+49
-8
lines changed

1 file changed

+49
-8
lines changed

src/components/Navbar.jsx

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,47 @@
11
import React, { useState } from 'react';
22
import logo from '../assets/images/logo.png';
33
import { Link, useNavigate } from 'react-router-dom';
4+
import courses from './courseData'; // Assuming this is your courses object
45

56
function Navbar({ loggedin }) {
6-
const [searchTerm, setSearchTerm] = useState(''); // State for search term
7-
const navigate = useNavigate(); // useNavigate for navigation
7+
const [searchTerm, setSearchTerm] = useState('');
8+
const [suggestions, setSuggestions] = useState([]);
9+
const navigate = useNavigate();
810

911
// Handle search input change
1012
const handleSearchChange = (event) => {
11-
setSearchTerm(event.target.value);
13+
const searchInput = event.target.value;
14+
setSearchTerm(searchInput);
15+
16+
// Convert courses object to an array for filtering
17+
const coursesArray = Object.values(courses);
18+
19+
if (searchInput.trim()) {
20+
const filteredSuggestions = coursesArray.filter((course) =>
21+
course.title.toLowerCase().includes(searchInput.toLowerCase())
22+
);
23+
setSuggestions(filteredSuggestions);
24+
} else {
25+
setSuggestions([]);
26+
}
1227
};
1328

1429
// Handle search submission when "Enter" is pressed
1530
const handleSearchSubmit = (event) => {
16-
event.preventDefault(); // Prevent form submission default behavior
31+
event.preventDefault();
1732
if (searchTerm.trim()) {
18-
// Navigate to search page with the query
1933
navigate(`/search?query=${encodeURIComponent(searchTerm)}`);
20-
// setSearchTerm(''); // Optionally reset the search input after navigating
34+
setSuggestions([]); // Clear suggestions after search
2135
}
2236
};
2337

38+
// Handle suggestion click
39+
const handleSuggestionClick = (suggestion) => {
40+
setSearchTerm(suggestion.title);
41+
navigate(`/search?query=${encodeURIComponent(suggestion.title)}`);
42+
setSuggestions([]);
43+
};
44+
2445
return (
2546
<nav className="navbar navbar-expand-lg">
2647
<div className="container-fluid">
@@ -53,8 +74,10 @@ function Navbar({ loggedin }) {
5374
</ul>
5475
</li>
5576
</ul>
77+
78+
{/* Search Bar */}
5679
<div className="d-flex align-items-center flex-column flex-lg-row">
57-
<div className="me-2 mb-2 mb-lg-0">
80+
<div className="me-2 mb-2 mb-lg-0 position-relative">
5881
<form className="input-group" onSubmit={handleSearchSubmit}>
5982
<span className="input-group-text" id="basic-addon1">
6083
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" className="bi bi-search" viewBox="0 0 16 16">
@@ -69,9 +92,27 @@ function Navbar({ loggedin }) {
6992
onChange={handleSearchChange}
7093
/>
7194
</form>
95+
96+
{/* Suggestions Dropdown */}
97+
{suggestions.length > 0 && (
98+
<ul className="list-group position-absolute w-100 mt-1 z-index-1000" style={{ zIndex: '1000' }}>
99+
{suggestions.map((suggestion, index) => (
100+
<li
101+
key={index}
102+
className="list-group-item"
103+
onClick={() => handleSuggestionClick(suggestion)}
104+
style={{ cursor: 'pointer' }}
105+
>
106+
{suggestion.title}
107+
</li>
108+
))}
109+
</ul>
110+
)}
72111
</div>
112+
113+
{/* Profile or Sign up Button */}
73114
{loggedin === 'true' ? (
74-
<span><Link className="btn btn-primary clk rounded-circle" to="/profile"><i className="fa-regular fa-user"></i></Link> Profile</span>
115+
<span><Link className="btn btn-primary clk rounded-circle" to="/profile"><i className="fa-regular fa-user"></i></Link> Profile</span>
75116
) : (
76117
<Link className="btn btn-primary clk" to="/login">Sign up</Link>
77118
)}

0 commit comments

Comments
 (0)