Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Bottom tabs:

## Tech Stack

- React Native (Expo SDK 54)
- React Native 0.88 (Expo SDK 58)
- Expo Router
- React Query
- Zustand + AsyncStorage
Expand Down Expand Up @@ -97,13 +97,12 @@ npx tsc --noEmit # type check

## Expo Dependency Notes

The mobile app currently uses SDK 54 compatible versions and keeps a few pinned/overridden packages for compatibility with existing patches.
The phone app is on Expo SDK 58 (React Native 0.88, React 19.3, New Architecture only). Upgrade with `npx expo install expo@^<sdk>` and then `npx expo install --fix` from `apps/mobile`.

- `postinstall` runs:
- `patch-package`
- `scripts/cleanup-duplicate-native-deps.js`

This ensures duplicate transitive native modules are cleaned up after install so `expo-doctor` remains healthy.
- `pnpm-workspace.yaml` pins one React for the whole workspace, because React Native needs the exact version its SDK ships with.
- Two small fixes to installed packages live in `apps/mobile/patches` and are applied by pnpm (`patchedDependencies`): the web pull-to-refresh and the toast position on web.
- Jest runs on version 30, which `jest-expo` 58 is built on, so `expo.install.exclude` keeps Expo's checks from asking for Jest 29.
- After a Skia upgrade, copy `node_modules/canvaskit-wasm/bin/full/canvaskit.wasm` into `apps/mobile/public/`, or Skia on the web fails to load.

## Environment

Expand Down
5 changes: 3 additions & 2 deletions apps/mobile/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"userInterfaceStyle": "dark",
"newArchEnabled": true,
"ios": {
"supportsTablet": true,
"infoPlist": {
Expand Down Expand Up @@ -75,7 +74,9 @@
"photosPermission": "Outhere uses your photos for stories and your profile picture.",
"cameraPermission": "Outhere uses the camera for stories and your profile picture."
}
]
],
"expo-image",
"expo-status-bar"
],
"web": {
"bundler": "metro",
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/metro.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const WEB_ALIASES = {
'expo-location': path.resolve(__dirname, './polyfills/web/location.web.ts'),
'./layouts/Tabs': path.resolve(__dirname, './polyfills/web/tabbar.web.jsx'),
'expo-notifications': path.resolve(__dirname, './polyfills/web/notifications.web.tsx'),
'expo-contacts': path.resolve(__dirname, './polyfills/web/contacts.web.ts'),
'expo-contacts/legacy': path.resolve(__dirname, './polyfills/web/contacts.web.ts'),
'expo-font': path.resolve(__dirname, './polyfills/web/expo-font.web.ts'),
'react-native-web/dist/exports/ScrollView': path.resolve(
__dirname,
Expand Down
125 changes: 59 additions & 66 deletions apps/mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,83 +20,79 @@
"@lucide/lab": "^0.1.2",
"@outhere/core": "workspace:*",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-native-community/netinfo": "11.4.1",
"@react-native-community/slider": "5.0.1",
"@react-native-community/netinfo": "12.0.1",
"@react-native-community/slider": "5.2.1",
"@react-native-masked-view/masked-view": "0.3.2",
"@react-native-picker/picker": "2.11.1",
"@react-navigation/bottom-tabs": "7.4.8",
"@react-navigation/native": "7.1.18",
"@react-native-picker/picker": "2.11.4",
"@react-three/fiber": "9.8.1",
"@shopify/react-native-skia": "2.2.12",
"@shopify/react-native-skia": "2.14.0",
"@supabase/supabase-js": "^2.117.3",
"@tanstack/react-query": "5.72.2",
"@teovilla/react-native-web-maps": "0.9.5",
"@uploadcare/upload-client": "6.14.3",
"color2k": "2.0.3",
"date-fns": "4.1.0",
"expo": "~54.0.33",
"expo-asset": "~12.0.12",
"expo-audio": "~1.1.1",
"expo-av": "~16.0.8",
"expo-blur": "~15.0.8",
"expo-build-properties": "~1.0.10",
"expo-calendar": "~15.0.8",
"expo-camera": "~17.0.10",
"expo-clipboard": "~8.0.8",
"expo-constants": "~18.0.13",
"expo-contacts": "~15.0.11",
"expo-device": "~8.0.10",
"expo-document-picker": "~14.0.8",
"expo-file-system": "~19.0.21",
"expo-font": "~14.0.11",
"expo-gl": "~16.0.10",
"expo-glass-effect": "~0.1.8",
"expo-haptics": "~15.0.8",
"expo-image": "~3.0.11",
"expo-image-manipulator": "~14.0.8",
"expo-image-picker": "~17.0.10",
"expo-linear-gradient": "~15.0.8",
"expo-linking": "~8.0.11",
"expo-location": "~19.0.8",
"expo-notifications": "~0.32.16",
"expo-router": "6.0.11",
"expo-secure-store": "~15.0.8",
"expo-sensors": "~15.0.8",
"expo-speech": "~14.0.8",
"expo-splash-screen": "~31.0.13",
"expo-status-bar": "~3.0.9",
"expo-store-review": "9.0.8",
"expo-symbols": "~1.0.8",
"expo-system-ui": "~6.0.9",
"expo-updates": "~29.0.16",
"expo-video": "~3.0.16",
"expo-web-browser": "~15.0.10",
"expo": "~58.0.14",
"expo-asset": "~58.0.16",
"expo-audio": "~58.0.9",
"expo-blur": "~58.0.4",
"expo-build-properties": "~58.0.11",
"expo-calendar": "~58.0.6",
"expo-camera": "~58.0.10",
"expo-clipboard": "~58.0.3",
"expo-constants": "~58.0.12",
"expo-contacts": "~58.0.7",
"expo-device": "~58.0.5",
"expo-document-picker": "~58.0.4",
"expo-file-system": "~58.0.9",
"expo-font": "~58.0.8",
"expo-gl": "~58.0.3",
"expo-glass-effect": "~58.0.4",
"expo-haptics": "~58.0.7",
"expo-image": "~58.0.15",
"expo-image-manipulator": "~58.0.14",
"expo-image-picker": "~58.0.10",
"expo-linear-gradient": "~58.0.3",
"expo-linking": "~58.0.13",
"expo-location": "~58.0.17",
"expo-notifications": "~58.1.5",
"expo-router": "58.0.23",
"expo-secure-store": "~58.0.2",
"expo-sensors": "~58.0.4",
"expo-speech": "~58.0.3",
"expo-splash-screen": "~58.0.10",
"expo-status-bar": "~58.0.3",
"expo-store-review": "58.0.2",
"expo-symbols": "~58.0.4",
"expo-system-ui": "~58.0.6",
"expo-updates": "~58.0.17",
"expo-video": "~58.0.11",
"expo-web-browser": "~58.0.6",
"html-to-image": "1.11.13",
"lodash": "4.17.21",
"lucide-react-native": "0.525.0",
"moti": "0.30.0",
"papaparse": "5.5.3",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.4",
"react": "19.3.0",
"react-dom": "19.3.0",
"react-native": "0.88.0",
"react-native-calendars": "^1.1314.0",
"react-native-confetti-cannon": "^1.5.2",
"react-native-gesture-handler": "2.28.0",
"react-native-gesture-handler": "3.3.0",
"react-native-graph": "1.1.0",
"react-native-maps": "1.20.1",
"react-native-maps": "1.29.11",
"react-native-qrcode-svg": "6.3.21",
"react-native-reanimated": "4.1.1",
"react-native-reanimated": "4.7.1",
"react-native-reanimated-carousel": "4.0.2",
"react-native-safe-area-context": "5.6.0",
"react-native-screen-transitions": "^3.2.1",
"react-native-screens": "4.16.0",
"react-native-safe-area-context": "5.10.1",
"react-native-screens": "4.30.0",
"react-native-shimmer-placeholder": "^2.0.9",
"react-native-svg": "15.12.1",
"react-native-svg": "15.16.0",
"react-native-url-polyfill": "2.0.0",
"react-native-web": "0.21.0",
"react-native-web": "0.21.4",
"react-native-web-refresh-control": "1.1.2",
"react-native-webview": "13.15.0",
"react-native-worklets": "0.5.1",
"react-native-webview": "14.0.1",
"react-native-worklets": "0.13.0",
"serialize-error": "12.0.0",
"sonner-native": "0.21.0",
"three": "0.185.1",
Expand All @@ -105,11 +101,11 @@
"zustand": "5.0.3"
},
"devDependencies": {
"@expo/cli": "54.0.1",
"@types/jest": "^29.5.14",
"@types/react": "19.1.10",
"jest": "29.7.0",
"jest-expo": "~54.0.17"
"@react-native/jest-preset": "0.88.0",
"@types/jest": "^30.0.0",
"@types/react": "19.3.0",
"jest": "30.5.2",
"jest-expo": "~58.0.11"
},
"jest": {
"preset": "jest-expo"
Expand All @@ -118,11 +114,8 @@
"expo": {
"install": {
"exclude": [
"expo-router",
"expo-store-review",
"react-native",
"@react-navigation/bottom-tabs",
"@react-navigation/native"
"jest",
"@types/jest"
]
},
"doctor": {
Expand Down
Loading
Loading