901fd659df
- Add NextGraph data layer with @ng-org/orm, SHEX shapes (Event, UserProfile, Participation), session management, and FestipodDataContext with dual-mode operation (connected via NextGraph or local seed data) - Add BrokerBanner and NgStatus components showing connection status - Refactor to feature-based architecture: organize code by business domain (event, user, home, auth, workshop, meeting, notification) instead of technical layer. Modules only import from shared/, never from each other - Collocate BDD features and step definitions with their modules: event-specific steps in event/steps/, user steps in user/steps/, shared generic steps remain in shared/steps/ - Set up multi-layer BDD structure (frontend/backend/e2e steps per module) - Add project documentation (AGENTS.md, .project/knowledge/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
Data Layer
NextGraph-backed local-first data with fallback to local state for demo/disconnected mode.
Overview
The app has two data modes:
- Connected — NextGraph ORM shapes (P2P, encrypted, local-first)
- Disconnected/Demo — Local React state seeded from
seedData.ts
All screens use useFestipodData() hook regardless of mode.
NextGraph Stack
@ng-org/web # Browser WASM runtime
@ng-org/orm # RDF shape-based ORM
@ng-org/shex-orm # SHEX → TypeScript code generation
@ng-org/alien-deepsignals # Reactive signals bridge
Packages installed from local tarballs in .ng-tarballs/.
SHEX Shapes
src/shared/shapes/shex/festipodShapes.shex defines:
- Event — title, description, dates, location, themes, participants
- UserProfile — name, username, bio, city, visibility
- Participation — links event + user, confirmation status
ORM bindings in src/shared/shapes/orm/:
festipodShapes.schema.ts— Schema registrationfestipodShapes.shapeTypes.ts— Shape type constantsfestipodShapes.typings.ts— TypeScript interfaces
Regenerate with bun run build:orm.
Context Providers
NextGraphContext (src/shared/context/NextGraphContext.tsx)
- Connection lifecycle:
disconnected→connecting→connected|error - Auto-initializes via
initNg()fromsrc/shared/utils/ngSession.ts - Provides session with store IDs (private, protected, public)
FestipodDataContext (src/shared/context/FestipodDataContext.tsx)
- Wraps NextGraph shapes with
useShapeWithDefaults()hook - CRUD:
createEvent(),updateEvent(),joinEvent(),leaveEvent(), etc. - Exposes
useFestipodData()hook consumed by all screens selectedEventIdstate for cross-screen event navigation- Falls back to seed data when disconnected
Data Types
src/shared/data/types.ts:
FpEventData— id, title, date, location, distance, themes, etc.FpUserData— id, name, username, bio, city, countsFpParticipationData— eventId + userId + confirmedFpMeetingPointData— eventId, location, time, host (local-only)FpFriendshipData— userId + friendId (local-only)
Seed Data
src/shared/data/seedData.ts:
- 10 users (Marie Dupont = current user,
user-1) - Multiple events with dates, locations, themes
- Participations, meeting points, friendships
CURRENT_USER_ID = 'user-1'