Mobile App

Overview

Nigall ships a native Expo (React Native) attendee app in mobile/ plus a JWT REST API at /api/mobile/v1/. The app covers authentication, Discover, event detail, RSVP, ticket wallet, event agenda, and push notifications for event-day engagement.

Purpose

Support modern event-day UX: browse events, RSVP, show tickets/QR, follow the agenda, and receive push alerts (session reminders, live updates, organizer broadcasts).

Who should use it

  • Attendees on iOS/Android (Expo Go or store builds)
  • Mobile app developers extending the client
  • Organizers sending push broadcasts to registered devices

Benefits

  • Token auth with /auth/login/ and /auth/me/
  • Discover and search parity with web catalog
  • Ticket list endpoint for wallet UI
  • Device registration for Expo Push
  • In-app notification inbox synced with program notifications
  • Agenda endpoint for published program sessions

Mobile endpoint / screen Web equivalent
Discover tab /events/discover/
Event detail /events/<pk>/<tag>/
Agenda section Program live / my agenda
RSVP /events/<pk>/<tag>/rsvp/
Tickets Attendee ticket pages
Notifications inbox /program/notifications/

Prerequisites

  • Mobile client with JWT storage
  • Physical device for real push (simulators are limited)
  • User account for authenticated endpoints
  • Django MOBILE_PUSH_ENABLED=True (default)

Step-by-step — Mobile authentication

  1. POST /api/mobile/v1/auth/login/ with credentials.
  2. Store access token securely.
  3. GET /api/mobile/v1/auth/me/ to verify session.
  4. App automatically requests notification permission and registers the Expo push token.

Step-by-step — Push notifications

  1. After sign-in, app calls POST /api/mobile/v1/devices/register/ with expo_push_token.
  2. Program session reminders / live updates create in-app ProgramUserNotification rows and send Expo push when a device is registered.
  3. Organizers (or staff) can broadcast: POST /api/mobile/v1/events/<pk>/<tag>/push/ with { "title", "body" }.
  4. Attendees open Profile → Notifications inbox (GET /api/mobile/v1/notifications/).
  5. Tapping a push deep-links to /event/<pk>/<tag> in the app.

Session reminders continue to run via:

py -3.12 manage.py process_program_notifications --minutes 30

Step-by-step — Browse, RSVP, agenda

  1. GET /api/mobile/v1/events/discover/ — paginated public events.
  2. GET /api/mobile/v1/events/<pk>/<tag>/ — detail.
  3. GET /api/mobile/v1/events/<pk>/<tag>/agenda/ — published sessions.
  4. POST /api/mobile/v1/events/<pk>/<tag>/rsvp/ — RSVP events.
  5. GET /api/mobile/v1/tickets/ — user's tickets.
  6. Registration/checkout also available under /registration/ endpoints.

Field descriptions

Endpoint Auth Returns
auth/login No JWT tokens
auth/me JWT User profile
events/discover Optional JWT Public events list
events/search Optional JWT Search results
events/categories Optional JWT Category facets
events/<pk>/<tag>/ Optional JWT Event detail
events/<pk>/<tag>/agenda/ Optional JWT Agenda sessions
events/<pk>/<tag>/rsvp/ JWT RSVP create/update
events/<pk>/<tag>/push/ JWT organizer Push broadcast result
devices/register JWT Device record
devices/unregister JWT Deactivate device
notifications/ JWT Inbox + unread count
tickets/ JWT Registration tickets

Business rules

Rule Detail
Push tokens Must be Expo format (ExponentPushToken[...])
Private events Detail/agenda restricted unless host/attendee/RSVP
Survey questions Still not on mobile RSVP
Push transport Best-effort — never blocks email/in-app create
Physical device Expo Go push works on real phones; simulators often cannot

User permissions

JWT identifies user; organizer push requires can_manage_event.


Workflow

sequenceDiagram participant App participant API participant Expo as Expo Push App->>API: POST auth/login API-->>App: JWT App->>API: POST devices/register App->>API: GET discover / agenda / tickets Note over API: Session reminder / live update API->>Expo: send push Expo-->>App: notification App->>API: GET notifications

Run the app

See mobile/README.md. Quick start:

cd mobile
npm install
npx expo start --lan

Set EXPO_PUBLIC_API_URL to your Django host.

Administrator notes

  • MOBILE_PUSH_ENABLED — set False to disable outbound Expo calls
  • Configure CORS and JWT secret in production
  • Schedule process_program_notifications for session reminders
  • Store builds (EAS) needed for production APNs/FCM credentials beyond Expo Go

Developer/API notes

App: mobile_api + Expo client mobile/
Models: MobilePushDevice
Push: mobile_api/push.py (hooked from program.push_services.notify_user)


See also: Known Limitations