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}

- {#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 @@