"use client" import React, { FormEvent, useRef, useState } from "react" import { MagnifyingGlassIcon as SearchIcon, FunnelIcon as FilterIcon, ChevronDownIcon, ChevronRightIcon } from "@heroicons/react/24/outline" // Assuming usage of Heroicons for icons import { formatDistanceToNow } from "date-fns" // date-fns library used for date formatting import { flushSync } from "react-dom" // Utility function to format dates const formatDate = (date: string | Date) => { const distance = formatDistanceToNow(new Date(date), { addSuffix: true }) return distance .replace(/less than a minute?/, "<1m") .replace(/ seconds?/, "s") .replace(/ minutes?/, "m") .replace(/ hours?/, "h") .replace(/ days?/, "d") .replace(/ weeks?/, "w") } const SearchBar = () => { const inputRef = useRef() const [query, setQuery] = useState("") const [isLoading, setIsLoading] = useState(false) const [activeInput, setActiveInput] = useState(true) const [results, setResults] = useState< { id: number timestamp: Date title: string description: string }[] >([]) const handleSearch = async (event: FormEvent) => { event.preventDefault() setIsLoading(true) // Perform search and update results state // Assume fetchResults is a function that fetches search results // const searchResults = await fetchResults(query); // Mock the search results const searchResults = [ { id: 1, timestamp: new Date(), title: "Mock Title 1", description: "Mock Description 1" }, { id: 2, timestamp: new Date(), title: "Mock Title 2", description: "Mock Description 2" } ] setResults(searchResults) setIsLoading(false) setActiveInput(false) } return (
0 ? "border-sky-300 bg-gray-950" : "border-primary" }`} >
{isLoading || results.length > 0 ? ( Searching for ) : null} {activeInput ? (
{results.length > 0 ? ( {'"'} ) : ( "" )} { if (element) { inputRef.current = element } }} className={`flex-grow inline bg-transparent text-white placeholder-gray-400 outline-none ring-none ${ results.length > 0 ? `text-blue-300 p-0 underline underline-offset-4` : "w-full p-2" }`} placeholder={ results.length === 0 ? "Search for web3 news from the community" : undefined } value={query} size={query ? query.length : 1} style={ query ? { width: `calc(${query.length}ch+2px)` } : undefined } onChange={(e) => setQuery(e.target.value)} /> {results.length > 0 ? ( {'"'} ) : ( "" )}
) : ( { flushSync(() => { setActiveInput(true) }) inputRef.current?.focus() }} > {'"'} {query} {'"'} )} {isLoading ? ( // Shadcn Loading component placeholder ) : (
{/* Dropdown component should be here */}
All Sites
{/* Dropdown component should be here */}
All Times
)} {results.length > 0 && ( <>
{results.map((item) => (
{formatDate(item.timestamp)}

{item.title}

))}
)}
) } // Placeholder components for Shadcn const LoadingComponent = () => { // Replace with actual Shadcn Loading component return
Loading...
} const FilterComponent = () => { // Replace with actual Shadcn Filter component return ( ) } export default SearchBar