2.7 KiB
Zovi Mobile (Expo)
React Native + Expo (SDK 54) client for Altricade, consuming the shared
@altricade/core package as source. FSD layout: app/ holds thin expo-router
route files only; all logic and UI live under src/.
Prerequisites
- The backend + infra stack running (Postgres, Redis, MinIO, Centrifugo) — see
infra/docker-compose.yml. Start the Fastify backend so the API is onhttp://localhost:8080. - On a physical device the API/WS host must be reachable from the phone, so
point the client at your machine's LAN IP (see env below), not
localhost.
Run
pnpm install # from the repo root
# From packages/mobile:
pnpm start # Metro + dev menu
pnpm ios # build & run iOS (needs a dev build)
pnpm android # build & run Android (needs a dev build)
This app uses native modules (reanimated, gesture-handler, camera, audio,
video, secure-store, notifications), so it requires a development build
(expo-dev-client) — it will not run in Expo Go. Build one with EAS or
expo run:ios / expo run:android.
Environment
Public config is read from app.config.ts extra, driven by EXPO_PUBLIC_*:
| Variable | Default | Purpose |
|---|---|---|
EXPO_PUBLIC_API_URL |
http://localhost:8080/api |
REST base URL |
EXPO_PUBLIC_WS_URL |
ws://localhost:8080/connection/websocket |
Centrifugo websocket |
EXPO_PUBLIC_PUSH_ENABLED |
unset (off) | Enable native push registration |
Example for a device on your LAN:
EXPO_PUBLIC_API_URL=http://192.168.1.20:8080/api \
EXPO_PUBLIC_WS_URL=ws://192.168.1.20:8080/connection/websocket \
pnpm start
Quality gates
pnpm typecheck # tsc --noEmit (strict, no any/assertions/!)
pnpm lint # eslint
Auth transport
Native uses token-mode auth: the refresh token is stored in expo-secure-store
(Keychain/Keystore) and sent in the request body with an X-Auth-Mode: token
header, instead of the web's httpOnly cookie. The access token stays in memory.
Push notifications
Native push (FCM/APNs) needs a build with push credentials and cannot run in
Expo Go, so registration is gated behind EXPO_PUBLIC_PUSH_ENABLED. Tap-to-open
deep-linking (src/services/usePush.ts) is always wired, so once credentials
are configured, flip the flag and notifications route into the right chat.