diff --git a/src/lib/components/item.svelte b/src/lib/components/item.svelte index 3780afe..25698b5 100644 --- a/src/lib/components/item.svelte +++ b/src/lib/components/item.svelte @@ -1,5 +1,6 @@
-
+
{#if cover}
{title} - {#if $showType == "grid"} -
- {title} -
- {/if} +
+ {title} +
{:else} Broken art @@ -47,11 +46,9 @@ {/if}
- {#if $showType == "comfortable"} -
- {title} -
- {/if} +
+ {title} +
\ No newline at end of file diff --git a/src/lib/components/showTypeChooser.svelte b/src/lib/components/showTypeChooser.svelte index d71dc80..6810b81 100644 --- a/src/lib/components/showTypeChooser.svelte +++ b/src/lib/components/showTypeChooser.svelte @@ -1,7 +1,8 @@
@@ -15,6 +16,7 @@ div { margin-left: auto; width: max-content; + user-select: none; } button { border-radius: 0; diff --git a/src/lib/util/storedWritable.ts b/src/lib/util/storedWritable.ts new file mode 100644 index 0000000..50479fa --- /dev/null +++ b/src/lib/util/storedWritable.ts @@ -0,0 +1,74 @@ +import {writable as internal, get, type Writable} from 'svelte/store' + +declare type Updater = (value: T) => T; +declare type StoreDict = { [key: string]: Writable } + +/* eslint-disable @typescript-eslint/no-explicit-any */ +const stores: StoreDict = {} + +interface Serializer { + parse(text: string): T + stringify(object: T): string +} + +type StorageType = 'local' | 'session' + +interface Options { + serializer?: Serializer + storage?: StorageType +} + +function getStorage(type: StorageType) { + return type === 'local' ? localStorage : sessionStorage +} + +export function storedWritable(key: string, initialValue: T, options?: Options): Writable { + const serializer = options?.serializer ?? JSON + const storageType = options?.storage ?? 'local' + const browser = typeof(window) !== 'undefined' && typeof(document) !== 'undefined' + + function updateStorage(key: string, value: T) { + if (!browser) return + + getStorage(storageType).setItem(key, serializer.stringify(value)) + } + + if (!stores[key]) { + const store = internal(initialValue, (set) => { + const json = browser ? getStorage(storageType).getItem(key) : null + + if (json) { + set(serializer.parse(json)) + } + + if (browser) { + const handleStorage = (event: StorageEvent) => { + if (event.key === key) + set(event.newValue ? serializer.parse(event.newValue) : null) + } + + window.addEventListener("storage", handleStorage) + + return () => window.removeEventListener("storage", handleStorage) + } + }) + + const {subscribe, set} = store + + stores[key] = { + set(value: T) { + updateStorage(key, value) + set(value) + }, + update(updater: Updater) { + const value = updater(get(store)) + + updateStorage(key, value) + set(value) + }, + subscribe + } + } + + return stores[key] +} \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index fd501fe..ded07d1 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -9,6 +9,7 @@ import type { load } from "./+page"; import Navbar from "$lib/components/navbar.svelte"; + import ShowNsfwChooser, { showNsfw } from "$lib/components/showNsfwChooser.svelte"; export var data: Awaited>; var name: string = typeof window === "undefined" ? "" : data.url.searchParams.get("search") || ""; @@ -18,8 +19,6 @@ history.replaceState(history.state, "", url.toString()); } - var allowNSFW = false; - const filters = { contentRating: ["safe", "suggestive"], demographic: [], @@ -28,7 +27,7 @@ sortValue: "desc" }; - filters.contentRating = allowNSFW ? [] : ["safe", "suggestive"]; + filters.contentRating = $showNsfw !== "hide" ? ["safe", "suggestive", "erotica", "pornographic"] : ["safe", "suggestive"]; /** * Searches for results @@ -109,7 +108,7 @@ $: if(userDetails) { userDetails.then(data => { if(data.data.User.options.nsfwContent) { - allowNSFW = true; + $showNsfw = "show"; } }) } @@ -130,10 +129,7 @@
- - +
Made by TechmandanCZ#3372
@@ -170,20 +166,12 @@