This commit is contained in:
authentik Default Admin 2026-03-04 12:23:40 -08:00
parent 4e612cb224
commit 28d57323b6
6 changed files with 316 additions and 35 deletions

33
store/idb.js Normal file
View file

@ -0,0 +1,33 @@
// 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),
}
}

View file

@ -1,6 +1,19 @@
import { createStore } from 'zustand/vanilla'
import { persist } from 'zustand/middleware'
import { idbStorage } from './middleware/persistence.js'
import { persist, createJSONStorage } from 'zustand/middleware'
import { get, set } 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(
persist(
@ -16,9 +29,13 @@ export const store = createStore(
}),
{
name: 'app-store',
storage: idbStorage,
onRehydrateStorage: () => (state) => {
if (state) state._hydrated = true
storage,
onRehydrateStorage: () => {
return (state, error) => {
if (!error) {
store.setState({ _hydrated: true })
}
}
},
}
)

View file

@ -1,8 +1,9 @@
import { get, set, del } from 'idb-keyval'
import { createJSONStorage } from 'zustand/middleware'
// store/middleware/persistence.js
import { db } from '../idb.js'
export const idbStorage = createJSONStorage(() => ({
getItem: (name) => get(name),
setItem: (name, value) => set(name, value),
removeItem: (name) => del(name),
}))
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),
}))