diff --git a/islands/Link.tsx b/islands/Link.tsx index 0c8b0b6..377a3c0 100644 --- a/islands/Link.tsx +++ b/islands/Link.tsx @@ -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 ( diff --git a/lib/search.ts b/lib/search.ts index b00b95d..b89f338 100644 --- a/lib/search.ts +++ b/lib/search.ts @@ -53,39 +53,43 @@ const isResource = ( }; export async function searchResource( - { q, tags = [], types, authors, rating }: SearchParams, + { q, tags = [], types, rating }: SearchParams, ): Promise { - 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 = {}; - 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); }