feat: implement time filter
This commit is contained in:
parent
0c404bd3b1
commit
917511a449
|
@ -32,6 +32,7 @@ const SearchBar = ({ sites }: { sites: SiteList }) => {
|
||||||
const [dirtyInput, setDirtyInput] = useState(false);
|
const [dirtyInput, setDirtyInput] = useState(false);
|
||||||
const [results, setResults] = useState<SearchResult[]>([]);
|
const [results, setResults] = useState<SearchResult[]>([]);
|
||||||
const [selectedSite, setSelectedSite] = useState(null);
|
const [selectedSite, setSelectedSite] = useState(null);
|
||||||
|
const [selectedTime, setSelectedTime] = useState<string | null>(null);
|
||||||
|
|
||||||
const fetcher = useFetcher({ key: "seach" });
|
const fetcher = useFetcher({ key: "seach" });
|
||||||
|
|
||||||
|
@ -58,6 +59,12 @@ const SearchBar = ({ sites }: { sites: SiteList }) => {
|
||||||
newSearchParams.set("site", 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());
|
||||||
|
}
|
||||||
|
|
||||||
fetcher.load(`/api/search?${newSearchParams}`);
|
fetcher.load(`/api/search?${newSearchParams}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +78,7 @@ const SearchBar = ({ sites }: { sites: SiteList }) => {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
doSearch();
|
doSearch();
|
||||||
}, [selectedSite]);
|
}, [selectedSite, selectedTime]);
|
||||||
|
|
||||||
const isActive = results.length > 0 || dirtyInput;
|
const isActive = results.length > 0 || dirtyInput;
|
||||||
|
|
||||||
|
@ -159,7 +166,10 @@ const SearchBar = ({ sites }: { sites: SiteList }) => {
|
||||||
{/* Dropdown component should be here */}
|
{/* Dropdown component should be here */}
|
||||||
<SitesCombobox siteList={sites} onSiteSelect={setSelectedSite} />
|
<SitesCombobox siteList={sites} onSiteSelect={setSelectedSite} />
|
||||||
{/* Dropdown component should be here */}
|
{/* Dropdown component should be here */}
|
||||||
<Select defaultValue={"0"}>
|
<Select
|
||||||
|
defaultValue={"0"}
|
||||||
|
onValueChange={(v) => setSelectedTime(v)}
|
||||||
|
>
|
||||||
<SelectTrigger className="hover:bg-muted w-auto">
|
<SelectTrigger className="hover:bg-muted w-auto">
|
||||||
<SelectValue placeholder="Time ago" />
|
<SelectValue placeholder="Time ago" />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
|
|
|
@ -12,7 +12,17 @@ export const prisma = (globalForPrisma.prisma || new PrismaClient()).$extends({
|
||||||
|
|
||||||
// Index the created record in MeiliSearch
|
// Index the created record in MeiliSearch
|
||||||
const index = search.index("articles");
|
const index = search.index("articles");
|
||||||
await index.addDocuments([createdRecord]);
|
const timestampInMilliseconds = Date.parse(
|
||||||
|
createdRecord.createdAt as any
|
||||||
|
); // Date.parse returns the timestamp in milliseconds
|
||||||
|
const timestamp = timestampInMilliseconds / 1000;
|
||||||
|
await index.addDocuments([
|
||||||
|
{
|
||||||
|
...createdRecord,
|
||||||
|
|
||||||
|
createdTimestamp: timestamp,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
return createdRecord;
|
return createdRecord;
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,9 +13,19 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const site = searchParams.get("site");
|
const site = searchParams.get("site");
|
||||||
|
const time = searchParams.get("time");
|
||||||
|
|
||||||
|
let filters = [];
|
||||||
|
|
||||||
|
if (site) {
|
||||||
|
filters.push(`siteKey = ${site}`);
|
||||||
|
}
|
||||||
|
if (time) {
|
||||||
|
filters.push(`createdTimestamp >= ${parseInt(time).toString()}`);
|
||||||
|
}
|
||||||
|
|
||||||
const results = await search.index("articles").search(query, {
|
const results = await search.index("articles").search(query, {
|
||||||
filter: site ? `siteKey = ${site}` : undefined,
|
filter: filters.length ? filters.join(" AND ") : undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
return results.hits.map((item) => {
|
return results.hits.map((item) => {
|
||||||
|
|
Loading…
Reference in New Issue