Messenger/packages/mobile
Заид Омар Медхат | Zaid Omar Medhat f653b083aa f
2026-07-13 12:32:00 +05:00
..
app f 2026-07-13 12:32:00 +05:00
ios f 2026-07-13 12:32:00 +05:00
src f 2026-07-13 12:32:00 +05:00
.gitignore f 2026-07-13 12:32:00 +05:00
app.config.ts f 2026-07-13 12:32:00 +05:00
babel.config.js f 2026-07-13 12:32:00 +05:00
eslint.config.mjs f 2026-07-13 12:32:00 +05:00
expo-env.d.ts f 2026-07-13 12:32:00 +05:00
metro.config.js f 2026-07-13 12:32:00 +05:00
package.json f 2026-07-13 12:32:00 +05:00
README.md f 2026-07-13 12:32:00 +05:00
tsconfig.json f 2026-07-13 12:32:00 +05:00

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 on http://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.