Files
collective-lists/docs/history/fase-2b.md
Oier Bravo Urtasun 768b3cda58 docs: split CLAUDE.md into docs/{development,deployment,history/fase-*}
CLAUDE.md shrinks to rules + status + index (175 lines, down from 476).
Dev setup, prod deploy, and per-phase build records move to docs/.
Gotchas regrouped by domain (auth, frontend, PWA, testing, backend, deploy,
platform) and unnumbered so they don't drift as new ones land.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 22:21:20 +02:00

1.9 KiB

Fase 2b — what has been built

  • supabase/migrations/007_realtime_publication.sql — adds shopping_items + shopping_lists to supabase_realtime publication with REPLICA IDENTITY FULL
  • apps/web/src/lib/stores/realtimeSync.tssubscribeToList(listId, onEvent) postgres_changes subscription helper; applyItemEvent reducer for INSERT/UPDATE/DELETE
  • /lists/[id]/+page.svelte — wired to realtimeSync with pendingTempIds echo-deduplication. Mutations use client-generated UUIDs so offline retries are idempotent (PK-conflict = success)
  • apps/web/src/lib/sync/queue.tsSyncQueue class (IDB-backed pending_ops, FIFO flush, MAX_ATTEMPTS retry, PK-conflict-as-success)
  • apps/web/src/lib/sync/index.ts — app-wide SyncQueue singleton; enqueueOp, hydrateSyncState, auto-flush on window.online
  • apps/web/src/lib/stores/syncStatus.ts — derived store: offline | syncing | synced from navigator.onLine + pendingOpsCount
  • apps/web/src/lib/components/SyncBanner.svelte — renders the offline/syncing indicator; mounted in list detail + session views
  • apps/web/src/routes/(app)/lists/[id]/session/+page.svelte — Modo Compra full-screen view (fixed positioning overlays the sidebar), 56px toggles, flip animation, confirm modal, completeList → redirect
  • apps/web/messages/*.jsonsync_offline, sync_syncing, list_start_session
  • packages/test-utils/src/realtime-helpers.tssubscribePostgresChanges(client, opts) with waitFor(predicate, ms) — awaits SUBSCRIBED handshake, dedups events, leaks nothing between tests
  • Vitest unit harness in apps/web/vitest.config.ts (jsdom env) + vitest.setup.ts (fake-indexeddb/auto) + pnpm --filter @colectivo/web test:unit
  • Realtime config gotchas documented in project_realtime_config memory: tenant name, DB_USER=supabase_admin, SEED_SELF_HOST: "true", pre-created realtime schema, publication + REPLICA IDENTITY FULL