feat: sort by rating by default

This commit is contained in:
max_richter 2023-08-29 13:48:52 +02:00
parent 78b1699152
commit 517b1ba23d
3 changed files with 35 additions and 15 deletions

View File

@ -6,18 +6,10 @@ import {
} from "@lib/documents.ts"; } from "@lib/documents.ts";
import { Root } from "https://esm.sh/remark-frontmatter@4.0.1"; import { Root } from "https://esm.sh/remark-frontmatter@4.0.1";
import { getThumbhash } from "@lib/cache/image.ts"; import { getThumbhash } from "@lib/cache/image.ts";
import { GenericResource } from "@lib/types.ts";
import { parseRating } from "@lib/helpers.ts";
type Resource = { export async function addThumbnailToResource<T = GenericResource>(
name: string;
id: string;
meta: {
image?: string;
author?: string;
thumbnail?: string;
};
};
export async function addThumbnailToResource<T = Resource>(
res: T, res: T,
): Promise<T> { ): Promise<T> {
const imageUrl = res?.meta?.image; const imageUrl = res?.meta?.image;
@ -34,7 +26,27 @@ export async function addThumbnailToResource<T = Resource>(
}; };
} }
export function createCrud<T>( type SortType = "rating" | "date" | "name" | "author";
function sortFunction<T extends GenericResource>(sortType: SortType) {
return (a: T, b: T) => {
switch (sortType) {
case "rating":
return parseRating(a.meta?.rating || 0) >
parseRating(b.meta?.rating || 0)
? -1
: 1;
case "date":
return (a.meta?.date || 0) > (b.meta?.date || 0) ? -1 : 1;
case "name":
return a.name.localeCompare(b.name);
case "author":
return a.meta?.author?.localeCompare(b.meta?.author || "");
}
};
}
export function createCrud<T extends GenericResource>(
{ prefix, parse, render, hasThumbnails = false }: { { prefix, parse, render, hasThumbnails = false }: {
prefix: string; prefix: string;
hasThumbnails?: boolean; hasThumbnails?: boolean;
@ -80,9 +92,9 @@ export function createCrud<T>(
await createDocument(path, newDoc); await createDocument(path, newDoc);
} }
async function readAll() { async function readAll({ sort = "rating" }: { sort?: SortType } = {}) {
const allDocuments = await getDocuments(); const allDocuments = await getDocuments();
return Promise.all( return (await Promise.all(
allDocuments.filter((d) => { allDocuments.filter((d) => {
return d.name.startsWith(prefix) && return d.name.startsWith(prefix) &&
d.contentType === "text/markdown" && d.contentType === "text/markdown" &&
@ -91,7 +103,7 @@ export function createCrud<T>(
const id = doc.name.replace(prefix, "").replace(/\.md$/, ""); const id = doc.name.replace(prefix, "").replace(/\.md$/, "");
return read(id); return read(id);
}), }),
); )).sort(sortFunction<T>(sort));
} }
return { return {

View File

@ -88,3 +88,10 @@ export function debounce<T extends (...args: Parameters<T>) => void>(
timer = setTimeout(() => fn.apply(this, args), delay); timer = setTimeout(() => fn.apply(this, args), delay);
}; };
} }
export function parseRating(rating: string | number) {
if (typeof rating === "string") {
return [...rating.matchAll(/⭐/)].length;
}
return rating;
}

View File

@ -43,6 +43,7 @@ export type GenericResource = {
author?: string; author?: string;
rating?: number; rating?: number;
average?: string; average?: string;
date?: Date | string;
thumbnail?: string; thumbnail?: string;
}; };
}; };