web3.news/app/components/SimplifiedSearchBar.tsx

122 lines
3.4 KiB
TypeScript
Raw Permalink Normal View History

import React, { FormEvent, useCallback, useEffect, useState } from "react";
2023-12-18 03:18:17 +00:00
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);
const [selectedSite, setSelectedSite] = useState<any>(null);
const [selectedTime, setSelectedTime] = useState<string | null>(null);
2023-12-18 03:18:17 +00:00
const handleSearch = useCallback(
(event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
doSearch();
},
[value]
);
function doSearch() {
2023-12-18 03:18:17 +00:00
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");
return;
}
if (selectedSite) {
newSearchParams.set("site", selectedSite);
}
if (selectedTime) {
const timestampInMilliseconds = Date.parse(selectedTime); // Date.parse returns the timestamp in milliseconds
const timestamp = timestampInMilliseconds / 1000;
newSearchParams.set("time", timestamp.toString());
2023-11-14 15:52:42 +00:00
}
2023-12-18 03:18:17 +00:00
navigate(`${location.pathname}?${newSearchParams}`);
}
useEffect(() => {
doSearch();
}, [selectedSite, selectedTime]);
2023-12-18 03:18:17 +00:00
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 */}
<SitesCombobox siteList={sites} onSiteSelect={setSelectedSite} />
{/* Dropdown component should be here */}
<Select defaultValue={"0"} onValueChange={(v) => setSelectedTime(v)}>
<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;