Add setProfile and sync helper

This commit is contained in:
Jon Staab
2025-07-15 21:26:53 -07:00
parent fd84b80734
commit 2ed88c3345
3 changed files with 59 additions and 27 deletions
+26 -19
View File
@@ -1,4 +1,4 @@
import {writable} from "svelte/store"
import {writable, Writable} from "svelte/store"
import {getJson, setJson} from "@welshman/lib"
export interface StorageProvider {
@@ -6,32 +6,39 @@ export interface StorageProvider {
set: (key: string, value: any) => Promise<void>
}
export const localStorageProvider: StorageProvider = {
get: async (key: string) => getJson(key),
set: async (key: string, value: any) => setJson(key, value),
}
export interface SyncConfig<T> {
key: string
store: Writable<T>
storage: StorageProvider
}
export const sync = <T>({key, store, storage}: SyncConfig<T>) => {
storage.get(key).then((value: T | undefined) => {
if (value !== undefined) {
store.set(value)
}
})
store.subscribe(async (value: T) => {
await storage.set(key, value)
})
}
export interface SyncedConfig<T> {
key: string
storage: StorageProvider
defaultValue: T
}
export const localStorageProvider: StorageProvider = {
get: async (key: string) => getJson(key),
set: async (key: string, value: any) => setJson(key, value),
}
export const synced = <T>(config: SyncedConfig<T>) => {
const {key, storage, defaultValue} = config
export const synced = <T>({key, storage, defaultValue}: SyncedConfig<T>) => {
const store = writable<T>(defaultValue)
// Async initialization
storage.get(key).then((value: any) => {
if (value !== undefined) {
store.set(value)
}
})
// Subscribe to changes
store.subscribe(async (value: T) => {
await storage.set(key, value)
})
sync({key, store, storage})
return store
}