Smart-Search / client /components /SearchResultsList.tsx
prithivMLmods's picture
Upload 39 files
a7634ef verified
import { useEffect, useState } from "react";
import { SearchResults } from "../modules/search";
import { Tooltip } from "react-tooltip";
import Markdown from "markdown-to-jsx";
export function SearchResultsList({
searchResults,
urlsDescriptions,
}: {
searchResults: SearchResults;
urlsDescriptions: Record<string, string>;
}) {
const [windowWidth, setWindowWidth] = useState(self.innerWidth);
useEffect(() => {
const handleResize = () => {
setWindowWidth(self.innerWidth);
};
self.addEventListener("resize", handleResize);
return () => {
self.removeEventListener("resize", handleResize);
};
}, []);
const shouldDisplayDomainBelowTitle = windowWidth < 720;
return (
<ul>
{searchResults.map(([title, snippet, url], index) => (
<li key={url}>
<Tooltip
id={`search-result-${index}`}
place="top-start"
variant="info"
opacity="1"
style={{ width: "75vw", maxWidth: "600px" }}
>
{snippet}
<br />
<br />
{url}
</Tooltip>
<div
style={{
display: "flex",
justifyContent: "space-between",
gap: shouldDisplayDomainBelowTitle ? 0 : "1rem",
flexDirection: shouldDisplayDomainBelowTitle ? "column" : "row",
}}
>
<a
href={url}
data-tooltip-id={`search-result-${index}`}
target="_blank"
>
{title}
</a>
<a href={url} target="_blank">
<cite
style={{
fontSize: "small",
color: "gray",
whiteSpace: "nowrap",
}}
>
{new URL(url).hostname.replace("www.", "")}
</cite>
</a>
</div>
{urlsDescriptions[url] && (
<blockquote>
<Markdown>{urlsDescriptions[url]}</Markdown>
</blockquote>
)}
</li>
))}
</ul>
);
}