feat: add favorites tools

This commit is contained in:
2026-10-07 16:53:48 +05:00
parent 676be383d9
commit 2f11cb86ad
10 changed files with 208 additions and 12 deletions
+47
View File
@@ -0,0 +1,47 @@
import { SvelteSet } from "svelte/reactivity";
const KEY = "fav-tools";
const slugs = new SvelteSet<string>();
function storage(): Storage | null {
return typeof localStorage === "undefined" ? null : localStorage;
}
export function initFavorites(): void {
const raw = storage()?.getItem(KEY);
if (!raw) return;
try {
const list: unknown = JSON.parse(raw);
if (Array.isArray(list)) {
for (const s of list) if (typeof s === "string") slugs.add(s);
}
} catch {
// мусор в localStorage — работаем с пустым набором
}
}
export function isFav(slug: string): boolean {
return slugs.has(slug);
}
export function toggleFav(slug: string): void {
if (slugs.has(slug)) {
slugs.delete(slug);
} else {
slugs.add(slug);
}
storage()?.setItem(KEY, JSON.stringify([...slugs]));
}
/** Избранные страницы из списка (порядок сохраняется). */
export function favPages<T extends { slug: string }>(pages: readonly T[]): T[] {
return pages.filter((p) => slugs.has(p.slug));
}
/** Те же страницы, но избранные первыми (бонус в выдаче поиска). */
export function favFirst<T extends { slug: string }>(pages: readonly T[]): T[] {
return [...pages].sort(
(a, b) => Number(slugs.has(b.slug)) - Number(slugs.has(a.slug)),
);
}