32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
import { DataManager } from './DataManager';
|
|
import { cacheableModels } from './cacheableModels';
|
|
|
|
// Seed Vuex from IndexedDB before the dashboard renders so warm boots paint
|
|
// cached config instantly. This is purely local — zero network calls.
|
|
//
|
|
// Freshness is handled entirely by the account.cache_invalidated event:
|
|
// RoomChannel transmits the current cache-key map on every (re)subscribe, and
|
|
// the server broadcasts it on every change. dispatchCacheRevalidations diffs
|
|
// those keys against IDB and refetches mismatches — the client never pulls
|
|
// cache keys itself.
|
|
export default async function paintStoresFromCache(store, accountId) {
|
|
let dm;
|
|
try {
|
|
dm = new DataManager(accountId);
|
|
await dm.initDb();
|
|
} catch {
|
|
// IDB unsupported (e.g. Firefox private mode) — silent no-op. Components
|
|
// will fetch from the network normally via the cache-enabled API client.
|
|
return;
|
|
}
|
|
|
|
// Stale-while-revalidate paint: commit cached data into Vuex immediately.
|
|
await Promise.all(
|
|
cacheableModels.map(async model => {
|
|
const localData = await dm.get({ modelName: model.name });
|
|
if (localData.length === 0) return;
|
|
store.commit(model.setMutation, localData);
|
|
})
|
|
);
|
|
}
|