updated/consolidated lit+zustand
This commit is contained in:
parent
648412dd6d
commit
2178304c76
7 changed files with 83 additions and 307 deletions
33
store/idb.js
33
store/idb.js
|
|
@ -1,33 +0,0 @@
|
|||
// lib/idb.js
|
||||
import { createStore, get, set, del, entries, clear } from 'idb-keyval'
|
||||
|
||||
// Named stores — each maps to a distinct IDBObjectStore
|
||||
export const itemsStore = createStore('app-db', 'items')
|
||||
export const userStore = createStore('app-db', 'user')
|
||||
export const cacheStore = createStore('app-db', 'cache')
|
||||
|
||||
// Typed wrappers — keeps raw idb-keyval calls out of the rest of the app
|
||||
// and gives you one place to add validation, logging, or migration logic
|
||||
|
||||
export const db = {
|
||||
items: {
|
||||
getAll: () => entries(itemsStore),
|
||||
get: (id) => get(id, itemsStore),
|
||||
set: (id, value) => set(id, value, itemsStore),
|
||||
remove: (id) => del(id, itemsStore),
|
||||
clear: () => clear(itemsStore),
|
||||
},
|
||||
|
||||
user: {
|
||||
get: () => get('user', userStore),
|
||||
set: (value) => set('user', value, userStore),
|
||||
clear: () => del('user', userStore),
|
||||
},
|
||||
|
||||
cache: {
|
||||
get: (key) => get(key, cacheStore),
|
||||
set: (key, value) => set(key, value, cacheStore),
|
||||
remove: (key) => del(key, cacheStore),
|
||||
clear: () => clear(cacheStore),
|
||||
}
|
||||
}
|
||||
|
|
@ -1,42 +1,13 @@
|
|||
import { createStore } from 'zustand/vanilla'
|
||||
import { persist, createJSONStorage } from 'zustand/middleware'
|
||||
import { get, set, del } from 'idb-keyval'
|
||||
|
||||
const storage = createJSONStorage(() => ({
|
||||
getItem: async (name) => {
|
||||
const value = await get(name)
|
||||
return value ?? null
|
||||
},
|
||||
setItem: async (name, value) => {
|
||||
await set(name, value)
|
||||
},
|
||||
removeItem: async (name) => {
|
||||
await del(name)
|
||||
},
|
||||
export const store = createStore((set, get) => ({
|
||||
user: null,
|
||||
items: [],
|
||||
route: 'home',
|
||||
|
||||
// Actions
|
||||
setUser: (user) => set({ user }),
|
||||
addItem: (item) => set(s => ({ items: [...s.items, item] })),
|
||||
removeItem: (id) => set(s => ({ items: s.items.filter(i => i.id !== id) })),
|
||||
navigate: (route) => set({ route }),
|
||||
}))
|
||||
|
||||
export const store = createStore(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
_hydrated: false,
|
||||
user: null,
|
||||
items: [],
|
||||
route: 'home',
|
||||
setUser: (user) => set({ user }),
|
||||
addItem: (item) => set(s => ({ items: [...s.items, item] })),
|
||||
removeItem: (id) => set(s => ({ items: s.items.filter(i => i.id !== id) })),
|
||||
navigate: (route) => set({ route }),
|
||||
}),
|
||||
{
|
||||
name: 'app-store',
|
||||
storage,
|
||||
onRehydrateStorage: () => {
|
||||
return (state, error) => {
|
||||
if (!error) {
|
||||
store.setState({ _hydrated: true })
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
// store/middleware/persistence.js
|
||||
import { db } from '../idb.js'
|
||||
|
||||
export const makeIdbStorage = (storeName) =>
|
||||
createJSONStorage(() => ({
|
||||
getItem: (name) => db[storeName].get(name),
|
||||
setItem: (name, value) => db[storeName].set(name, value),
|
||||
removeItem: (name) => db[storeName].remove(name),
|
||||
}))
|
||||
Loading…
Add table
Add a link
Reference in a new issue