web3.news/app/utils.ts

77 lines
1.9 KiB
TypeScript
Raw Permalink Normal View History

2023-12-18 03:45:17 +00:00
import { formatDistanceToNow, subDays, subMonths, subYears } from "date-fns";
2023-12-22 09:11:03 +00:00
import { type ClassValue, clsx } from "clsx";
2023-12-18 03:45:17 +00:00
import { twMerge } from "tailwind-merge";
2023-12-22 09:11:03 +00:00
import { SearchResult, SiteList } from "@/types.js";
import fs from "fs";
2023-12-25 02:13:29 +00:00
import search from "./lib/search.js";
2023-12-05 14:03:21 +00:00
export function cn(...inputs: ClassValue[]) {
2023-12-18 03:45:17 +00:00
return twMerge(clsx(inputs));
2023-12-05 14:03:21 +00:00
}
2023-11-14 15:52:42 +00:00
// Utility function to format dates
export const formatDate = (date: string | Date) => {
2023-12-18 03:45:17 +00:00
const _date = new Date(date);
const distance = formatDistanceToNow(_date, { addSuffix: true });
return distance
.replace(/less than a minute?/, "<1m")
.replace(/ minutes?/, "m")
.replace(/ hours?/, "h")
.replace(/ days?/, "d")
2023-12-18 03:45:17 +00:00
.replace(/ weeks?/, "w");
};
export async function getResults({
2023-12-18 03:45:17 +00:00
query,
site,
time,
}: {
2023-12-18 03:45:17 +00:00
query?: string;
site?: string;
time?: string;
}): Promise<SearchResult[]> {
2023-12-22 11:05:06 +00:00
if (!query) {
return [];
}
let filters = [];
if (site) {
filters.push(`site = ${site}`);
}
if (time) {
filters.push(`createdTimestamp >= ${parseInt(time).toString()}`);
}
const results = await search.index("articles").search(query, {
filter: filters.length ? filters.join(" AND ") : undefined,
});
2023-12-22 11:05:06 +00:00
return results.hits.map((item) => {
return {
id: item.id,
2023-12-25 02:11:49 +00:00
cid: item.cid,
2023-12-22 11:05:06 +00:00
timestamp: item.createdAt,
title: item.title,
description: "",
slug: item.slug,
};
});
}
2023-12-05 14:03:21 +00:00
2023-12-18 03:45:17 +00:00
export function getAvailableSites() {
2023-12-22 09:11:03 +00:00
return JSON.parse(
fs.readFileSync("sites.json", { encoding: "utf8" })
) as SiteList;
}
export const FILTER_TIMES = [
{ value: 0, label: "All Times" },
{ value: subDays(new Date(), 1), label: "1d ago" },
{ value: subDays(new Date(), 7), label: "7d ago" },
{ value: subDays(new Date(), 15), label: "15d ago" },
{ value: subMonths(new Date(), 1), label: "1m ago" },
{ value: subMonths(new Date(), 6), label: "6m ago" },
2023-12-18 03:45:17 +00:00
{ value: subYears(new Date(), 1), label: "1y ago" },
];