feat: better searching

This commit is contained in:
max_richter 2025-01-21 00:10:05 +01:00
parent cd511c9f0d
commit 287230c996
2 changed files with 32 additions and 24 deletions

View File

@ -23,11 +23,15 @@ export function Link(
}
useEffect(() => {
clearTimeout(globalThis.loadingTimeout);
delete globalThis.loadingTimeout;
setTimeout(() => {
if (globalThis.loadingTimeout) {
clearTimeout(globalThis.loadingTimeout);
delete globalThis.loadingTimeout;
setTimeout(() => {
document.querySelector("main")?.classList.remove("loading");
}, 100);
} else {
document.querySelector("main")?.classList.remove("loading");
}, 100);
}
});
return (

View File

@ -53,39 +53,43 @@ const isResource = (
};
export async function searchResource(
{ q, tags = [], types, authors, rating }: SearchParams,
{ q, tags = [], types, rating }: SearchParams,
): Promise<GenericResource[]> {
let resources = (await Promise.all([
const resources = (await Promise.all([
(!types || types.includes("movie")) && getAllMovies(),
(!types || types.includes("series")) && getAllSeries(),
(!types || types.includes("article")) && getAllArticles(),
(!types || types.includes("recipe")) && getAllRecipes(),
])).flat().filter(isResource);
if (tags?.length) {
resources = resources.filter((r) => {
return tags?.every((t) => r.tags.includes(t));
});
}
const results: Record<string, GenericResource> = {};
if (authors?.length) {
resources = resources.filter((r) => {
return r?.meta?.author && authors.includes(r?.meta?.author);
});
}
if (rating) {
resources = resources.filter((r) => {
return r?.meta?.rating && r.meta.rating >= rating;
});
for (const resource of resources) {
if (
!(resource.id in results) &&
tags?.length && resource.tags.length &&
tags.every((t) => resource.tags.includes(t))
) {
results[resource.id] = resource;
}
if (
!(resource.id in results) &&
rating && resource?.meta?.rating && resource.meta.rating >= rating
) {
results[resource.id] = resource;
}
}
if (q.length && q !== "*") {
const results = fuzzysort.go(q, resources, {
keys: ["content", "name", "description"],
const fuzzyResult = fuzzysort.go(q, resources, {
keys: ["content", "name", "description", "meta.author"],
threshold: 0.3,
});
resources = results.map((r) => r.obj);
for (const result of fuzzyResult) {
results[result.obj.id] = result.obj;
}
}
return resources;
return Object.values(results);
}