From 4ebe79d9f7a7b33dfb47e2065ab40c40b308546f Mon Sep 17 00:00:00 2001 From: Sam Chau Date: Thu, 9 Jan 2025 05:25:49 +1030 Subject: [PATCH] feat: enhance SearchBar component with enter key functionality and active search display --- .../src/components/ui/DataBar/DataBar.jsx | 14 +++- .../src/components/ui/DataBar/SearchBar.jsx | 84 ++++++++++++++----- 2 files changed, 75 insertions(+), 23 deletions(-) diff --git a/frontend/src/components/ui/DataBar/DataBar.jsx b/frontend/src/components/ui/DataBar/DataBar.jsx index fedb1ce..3e10cb3 100644 --- a/frontend/src/components/ui/DataBar/DataBar.jsx +++ b/frontend/src/components/ui/DataBar/DataBar.jsx @@ -34,6 +34,8 @@ const DataBar = ({ className }) => { const [isFloating, setIsFloating] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); + const [activeSearch, setActiveSearch] = useState(''); useEffect(() => { const handleScroll = () => { @@ -44,12 +46,22 @@ const DataBar = ({ return () => window.removeEventListener('scroll', handleScroll); }, []); + const handleSearch = term => { + setActiveSearch(term); + onSearch(term); + }; + const controls = ( <>
diff --git a/frontend/src/components/ui/DataBar/SearchBar.jsx b/frontend/src/components/ui/DataBar/SearchBar.jsx index cc974e4..1d9cc21 100644 --- a/frontend/src/components/ui/DataBar/SearchBar.jsx +++ b/frontend/src/components/ui/DataBar/SearchBar.jsx @@ -4,14 +4,14 @@ import {Search, X} from 'lucide-react'; const SearchBar = ({ onSearch, placeholder = 'Search...', - value = '', - className = '' + className = '', + requireEnter = false, + searchTerm, + setSearchTerm, + activeSearch, + setActiveSearch }) => { - const [searchTerm, setSearchTerm] = useState(value); - - useEffect(() => { - setSearchTerm(value); - }, [value]); + const [isFocused, setIsFocused] = useState(false); useEffect(() => { const handleKeyDown = e => { @@ -31,32 +31,72 @@ const SearchBar = ({ const handleChange = e => { const newValue = e.target.value; setSearchTerm(newValue); - onSearch(newValue); + if (!requireEnter) { + onSearch(newValue); + setActiveSearch(newValue); + } + }; + + const handleKeyPress = e => { + if (requireEnter && e.key === 'Enter' && searchTerm.trim()) { + onSearch(searchTerm); + setActiveSearch(searchTerm); + setSearchTerm(''); + } }; const clearSearch = () => { setSearchTerm(''); + setActiveSearch(''); onSearch(''); }; return (
- - {searchTerm && ( + +
+ {activeSearch ? ( +
+ + {activeSearch} + + +
+ ) : ( + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + placeholder={placeholder} + className='w-full bg-transparent text-gray-900 dark:text-gray-100 + placeholder:text-gray-500 dark:placeholder:text-gray-400 + focus:outline-none' + /> + )} +
+ + {searchTerm && !activeSearch && (