Get rid of local storage adapter, use synced instead

This commit is contained in:
Jon Staab 2024-05-23 11:46:45 -07:00
parent 185afa9bec
commit e3c85fd3d3
4 changed files with 23 additions and 53 deletions

View File

@ -2,9 +2,8 @@
import {onMount} from "svelte"
import {writable} from "@welshman/lib"
import type {Filter} from "@welshman/util"
import {createScroller} from "src/util/misc"
import {createScroller, synced} from "src/util/misc"
import {fly, fade} from "src/util/transition"
import {synced} from "src/partials/state"
import Anchor from "src/partials/Anchor.svelte"
import Spinner from "src/partials/Spinner.svelte"
import FlexColumn from "src/partials/FlexColumn.svelte"

View File

@ -3,7 +3,6 @@ import {nip19} from "nostr-tools"
import {throttle} from "throttle-debounce"
import {
Fetch,
Storage as LocalStorage,
createMapOf,
defer,
displayList,
@ -95,7 +94,7 @@ import {
subscribe as baseSubscribe,
} from "@welshman/net"
import type {Publish, PublishRequest, SubscribeRequest} from "@welshman/net"
import {fuzzy, createBatcher, pushToKey, tryJson, fromCsv} from "src/util/misc"
import {fuzzy, synced, createBatcher, pushToKey, tryJson, fromCsv} from "src/util/misc"
import {parseContent} from "src/util/notes"
import {
appDataKeys,
@ -165,8 +164,9 @@ export const env = new Writable({
SEARCH_RELAYS: fromCsv(import.meta.env.VITE_SEARCH_RELAYS).map(normalizeRelayUrl) as string[],
})
export const pubkey = new Writable<string | null>(null)
export const sessions = new Writable<Record<string, Session>>({})
export const pubkey = synced<string | null>("pubkey", null)
export const sessions = synced<Record<string, Session>>("sessions", {})
export const relays = new CollectionStore<Relay>("url")
export const groups = new CollectionStore<Group>("address")
export const groupAdminKeys = new CollectionStore<GroupKey>("pubkey")
@ -2045,30 +2045,6 @@ class IndexedDB {
}
}
type LocalStorageAdapterOpts = {
load: (x: any) => any
dump: (x: any) => any
}
class LocalStorageAdapter {
constructor(
readonly key: string,
readonly store: IWritable<any>,
readonly opts?: LocalStorageAdapterOpts,
) {}
initialize(storage: Storage) {
const {key, store, opts} = this
const {load, dump} = opts || {load: identity, dump: identity}
if (key in localStorage) {
store.set(load(LocalStorage.getJson(key)))
}
store.subscribe(throttle(300, $value => LocalStorage.setJson(key, dump($value))))
}
}
class IndexedDBAdapter {
constructor(
readonly key: string,
@ -2139,7 +2115,7 @@ class Storage {
constructor(
readonly version,
readonly adapters: (LocalStorageAdapter | IndexedDBAdapter)[],
readonly adapters: IndexedDBAdapter[],
) {
this.initialize()
}
@ -2200,12 +2176,6 @@ const sortByPubkeyWhitelist = (fallback: (x: any) => number) => (rows: Record<st
}, rows)
}
// Removed support for bunker login
const sessionsAdapter = {
load: filter(($s: any) => $s.method !== "bunker"),
dump: identity,
}
const scoreEvent = e => {
if (getSession(e.pubkey)) return -Infinity
if (giftWrapKinds.includes(e.kind)) return -Infinity
@ -2215,8 +2185,6 @@ const scoreEvent = e => {
}
export const storage = new Storage(12, [
new LocalStorageAdapter("pubkey", pubkey),
new LocalStorageAdapter("sessions", sessions, sessionsAdapter),
new IndexedDBAdapter("seen3", "id", seen, 10000, sortBy(prop("created_at"))),
new IndexedDBAdapter(
"publishes",

View File

@ -1,16 +1,7 @@
import {debounce} from "throttle-debounce"
import {fromPairs} from "ramda"
import {Storage} from "hurdak"
import {writable} from "@welshman/lib"
import {parseHex} from "src/util/html"
export const synced = (key: string, defaultValue: any) => {
const store = writable(Storage.getJson(key) || defaultValue)
store.subscribe(debounce(1000, $value => Storage.setJson(key, $value)))
return store
}
import {synced} from "src/util/misc"
// Settings

View File

@ -1,6 +1,7 @@
import {now, stripProtocol} from "@welshman/lib"
import {throttle} from "throttle-debounce"
import {now, stripProtocol, writable} from "@welshman/lib"
import {pluck, fromPairs, last, identity, sum, is, equals} from "ramda"
import {ensurePlural, defer, isPojo, first, seconds, tryFunc, sleep, round} from "hurdak"
import {Storage, ensurePlural, defer, isPojo, first, seconds, tryFunc, sleep, round} from "hurdak"
import Fuse from "fuse.js"
import logger from "src/util/logger"
@ -362,5 +363,16 @@ export class SearchHelper<T, V> {
export const fromCsv = s => (s || "").split(",").filter(identity)
export const toSpliced = <T>(xs: T[], start: number, deleteCount: number = 0, ...items: T[]) =>
[...xs.slice(0, start), ...items, ...xs.slice(start + deleteCount)]
export const toSpliced = <T>(xs: T[], start: number, deleteCount: number = 0, ...items: T[]) => [
...xs.slice(0, start),
...items,
...xs.slice(start + deleteCount),
]
export const synced = <T>(key: string, defaultValue: T, delay = 300) => {
const store = writable<T>(Storage.getJson(key) || defaultValue)
store.subscribe(throttle(delay, ($value: T) => Storage.setJson(key, $value)))
return store
}