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(() => { useEffect(() => {
clearTimeout(globalThis.loadingTimeout); if (globalThis.loadingTimeout) {
delete globalThis.loadingTimeout; clearTimeout(globalThis.loadingTimeout);
setTimeout(() => { delete globalThis.loadingTimeout;
setTimeout(() => {
document.querySelector("main")?.classList.remove("loading");
}, 100);
} else {
document.querySelector("main")?.classList.remove("loading"); document.querySelector("main")?.classList.remove("loading");
}, 100); }
}); });
return ( return (

View File

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