feat: better searching
This commit is contained in:
parent
cd511c9f0d
commit
287230c996
@ -23,11 +23,15 @@ export function Link(
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (globalThis.loadingTimeout) {
|
||||
clearTimeout(globalThis.loadingTimeout);
|
||||
delete globalThis.loadingTimeout;
|
||||
setTimeout(() => {
|
||||
document.querySelector("main")?.classList.remove("loading");
|
||||
}, 100);
|
||||
} else {
|
||||
document.querySelector("main")?.classList.remove("loading");
|
||||
}
|
||||
});
|
||||
|
||||
return (
|
||||
|
@ -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> = {};
|
||||
|
||||
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 (authors?.length) {
|
||||
resources = resources.filter((r) => {
|
||||
return r?.meta?.author && authors.includes(r?.meta?.author);
|
||||
});
|
||||
if (
|
||||
!(resource.id in results) &&
|
||||
rating && resource?.meta?.rating && resource.meta.rating >= rating
|
||||
) {
|
||||
results[resource.id] = resource;
|
||||
}
|
||||
if (rating) {
|
||||
resources = resources.filter((r) => {
|
||||
return r?.meta?.rating && r.meta.rating >= rating;
|
||||
});
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user