mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:41:09 +02:00
The previous fix wired Dexie's `_scopeCursor` infra-table as a side-
channel between Svelte $state (active-space + current-user) and Dexie
liveQuery: every scoped query touched the table on read so liveQuery
subscribed to it, every setActiveSpace bumped the table so liveQuery
re-ran. Worked, but smelled — hidden side-effect inside `scopedTable`,
scope state pretending to be a Dexie row, +1 roundtrip per query, and
`current-user.ts` had to dynamic-import Dexie just to pump the bridge.
Replacement: a Svelte 5 `$effect`-based hook that owns scope-tracking
explicitly. The dependency now lives in the reactive layer (which is
where it belongs), not as a side-effect in the data layer.
What changes:
- New `data/scope/use-scoped-live-query.svelte.ts`. The hook reads a
module-level `scopeTick` `$state` counter inside its `$effect`.
Both `onActiveSpaceChanged` (existing) and `onCurrentUserChanged`
(new, added to `current-user.ts`) bump the tick on real changes.
Effect re-fires → previous Dexie subscription unsubscribes → fresh
one created with up-to-date `getInScopeSpaceIds()`. Same return
shape as `useLiveQueryWithDefault` for drop-in migration.
- `current-user.ts` gains an `onCurrentUserChanged` event bus,
symmetric to `active-space.svelte.ts#onActiveSpaceChanged`. Stays
a plain `.ts` (no runes) so it remains a leaf and works in the
test runner without the Svelte preprocessor — the rename to
`.svelte.ts` was tried earlier and reverted because of test
fallout (commit `01e6b9f04`).
- 53 module `queries.ts` files migrated from
`useLiveQueryWithDefault` → `useScopedLiveQuery`. The choice of
hook now documents at the call-site whether the query is
scope-aware. Pure mechanical find-replace — no logic changes.
What goes away:
- `data/scope/cursor.ts` deleted.
- `touchScopeCursor()` calls removed from `scopedTable` /
`scopedAnd` / `scopedGet`. Functions are pure data-layer again,
no implicit reactive subscriptions.
- `bumpScopeCursor()` calls removed from `setActiveSpace` and both
`loadActiveSpace` branches. Setter is pure state-update, no
Dexie write side-effect.
- `current-user.ts` no longer dynamic-imports `scope/cursor` —
`setCurrentUserId` is a clean three-line setter again.
- Dexie v46 drops the `_scopeCursor` table (`stores: { _scopeCursor:
null }`). v45 stays declared so existing browsers' version chain
remains contiguous; the v46 deletion runs once on next open. No
user data lost — the table only ever held a transient bumpedAt
row.
Existing 14 scope regression tests still pass. Type-check + theme-
token validators are clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| api | ||
| calc/packages/shared | ||
| calendar | ||
| cards | ||
| chat | ||
| citycorners | ||
| contacts | ||
| context | ||
| docs | ||
| food | ||
| guides | ||
| inventory | ||
| mana | ||
| manavoxel | ||
| memoro | ||
| moodlit | ||
| mukke | ||
| news | ||
| photos | ||
| picture | ||
| plants | ||
| presi | ||
| questions | ||
| quotes/packages/content | ||
| skilltree | ||
| storage | ||
| times | ||
| todo | ||
| traces | ||
| uload | ||