import { useState, useEffect, useRef } from "react"; import "./css/searchBar.scss"; interface SearchBarProps { placeholder: string; children?: React.ReactNode; searchQuery: string; onQueryChange: (query: string) => void; isExpanded: boolean; onToggleExpanded: () => void; leftIcon?: string | React.ReactNode; rightIcon?: string | React.ReactNode; } export default function SearchBar({ placeholder, children, searchQuery, onQueryChange, isExpanded, onToggleExpanded, leftIcon = "search--outlined", rightIcon = null }: SearchBarProps) { const [dynamicHeight, setDynamicHeight] = useState("48px"); const searchContainerRef = useRef(null); const inputRef = useRef(null); const parentContainerRef = useRef(null); // Focus input when expanded and manage height useEffect(() => { if (isExpanded && inputRef.current) { inputRef.current.focus(); // Set expanded height const leftPanel = document.getElementById('chat-list'); if (leftPanel) { const panelHeight = leftPanel.offsetHeight; setDynamicHeight(`${panelHeight}px`); } } else { // Set collapsed height setDynamicHeight("48px"); } }, [isExpanded]); function handleToggle() { onToggleExpanded(); }; function handleQueryChange(e: React.ChangeEvent) { const query = e.target.value; onQueryChange(query); }; // Helper function to render icon function renderIcon(icon: string | React.ReactNode | undefined, defaultIcon?: string) { if (icon === null) return null; if (!icon) { return defaultIcon ? : null; } else if (typeof icon === 'string') { return ; } else { return icon; } }; return (
{/* Single Search Bar Element */}
{/* Left Icon */}
{renderIcon(leftIcon, "search--outlined")}
{/* Input/Placeholder */}
{isExpanded ? ( e.stopPropagation()} /> ) : ( {placeholder} )}
{/* Right Icon */}
{renderIcon(rightIcon)}
{/* Results Section - Only visible when expanded */} {isExpanded && (
{children}
)}
); }