feat: better searching
This commit is contained in:
parent
cd511c9f0d
commit
287230c996
@ -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 (
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user