Skip to content

Upgrade app to Expo SDK 57#77

Merged
dabit3 merged 2 commits into
mainfrom
devin/1783525163-expo-57-upgrade
Jul 9, 2026
Merged

Upgrade app to Expo SDK 57#77
dabit3 merged 2 commits into
mainfrom
devin/1783525163-expo-57-upgrade

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Upgrades app/ from Expo SDK 54 → 57 (latest stable), aligning all dependencies via npx expo install --fix:

  • expo 54.0.35 → 57.0.4, react-native 0.81.5 → 0.86.0, react/react-dom 19.1.0 → 19.2.3, typescript → 6.0.3
  • All expo-* modules moved to the SDK 57 unified versioning (~57.0.x)
  • Added react-native-worklets@~0.10.0 (new peer dep of expo-modules-core/reanimated 4.5)
  • Expo pins some packages lower than what was previously installed: @react-native-async-storage/async-storage 3.1.1 → 2.2.0, react-native-gesture-handler 3.0.2 → 2.32.0, react-native-get-random-values 2.0.0 → 1.11.0 (these are the SDK 57-supported versions)
  • Regenerated android/ and ios/ via npx expo prebuild --clean (RN 0.86 native template). ios/Podfile.lock was removed by prebuild and will be regenerated on the next pod install (macOS only)
  • One code fix: RN 0.86's ColorSchemeName now includes 'unspecified', so getTheme in app/src/theme.ts accepts it

Verified: tsc --noEmit, expo lint, and expo export --platform web all pass.

Link to Devin session: https://app.devin.ai/sessions/948670b311474be4be99f8912d7d85a5
Requested by: @dabit3


Devin Review

Status Commit
⚪ Not started

Run Devin Review

Open in Devin Review (Staging)
Open in Devin Review

Co-Authored-By: Nader Dabit <dabit3@gmail.com>
@dabit3 dabit3 self-assigned this Jul 8, 2026
@dabit3
dabit3 self-requested a review July 8, 2026 15:43
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 7 potential issues.

⚠️ 1 issue in files not directly in the diff

⚠️ Temporary cache file accidentally committed to the repository (app/app.json.ncM01fCIoImSNOk7oHvu9SQ_RDZXzJa9-5eKVgu4N6A:1)

A zero-byte file with a content-hash suffix is added to the repository (app/app.json.ncM01fCIoImSNOk7oHvu9SQ_RDZXzJa9-5eKVgu4N6A), so the repo contains junk that should not be tracked.

Impact: Repository contains an unintended empty file that clutters the project.

Open in Devin Review

Comment thread app/ios/app/PrivacyInfo.xcprivacy Outdated

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 PrivacyInfo.xcprivacy removed from iOS project

The app-level PrivacyInfo.xcprivacy file was deleted and its references removed from the Xcode project (app/ios/app.xcodeproj/project.pbxproj). Apple requires privacy manifests for App Store submissions. The Podfile at app/ios/Podfile:52 still has privacy_file_aggregation_enabled which aggregates privacy manifests from CocoaPods dependencies, but the app's own privacy manifest (declaring usage of UserDefaults, FileTimestamp, DiskSpace, and SystemBootTime APIs) is gone. If the app itself uses these APIs (not just through pods), this could cause App Store rejection. Verify whether Expo SDK 57 now handles the app-level privacy manifest generation automatically.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SDK 57 handles privacy manifests via aggregation at pod install time (privacy_file_aggregation_enabled in the Podfile) — the standalone app-level PrivacyInfo.xcprivacy is no longer part of the prebuild template.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Xcode project removes Pods xcconfig base configurations and several build phases

The Xcode project at app/ios/app.xcodeproj/project.pbxproj removes baseConfigurationReference for both Debug and Release build configurations (previously pointing to Pods-app.debug.xcconfig and Pods-app.release.xcconfig), removes the [Expo] Configure project build phase, and removes the [CP] Embed Pods Frameworks build phase. This suggests a shift in how CocoaPods integration works with the new Expo SDK. The [CP] Check Pods Manifest.lock and [CP] Copy Pods Resources phases are retained. Without the base xcconfig references, pod-provided build settings (header search paths, linker flags, etc.) may not be inherited unless the new Expo SDK handles this differently (e.g., via SPM or a different integration mechanism). The Podfile.lock was also deleted, which means pod install must be run before building.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reflects the stock SDK 57 Xcode template from expo prebuild --clean; CocoaPods integration (xcconfig references, embed phases) is re-added by pod install, which also regenerates Podfile.lock.

Comment thread app/ios/app/SplashScreen.storyboard Outdated
Comment on lines +21 to +22
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="SplashScreen" translatesAutoresizingMaskIntoConstraints="NO" id="EXPO-SplashScreen" userLabel="SplashScreen">
<rect key="frame" x="146.66666666666666" y="381" width="100" height="90.333333333333314"/>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Splash screen image missing on iOS because the image asset was deleted without a replacement

The splash screen image asset is removed (SplashScreenLegacy.imageset deleted at app/ios/app/Images.xcassets/SplashScreenLegacy.imageset/Contents.json) but the storyboard still references an image named SplashScreen (app/ios/app/SplashScreen.storyboard:21), and the resources section declares a different name SplashScreenLogo (app/ios/app/SplashScreen.storyboard:42), so the iOS splash screen will display a blank view with no logo.

Impact: Users see a blank white splash screen on iOS app launch instead of the expected logo.

Image name mismatch and missing asset details

The imageView at line 21 uses image="SplashScreen" but the <resources> block at line 42 declares <image name="SplashScreenLogo"...>. These names are inconsistent with each other. More critically, neither a SplashScreen.imageset nor a SplashScreenLogo.imageset exists in app/ios/app/Images.xcassets/ — the only remaining items are AppIcon.appiconset and Contents.json. The old SplashScreenLegacy.imageset was deleted in this PR but no replacement image asset was added.

At runtime, iOS resolves the image by the image attribute on the imageView (SplashScreen), looking it up in the asset catalog. Since no such asset exists, the imageView will render empty.

Prompt for agents
The SplashScreen.storyboard references an image named 'SplashScreen' in the imageView (line 21) and 'SplashScreenLogo' in the resources section (line 42), but neither image asset exists in the Xcode asset catalog (app/ios/app/Images.xcassets/). The old SplashScreenLegacy.imageset was deleted without adding a replacement.

To fix this:
1. Add a new imageset to app/ios/app/Images.xcassets/ — either named 'SplashScreen' (matching the imageView's image attribute) or 'SplashScreenLogo' (matching the resources declaration), and update the other reference to be consistent.
2. Include the actual splash screen PNG files (1x, 2x, 3x) in the new imageset.
3. Make sure the image attribute on the imageView in line 21 and the image name in the resources block on line 42 use the same name.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed and fixed. The missing imageset was caused by the deprecated splash field in app.json no longer generating iOS assets in SDK 57. Moved the splash config to the expo-splash-screen config plugin and re-ran expo prebuild --cleanSplashScreenLogo.imageset and SplashScreenBackground.colorset are now generated and the storyboard references are consistent.

Comment on lines 20 to 21
reactNativeDelegate = delegate
reactNativeFactory = factory

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 bindReactNativeFactory call removed from iOS AppDelegate

The old AppDelegate called bindReactNativeFactory(factory) after creating the ExpoReactNativeFactory, but the new code at app/ios/app/AppDelegate.swift:20-21 stores the factory in instance variables without calling bindReactNativeFactory. This is likely an intentional Expo SDK 57 API change where the binding is handled internally by ExpoReactNativeFactory or startReactNative, but it's worth confirming that Expo modules (e.g., expo-splash-screen, expo-updates) still receive the factory reference they need to function.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the stock SDK 57 template AppDelegate generated by expo prebuild --clean — the factory binding is now handled internally by ExpoReactNativeFactory/startReactNative in the new template.

Comment thread app/package.json
"@expo/vector-icons": "^15.0.3",
"@gorhom/bottom-sheet": "^5.2.14",
"@react-native-async-storage/async-storage": "3.1.1",
"@react-native-async-storage/async-storage": "2.2.0",

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 AsyncStorage version downgraded from 3.1.1 to 2.2.0

The @react-native-async-storage/async-storage dependency was changed from 3.1.1 to 2.2.0 at app/package.json:18. This is a major version downgrade (3.x → 2.x), which is unusual in an SDK upgrade PR. This could be intentional if Expo SDK 57 doesn't yet support AsyncStorage v3, but it may also introduce API incompatibilities or missing features if the codebase was relying on v3 APIs.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional: npx expo install --fix pins the SDK 57-supported versions — async-storage 2.2.0, gesture-handler 2.32.0, get-random-values 1.11.0. The app only uses the basic getItem/setItem API, which is unchanged.

Comment on lines +8 to +9
<style name="Theme.App.SplashScreen" parent="AppTheme">
<item name="android:windowBackground">@drawable/splashscreen_logo</item>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Android splash screen approach changed from Android 12 API to windowBackground

The Android splash screen theme at app/android/app/src/main/res/values/styles.xml:8-9 changed from using Theme.SplashScreen parent with windowSplashScreenAnimatedIcon (Android 12+ splash screen API) to using AppTheme parent with android:windowBackground. The old approach centered the icon using the system splash screen API; the new approach sets the entire window background to the drawable. Since splashscreen_logo.png is a logo image (not a full-screen background), using it as android:windowBackground will stretch/tile it to fill the screen rather than centering it. This may be intentional if expo-splash-screen now handles the centering programmatically, but it's worth verifying the visual result.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — this was a side effect of the legacy splash config in app.json. After moving to the expo-splash-screen config plugin and regenerating, Theme.App.SplashScreen again uses the Android 12+ Theme.SplashScreen parent with windowSplashScreenAnimatedIcon.

… remove stray temp file

Co-Authored-By: Nader Dabit <dabit3@gmail.com>
@dabit3
dabit3 merged commit 10e228e into main Jul 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant