web3.news/app/components/SimplifiedSearchBar.tsx

98 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-12-18 03:18:17 +00:00
import React, { FormEvent, useState } from "react";
import { useLocation, useNavigate } from "@remix-run/react";
import {
Select,
SelectContent,
SelectTrigger,
SelectItem,
SelectValue,
} from "./ui/select";
import { SitesCombobox } from "./SitesCombobox";
import { FILTER_TIMES } from "@/utils";
2023-12-22 09:42:21 +00:00
import { SiteList } from "@/types.js";
2023-11-14 15:52:42 +00:00
type Props = {
2023-12-18 03:18:17 +00:00
value: string;
placeholder?: string;
className?: string;
2023-12-05 14:03:21 +00:00
filters?: {
2023-12-18 03:18:17 +00:00
sites: { value: string; label: string }[];
};
2023-12-22 09:42:21 +00:00
sites: SiteList;
2023-12-18 03:18:17 +00:00
};
2023-11-14 15:52:42 +00:00
const SimplifiedSearchBar = ({
value: initialValue,
placeholder,
2023-12-05 14:03:21 +00:00
filters,
2023-12-18 03:18:17 +00:00
className,
2023-12-22 09:42:21 +00:00
sites,
2023-11-14 15:52:42 +00:00
}: Props) => {
2023-12-18 03:18:17 +00:00
let navigate = useNavigate();
let location = useLocation();
const [value, setValue] = useState<string>(initialValue);
2023-11-14 15:52:42 +00:00
const handleSearch = (event: FormEvent<HTMLFormElement>) => {
2023-12-18 03:18:17 +00:00
event.preventDefault();
const newSearchParams = new URLSearchParams(location.search);
2023-11-14 15:52:42 +00:00
if (value) {
2023-12-18 03:18:17 +00:00
newSearchParams.set("q", value);
2023-11-14 15:52:42 +00:00
} else {
2023-12-18 03:18:17 +00:00
newSearchParams.delete("q");
2023-11-14 15:52:42 +00:00
}
2023-12-18 03:18:17 +00:00
navigate(`${location.pathname}?${newSearchParams}`);
};
2023-11-14 15:52:42 +00:00
return (
<form
2023-12-18 03:18:17 +00:00
className={`flex items-center text-lg border-b border-primary pb-2 ${className}`}
2023-11-14 15:52:42 +00:00
onSubmit={handleSearch}
>
<div className="flex-1 flex flex-row max-w-full">
<span className="text-white mr-2">results: </span>
<fieldset
className={`${
value && value !== ""
? `after:content-['"'] before:content-['"'] relative after:absolute after:-right-1`
: "w-full"
} text-primary ${className}`}
2023-11-14 15:52:42 +00:00
>
<input
className={`flex-grow inline bg-transparent placeholder-gray-400 outline-none ring-none text-primary ${
value && value !== "" ? "" : "w-full"
}`}
2023-11-14 15:52:42 +00:00
placeholder={placeholder}
value={value}
onChange={(e) => setValue(e.target.value)}
size={value.length}
/>
</fieldset>
</div>
<div className="w-56 flex gap-2">
{/* Dropdown component should be here */}
2023-12-22 09:42:21 +00:00
<SitesCombobox siteList={sites} />
{/* Dropdown component should be here */}
<Select defaultValue={"0"}>
<SelectTrigger className="hover:bg-muted w-auto">
<SelectValue placeholder="Time ago" />
</SelectTrigger>
<SelectContent>
{FILTER_TIMES.map((v) => (
<SelectItem
value={String(v.value)}
key={`FilteTimeSelectItem_${v.value}`}
>
{v.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
2023-11-14 15:52:42 +00:00
</form>
2023-12-18 03:18:17 +00:00
);
};
2023-11-14 15:52:42 +00:00
2023-12-18 03:18:17 +00:00
export default SimplifiedSearchBar;