mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
feat: add favorites tools
This commit is contained in:
@@ -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)),
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user