Mobile architecture — WELIFE Consumer
Path:
mobile/· Expo SDK 54 · WP-REPOSITORY-ARCH-ENV-AUDIT-01
Stack
| Layer | Choice |
|---|---|
| Framework | Expo managed (SDK 54) · RN 0.81 · React 19 |
| Navigation | React Navigation (native-stack + bottom-tabs) — not Expo Router |
| State | React Context (AuthContext) · no Redux/Zustand/React Query |
| Tokens | expo-secure-store (services/secure-token.ts) |
| Flags | AsyncStorage (onboarding only) |
| HTTP | Single services/api.ts (fetch + refresh-on-401) |
| Public env | src/config/env.ts → EXPO_PUBLIC_* |
| Theme | src/theme/tokens.ts |
| Realtime | Socket.IO client → API /socket.io namespaces /chat, /rides |
Layout
mobile/
app.json · babel · metro · eas.json
.env.example
src/
config/env.ts
navigation/ RootNavigator · MainTabs · MapStack · types
features/<domain>/ screens · components · hooks (36 domains)
services/api.ts AuthApi + domain APIs
services/secure-token.ts
theme/tokens.ts
shared/ui/
GoogleService-Info.plist · google-services.json (gitignored; not Web OAuth)
Features (domains)
auth · home · places · geo · routing · rides · fnb · grocery · hotels · rentals · parking · fuel · atm · charging · transit · homeservices · delivery · pharmacy · medical · schools · wallet · payments · bills · qr · chat · social · notifications · favorites · assistant · profile · kyc · promotions · reviews · support · addresses · health
Auth
- Primary: email OTP → JWT
- Google: Expo Auth Session when Web Client ID valid (placeholder rejected)
- Session expired →
sessionEvents
Native static config
| Item | Value |
|---|---|
| scheme | welife |
| package / bundle | cloud.minhtien.welife |
| EAS | eas.json present · cloud build OWNER |
| Firebase JSON/plist | local gitignored · empty oauth_client · not OAuth Web Client ID |
Tests / device
- Unit/static TypeScript only in this audit
- Device / Expo Go / emulator: NOT PERFORMED
Known gaps (no large move this WP)
- Expo SDK 54 (mobile) vs 57 (partner/driver) — drift
- No
packages/sharedfor API types / client services/api.tsis large (feature APIs colocated) — split is future WP- Google real login: OWNER_REQUIRED