From 510f94abef5b7e88a02cfa09794a1985f9e95fa6 Mon Sep 17 00:00:00 2001 From: Hailey Date: Sun, 1 Dec 2024 15:28:17 -0800 Subject: [PATCH] update patches --- package.json | 42 +-- ...+4.5.0.patch => @lingui+core+4.14.0.patch} | 0 ...atch => @sentry+react-native+5.24.3.patch} | 0 ...ptics+12.8.1.md => expo-haptics+14.0.0.md} | 0 ...13.0.1.patch => expo-haptics+14.0.0.patch} | 0 patches/expo-image-picker+15.0.5.patch | 18 -- patches/expo-modules-core+1.12.11.md | 5 - patches/expo-modules-core+1.12.11.patch | 26 -- patches/expo-notifications+0.28.7.patch | 216 ------------- patches/expo-notifications+0.29.6.patch | 169 +++++++++++ ....md => expo-notifications+0.29.6.patch.md} | 0 ....25.14.patch => expo-updates+0.26.5.patch} | 0 ....patch.md => expo-updates+0.26.5.patch.md} | 0 patches/metro+0.80.4.patch | 44 --- patches/metro-runtime+0.80.4.patch | 50 ---- patches/metro-transform-worker+0.80.4.patch | 41 --- patches/react-native+0.74.1.patch | 283 ------------------ patches/react-native+0.76.1.patch | 146 +++++++++ ....patch.md => react-native+0.76.1.patch.md} | 0 patches/react-native-compressor+1.9.0.patch | 16 + ...eact-native-image-crop-picker+0.41.2.patch | 39 --- patches/react-native-screens+3.31.1.patch | 19 ++ patches/react-native-svg+15.3.0.patch | 57 ---- yarn.lock | 106 ++----- 24 files changed, 397 insertions(+), 880 deletions(-) rename patches/{@lingui+core+4.5.0.patch => @lingui+core+4.14.0.patch} (100%) rename patches/{@sentry+react-native+5.32.0.patch => @sentry+react-native+5.24.3.patch} (100%) rename patches/{expo-haptics+12.8.1.md => expo-haptics+14.0.0.md} (100%) rename patches/{expo-haptics+13.0.1.patch => expo-haptics+14.0.0.patch} (100%) delete mode 100644 patches/expo-image-picker+15.0.5.patch delete mode 100644 patches/expo-modules-core+1.12.11.md delete mode 100644 patches/expo-modules-core+1.12.11.patch delete mode 100644 patches/expo-notifications+0.28.7.patch create mode 100644 patches/expo-notifications+0.29.6.patch rename patches/{expo-notifications-0.28.7.patch.md => expo-notifications+0.29.6.patch.md} (100%) rename patches/{expo-updates+0.25.14.patch => expo-updates+0.26.5.patch} (100%) rename patches/{expo-updates+0.25.11.patch.md => expo-updates+0.26.5.patch.md} (100%) delete mode 100644 patches/metro+0.80.4.patch delete mode 100644 patches/metro-runtime+0.80.4.patch delete mode 100644 patches/metro-transform-worker+0.80.4.patch delete mode 100644 patches/react-native+0.74.1.patch create mode 100644 patches/react-native+0.76.1.patch rename patches/{react-native+0.74.1.patch.md => react-native+0.76.1.patch.md} (100%) create mode 100644 patches/react-native-compressor+1.9.0.patch delete mode 100644 patches/react-native-image-crop-picker+0.41.2.patch create mode 100644 patches/react-native-screens+3.31.1.patch delete mode 100644 patches/react-native-svg+15.3.0.patch diff --git a/package.json b/package.json index 64618a5200..468d2304de 100644 --- a/package.json +++ b/package.json @@ -119,33 +119,33 @@ "emoji-mart": "^5.5.2", "emoji-regex": "^10.4.0", "eventemitter3": "^5.0.1", - "expo": "^52.0.0", - "expo-application": "^6.0.0", - "expo-blur": "^14.0.0", - "expo-build-properties": "^0.13.0", - "expo-camera": "~16.0.2", + "expo": "^52.0.11", + "expo-application": "^6.0.1", + "expo-blur": "^14.0.1", + "expo-build-properties": "^0.13.1", + "expo-camera": "~16.0.7", "expo-clipboard": "^7.0.0", - "expo-dev-client": "^5.0.0-preview.9", - "expo-device": "~7.0.0", - "expo-file-system": "^18.0.0", - "expo-font": "~13.0.0", + "expo-dev-client": "^5.0.4", + "expo-device": "~7.0.1", + "expo-file-system": "^18.0.4", + "expo-font": "~13.0.1", "expo-haptics": "^14.0.0", - "expo-image": "~2.0.0-preview.1", - "expo-image-manipulator": "^13.0.4", - "expo-image-picker": "~16.0.0", - "expo-linear-gradient": "^14.0.0", - "expo-linking": "^7.0.1", + "expo-image": "~2.0.2", + "expo-image-manipulator": "^13.0.5", + "expo-image-picker": "~16.0.3", + "expo-linear-gradient": "^14.0.1", + "expo-linking": "^7.0.3", "expo-localization": "~16.0.0", - "expo-media-library": "~17.0.1", - "expo-navigation-bar": "~4.0.1", - "expo-notifications": "~0.29.5", + "expo-media-library": "~17.0.3", + "expo-navigation-bar": "~4.0.4", + "expo-notifications": "~0.29.8", "expo-sharing": "^13.0.0", - "expo-splash-screen": "~0.27.6", + "expo-splash-screen": "~0.29.13", "expo-status-bar": "~2.0.0", "expo-system-ui": "^4.0.4", - "expo-task-manager": "~12.0.1", - "expo-updates": "~0.26.4", - "expo-web-browser": "~14.0.0", + "expo-task-manager": "~12.0.3", + "expo-updates": "~0.26.9", + "expo-web-browser": "~14.0.1", "history": "^5.3.0", "hls.js": "^1.5.11", "js-sha256": "^0.9.0", diff --git a/patches/@lingui+core+4.5.0.patch b/patches/@lingui+core+4.14.0.patch similarity index 100% rename from patches/@lingui+core+4.5.0.patch rename to patches/@lingui+core+4.14.0.patch diff --git a/patches/@sentry+react-native+5.32.0.patch b/patches/@sentry+react-native+5.24.3.patch similarity index 100% rename from patches/@sentry+react-native+5.32.0.patch rename to patches/@sentry+react-native+5.24.3.patch diff --git a/patches/expo-haptics+12.8.1.md b/patches/expo-haptics+14.0.0.md similarity index 100% rename from patches/expo-haptics+12.8.1.md rename to patches/expo-haptics+14.0.0.md diff --git a/patches/expo-haptics+13.0.1.patch b/patches/expo-haptics+14.0.0.patch similarity index 100% rename from patches/expo-haptics+13.0.1.patch rename to patches/expo-haptics+14.0.0.patch diff --git a/patches/expo-image-picker+15.0.5.patch b/patches/expo-image-picker+15.0.5.patch deleted file mode 100644 index 962b36612d..0000000000 --- a/patches/expo-image-picker+15.0.5.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/exporters/RawImageExporter.kt b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/exporters/RawImageExporter.kt -index f339e5f..fa35e82 100644 ---- a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/exporters/RawImageExporter.kt -+++ b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/exporters/RawImageExporter.kt -@@ -16,7 +16,12 @@ class RawImageExporter : ImageExporter { - copyFile(source, output, contentResolver) - val exifInterface = ExifInterface(output.absolutePath) - val imageRotation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0) -- val isRotatedLandscape = (imageRotation == ExifInterface.ORIENTATION_ROTATE_90 || imageRotation == ExifInterface.ORIENTATION_ROTATE_270) -+ val isRotatedLandscape = ( -+ imageRotation == ExifInterface.ORIENTATION_ROTATE_90 || -+ imageRotation == ExifInterface.ORIENTATION_ROTATE_270 || -+ imageRotation == ExifInterface.ORIENTATION_TRANSPOSE || -+ imageRotation == ExifInterface.ORIENTATION_TRANSVERSE -+ ) - val options = BitmapFactory.Options().apply { inJustDecodeBounds = true } - - BitmapFactory.decodeFile(output.absolutePath, options) diff --git a/patches/expo-modules-core+1.12.11.md b/patches/expo-modules-core+1.12.11.md deleted file mode 100644 index a690c8609b..0000000000 --- a/patches/expo-modules-core+1.12.11.md +++ /dev/null @@ -1,5 +0,0 @@ -## expo-modules-core Patch - -This patch fixes crashes seen in some Android clients when using intents to open the app. See https://github.com/expo/expo/pull/29513. - -Do not remove this patch until that PR lands in Expo and is released. diff --git a/patches/expo-modules-core+1.12.11.patch b/patches/expo-modules-core+1.12.11.patch deleted file mode 100644 index ea26b821da..0000000000 --- a/patches/expo-modules-core+1.12.11.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java -index bb74e80..0aa0202 100644 ---- a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java -+++ b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java -@@ -90,8 +90,8 @@ public class NativeModulesProxy extends ReactContextBaseJavaModule { - mModuleRegistry.ensureIsInitialized(); - - KotlinInteropModuleRegistry kotlinModuleRegistry = getKotlinInteropModuleRegistry(); -- kotlinModuleRegistry.emitOnCreate(); - kotlinModuleRegistry.installJSIInterop(); -+ kotlinModuleRegistry.emitOnCreate(); - - Map constants = new HashMap<>(3); - constants.put(MODULES_CONSTANTS_KEY, new HashMap<>()); -diff --git a/node_modules/expo-modules-core/build/uuid/uuid.js b/node_modules/expo-modules-core/build/uuid/uuid.js -index 109d3fe..c7fce9e 100644 ---- a/node_modules/expo-modules-core/build/uuid/uuid.js -+++ b/node_modules/expo-modules-core/build/uuid/uuid.js -@@ -1,5 +1,7 @@ - import bytesToUuid from './lib/bytesToUuid'; - import { Uuidv5Namespace } from './uuid.types'; -+import { ensureNativeModulesAreInstalled } from '../ensureNativeModulesAreInstalled'; -+ensureNativeModulesAreInstalled(); - const nativeUuidv4 = globalThis?.expo?.uuidv4; - const nativeUuidv5 = globalThis?.expo?.uuidv5; - function uuidv4() { diff --git a/patches/expo-notifications+0.28.7.patch b/patches/expo-notifications+0.28.7.patch deleted file mode 100644 index b71da2ebb8..0000000000 --- a/patches/expo-notifications+0.28.7.patch +++ /dev/null @@ -1,216 +0,0 @@ -diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle -index b863077..8b5209e 100644 ---- a/node_modules/expo-notifications/android/build.gradle -+++ b/node_modules/expo-notifications/android/build.gradle -@@ -32,6 +32,7 @@ dependencies { - api 'com.google.firebase:firebase-messaging:22.0.0' - - api 'me.leolin:ShortcutBadger:1.1.22@aar' -+ implementation project(':expo-background-notification-handler') - - if (project.findProject(':expo-modules-test-core')) { - testImplementation project(':expo-modules-test-core') -diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/badge/BadgeHelper.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/badge/BadgeHelper.kt -index 63a46c5..f911834 100644 ---- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/badge/BadgeHelper.kt -+++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/badge/BadgeHelper.kt -@@ -1,5 +1,6 @@ - package expo.modules.notifications.badge - -+import android.app.NotificationManager - import android.content.Context - import android.util.Log - import me.leolin.shortcutbadger.ShortcutBadgeException -@@ -12,7 +13,12 @@ object BadgeHelper { - - fun setBadgeCount(context: Context, badgeCount: Int): Boolean { - return try { -- ShortcutBadger.applyCountOrThrow(context.applicationContext, badgeCount) -+ if (badgeCount == 0) { -+ val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager -+ notificationManager.cancelAll() -+ } else { -+ ShortcutBadger.applyCountOrThrow(context.applicationContext, badgeCount) -+ } - BadgeHelper.badgeCount = badgeCount - true - } catch (e: ShortcutBadgeException) { -diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/JSONNotificationContentBuilder.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/JSONNotificationContentBuilder.java -index 0af7fe0..8f2c8d8 100644 ---- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/JSONNotificationContentBuilder.java -+++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/JSONNotificationContentBuilder.java -@@ -14,6 +14,7 @@ import expo.modules.notifications.notifications.enums.NotificationPriority; - import expo.modules.notifications.notifications.model.NotificationContent; - - public class JSONNotificationContentBuilder extends NotificationContent.Builder { -+ private static final String CHANNEL_ID_KEY = "channelId"; - private static final String TITLE_KEY = "title"; - private static final String TEXT_KEY = "message"; - private static final String SUBTITLE_KEY = "subtitle"; -@@ -36,6 +37,7 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder - - public NotificationContent.Builder setPayload(JSONObject payload) { - this.setTitle(getTitle(payload)) -+ .setChannelId(getChannelId(payload)) - .setSubtitle(getSubtitle(payload)) - .setText(getText(payload)) - .setBody(getBody(payload)) -@@ -60,6 +62,14 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder - return this; - } - -+ protected String getChannelId(JSONObject payload) { -+ try { -+ return payload.getString(CHANNEL_ID_KEY); -+ } catch (JSONException e) { -+ return null; -+ } -+ } -+ - protected String getTitle(JSONObject payload) { - try { - return payload.getString(TITLE_KEY); -diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java -index f1fed19..012757b 100644 ---- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java -+++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java -@@ -20,6 +20,7 @@ import expo.modules.notifications.notifications.enums.NotificationPriority; - * should be created using {@link NotificationContent.Builder}. - */ - public class NotificationContent implements Parcelable, Serializable { -+ private String mChannelId; - private String mTitle; - private String mText; - private String mSubtitle; -@@ -50,6 +51,11 @@ public class NotificationContent implements Parcelable, Serializable { - } - }; - -+ @Nullable -+ public String getChannelId() { -+ return mChannelId; -+ } -+ - @Nullable - public String getTitle() { - return mTitle; -@@ -121,6 +127,7 @@ public class NotificationContent implements Parcelable, Serializable { - } - - protected NotificationContent(Parcel in) { -+ mChannelId = in.readString(); - mTitle = in.readString(); - mText = in.readString(); - mSubtitle = in.readString(); -@@ -146,6 +153,7 @@ public class NotificationContent implements Parcelable, Serializable { - - @Override - public void writeToParcel(Parcel dest, int flags) { -+ dest.writeString(mChannelId); - dest.writeString(mTitle); - dest.writeString(mText); - dest.writeString(mSubtitle); -@@ -166,6 +174,7 @@ public class NotificationContent implements Parcelable, Serializable { - private static final long serialVersionUID = 397666843266836802L; - - private void writeObject(java.io.ObjectOutputStream out) throws IOException { -+ out.writeObject(mChannelId); - out.writeObject(mTitle); - out.writeObject(mText); - out.writeObject(mSubtitle); -@@ -190,6 +199,7 @@ public class NotificationContent implements Parcelable, Serializable { - } - - private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { -+ mChannelId = (String) in.readObject(); - mTitle = (String) in.readObject(); - mText = (String) in.readObject(); - mSubtitle = (String) in.readObject(); -@@ -240,6 +250,7 @@ public class NotificationContent implements Parcelable, Serializable { - } - - public static class Builder { -+ private String mChannelId; - private String mTitle; - private String mText; - private String mSubtitle; -@@ -260,6 +271,11 @@ public class NotificationContent implements Parcelable, Serializable { - useDefaultVibrationPattern(); - } - -+ public Builder setChannelId(String channelId) { -+ mChannelId = channelId; -+ return this; -+ } -+ - public Builder setTitle(String title) { - mTitle = title; - return this; -@@ -336,6 +352,7 @@ public class NotificationContent implements Parcelable, Serializable { - - public NotificationContent build() { - NotificationContent content = new NotificationContent(); -+ content.mChannelId = mChannelId; - content.mTitle = mTitle; - content.mSubtitle = mSubtitle; - content.mText = mText; -diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java -index 6bd9928..ee93d70 100644 ---- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java -+++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java -@@ -48,6 +48,10 @@ public class ExpoNotificationBuilder extends ChannelAwareNotificationBuilder { - - NotificationContent content = getNotificationContent(); - -+ if (content.getChannelId() != null) { -+ builder.setChannelId(content.getChannelId()); -+ } -+ - builder.setAutoCancel(content.isAutoDismiss()); - builder.setOngoing(content.isSticky()); - -diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt -index 55b3a8d..1b99d5b 100644 ---- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt -+++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt -@@ -12,11 +12,14 @@ import expo.modules.notifications.notifications.model.triggers.FirebaseNotificat - import expo.modules.notifications.service.NotificationsService - import expo.modules.notifications.service.interfaces.FirebaseMessagingDelegate - import expo.modules.notifications.tokens.interfaces.FirebaseTokenListener -+import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandler -+import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandlerInterface -+import expo.modules.backgroundnotificationhandler.ExpoBackgroundNotificationHandlerModule - import org.json.JSONObject - import java.lang.ref.WeakReference - import java.util.* - --open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate { -+open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate, BackgroundNotificationHandlerInterface { - companion object { - // Unfortunately we cannot save state between instances of a service other way - // than by static properties. Fortunately, using weak references we can -@@ -89,12 +92,21 @@ open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseM - fun getBackgroundTasks() = sBackgroundTaskConsumerReferences.values.mapNotNull { it.get() } - - override fun onMessageReceived(remoteMessage: RemoteMessage) { -- NotificationsService.receive(context, createNotification(remoteMessage)) -- getBackgroundTasks().forEach { -- it.scheduleJob(RemoteMessageSerializer.toBundle(remoteMessage)) -+ if (!ExpoBackgroundNotificationHandlerModule.isForegrounded) { -+ BackgroundNotificationHandler(context, this).handleMessage(remoteMessage) -+ return -+ } else { -+ showMessage(remoteMessage) -+ getBackgroundTasks().forEach { -+ it.scheduleJob(RemoteMessageSerializer.toBundle(remoteMessage)) -+ } - } - } - -+ override fun showMessage(remoteMessage: RemoteMessage) { -+ NotificationsService.receive(context, createNotification(remoteMessage)) -+ } -+ - protected fun createNotification(remoteMessage: RemoteMessage): Notification { - val identifier = getNotificationIdentifier(remoteMessage) - val payload = JSONObject(remoteMessage.data as Map<*, *>) diff --git a/patches/expo-notifications+0.29.6.patch b/patches/expo-notifications+0.29.6.patch new file mode 100644 index 0000000000..276fe9c7ae --- /dev/null +++ b/patches/expo-notifications+0.29.6.patch @@ -0,0 +1,169 @@ +diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle +index b8dcff8..701196c 100644 +--- a/node_modules/expo-notifications/android/build.gradle ++++ b/node_modules/expo-notifications/android/build.gradle +@@ -46,6 +46,7 @@ dependencies { + implementation 'com.google.firebase:firebase-messaging:24.0.1' + + implementation 'me.leolin:ShortcutBadger:1.1.22@aar' ++ implementation project(':expo-background-notification-handler') + + if (project.findProject(':expo-modules-test-core')) { + testImplementation project(':expo-modules-test-core') +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt +index 7b99e6c..45a450d 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt +@@ -15,6 +15,7 @@ import org.json.JSONObject + * This interface exists to provide a common API for both classes. + * */ + interface INotificationContent : Parcelable { ++ val channelId: String? + val title: String? + val text: String? + val subText: String? +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java +index 06dfe5a..e2b0559 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java +@@ -34,6 +34,7 @@ import kotlin.coroutines.Continuation; + * Refactoring this class may require a migration strategy for the data stored in SharedPreferences. + */ + public class NotificationContent implements Parcelable, Serializable, INotificationContent { ++ private String mChannelId; + private String mTitle; + private String mText; + private String mSubtitle; +@@ -64,6 +65,11 @@ public class NotificationContent implements Parcelable, Serializable, INotificat + } + }; + ++ @Nullable ++ public String getChannelId() { ++ return mChannelId; ++ } ++ + @Nullable + public String getTitle() { + return mTitle; +@@ -157,6 +163,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat + } + + protected NotificationContent(Parcel in) { ++ mChannelId = in.readString(); + mTitle = in.readString(); + mText = in.readString(); + mSubtitle = in.readString(); +@@ -182,6 +189,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat + + @Override + public void writeToParcel(Parcel dest, int flags) { ++ dest.writeString(mChannelId); + dest.writeString(mTitle); + dest.writeString(mText); + dest.writeString(mSubtitle); +@@ -202,6 +210,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat + private static final long serialVersionUID = 397666843266836802L; + + private void writeObject(java.io.ObjectOutputStream out) throws IOException { ++ out.writeObject(mChannelId); + out.writeObject(mTitle); + out.writeObject(mText); + out.writeObject(mSubtitle); +@@ -284,6 +293,11 @@ public class NotificationContent implements Parcelable, Serializable, INotificat + useDefaultVibrationPattern(); + } + ++ public Builder setChannelId(String channelId) { ++ content.mChannelId = channelId; ++ return this; ++ } ++ + public Builder setTitle(String title) { + content.mTitle = title; + return this; +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt +index 39b5aad..e50797d 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt +@@ -11,6 +11,9 @@ import org.json.JSONObject + * */ + @JvmInline + value class NotificationData(private val data: Map) { ++ val channelId: String? ++ get() = data["channelId"] ++ + val title: String? + get() = data["title"] + +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt +index d2cc6cf..6a48ff2 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt +@@ -31,6 +31,8 @@ class RemoteNotificationContent(private val remoteMessage: RemoteMessage) : INot + return remoteMessage.notification?.imageUrl != null + } + ++ override val channelId = remoteMessage.notification?.channelId ?: notificationData.channelId ++ + override val title = remoteMessage.notification?.title ?: notificationData.title + + override val text = remoteMessage.notification?.body ?: notificationData.message +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt +index 0b0435e..eb47ddb 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt +@@ -99,6 +99,9 @@ open class ExpoNotificationBuilder( + builder.setOngoing(content.isSticky) + + // see "Notification anatomy" https://developer.android.com/develop/ui/views/notifications#Templates ++ content.channelId?.let { ++ builder.setChannelId(it) ++ } + builder.setContentTitle(content.title) + builder.setContentText(content.text) + builder.setSubText(content.subText) +diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt +index 9f22441..5f92f80 100644 +--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt ++++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt +@@ -2,6 +2,9 @@ package expo.modules.notifications.service.delegates + + import android.content.Context + import com.google.firebase.messaging.RemoteMessage ++import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandler ++import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandlerInterface ++import expo.modules.backgroundnotificationhandler.ExpoBackgroundNotificationHandlerModule + import expo.modules.interfaces.taskManager.TaskServiceProviderHelper + import expo.modules.notifications.notifications.RemoteMessageSerializer + import expo.modules.notifications.notifications.background.BackgroundRemoteNotificationTaskConsumer +@@ -17,7 +20,8 @@ import expo.modules.notifications.tokens.interfaces.FirebaseTokenListener + import java.lang.ref.WeakReference + import java.util.* + +-open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate { ++open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate, ++ BackgroundNotificationHandlerInterface { + companion object { + // Unfortunately we cannot save state between instances of a service other way + // than by static properties. Fortunately, using weak references we can +@@ -94,8 +98,17 @@ open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseM + DebugLogging.logRemoteMessage("FirebaseMessagingDelegate.onMessageReceived: message", remoteMessage) + val notification = createNotification(remoteMessage) + DebugLogging.logNotification("FirebaseMessagingDelegate.onMessageReceived: notification", notification) +- NotificationsService.receive(context, notification) +- runTaskManagerTasks(remoteMessage) ++ ++ if (!ExpoBackgroundNotificationHandlerModule.isForegrounded) { ++ BackgroundNotificationHandler(context, this).handleMessage(remoteMessage) ++ } else { ++ showMessage(remoteMessage) ++ runTaskManagerTasks(remoteMessage) ++ } ++ } ++ ++ override fun showMessage(remoteMessage: RemoteMessage) { ++ NotificationsService.receive(context, createNotification(remoteMessage)) + } + + private fun runTaskManagerTasks(remoteMessage: RemoteMessage) { diff --git a/patches/expo-notifications-0.28.7.patch.md b/patches/expo-notifications+0.29.6.patch.md similarity index 100% rename from patches/expo-notifications-0.28.7.patch.md rename to patches/expo-notifications+0.29.6.patch.md diff --git a/patches/expo-updates+0.25.14.patch b/patches/expo-updates+0.26.5.patch similarity index 100% rename from patches/expo-updates+0.25.14.patch rename to patches/expo-updates+0.26.5.patch diff --git a/patches/expo-updates+0.25.11.patch.md b/patches/expo-updates+0.26.5.patch.md similarity index 100% rename from patches/expo-updates+0.25.11.patch.md rename to patches/expo-updates+0.26.5.patch.md diff --git a/patches/metro+0.80.4.patch b/patches/metro+0.80.4.patch deleted file mode 100644 index f8ef67c84c..0000000000 --- a/patches/metro+0.80.4.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js b/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js -index 48a1409..ef185c9 100644 ---- a/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js -+++ b/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js -@@ -70,14 +70,19 @@ function wrapModule( - importDefaultName, - importAllName, - dependencyMapName, -- globalPrefix -+ globalPrefix, -+ moduleFactoryName - ) { - const params = buildParameters( - importDefaultName, - importAllName, - dependencyMapName - ); -- const factory = functionFromProgram(fileAst.program, params); -+ const factory = functionFromProgram( -+ fileAst.program, -+ params, -+ moduleFactoryName -+ ); - const def = t.callExpression(t.identifier(`${globalPrefix}__d`), [factory]); - const ast = t.file(t.program([t.expressionStatement(def)])); - const requireName = renameRequires(ast); -@@ -107,7 +112,16 @@ function wrapJson(source, globalPrefix) { - "});", - ].join("\n"); - } --function functionFromProgram(program, parameters) { -+const JS_INVALID_IDENT_RE = /[^a-zA-Z0-9$_]/g; -+function functionFromProgram(program, parameters, moduleFactoryName) { -+ let identifier; -+ if (typeof moduleFactoryName === "string" && moduleFactoryName !== "") { -+ // Keep the name readable so it shows up in profiler traces. -+ // Add an unlikely suffix to avoid collisions with the module code. -+ identifier = t.identifier( -+ `${moduleFactoryName.replace(JS_INVALID_IDENT_RE, "_")}__module_factory__` -+ ); -+ } - return t.functionExpression( - undefined, - parameters.map(makeIdentifier), diff --git a/patches/metro-runtime+0.80.4.patch b/patches/metro-runtime+0.80.4.patch deleted file mode 100644 index 65303775d5..0000000000 --- a/patches/metro-runtime+0.80.4.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/node_modules/metro-runtime/src/polyfills/require.js b/node_modules/metro-runtime/src/polyfills/require.js -index ce67cb4..eeeae84 100644 ---- a/node_modules/metro-runtime/src/polyfills/require.js -+++ b/node_modules/metro-runtime/src/polyfills/require.js -@@ -22,6 +22,13 @@ global.__c = clear; - global.__registerSegment = registerSegment; - var modules = clear(); - -+if (__DEV__) { -+ // Added by Dan for module init logging. -+ global.__INIT_LOGS__ = [] -+ var initModuleCounter = 0 -+ var initModuleStack = [] -+} -+ - // Don't use a Symbol here, it would pull in an extra polyfill with all sorts of - // additional stuff (e.g. Array.from). - const EMPTY = {}; -@@ -303,7 +310,30 @@ function loadModuleImplementation(moduleId, module) { - throw module.error; - } - if (__DEV__) { -- var Systrace = requireSystrace(); -+ // Added by Dan for module init logging. -+ var Systrace = { -+ beginEvent(label) { -+ let fullLabel = initModuleCounter++ + ' ' + label -+ global.__INIT_LOGS__.push( -+ ' '.repeat(initModuleStack.length) + -+ ' ENTER ' + fullLabel -+ ) -+ initModuleStack.push({ -+ fullLabel, -+ startTime: nativePerformanceNow(), -+ }) -+ }, -+ endEvent() { -+ const res = initModuleStack.pop() -+ const fullLabel = res.fullLabel -+ const startTime = res.startTime -+ const timeElapsed = Math.round(nativePerformanceNow() - startTime) -+ global.__INIT_LOGS__.push( -+ ' '.repeat(initModuleStack.length) + -+ ' LEAVE ' + fullLabel + ' [' + timeElapsed + 'ms]', -+ ) -+ } -+ }; - var Refresh = requireRefresh(); - } - diff --git a/patches/metro-transform-worker+0.80.4.patch b/patches/metro-transform-worker+0.80.4.patch deleted file mode 100644 index 717b7c2d9c..0000000000 --- a/patches/metro-transform-worker+0.80.4.patch +++ /dev/null @@ -1,41 +0,0 @@ -diff --git a/node_modules/metro-transform-worker/src/index.js b/node_modules/metro-transform-worker/src/index.js -index 9f2e3d2..5222c8e 100644 ---- a/node_modules/metro-transform-worker/src/index.js -+++ b/node_modules/metro-transform-worker/src/index.js -@@ -189,6 +189,10 @@ async function transformJS(file, { config, options, projectRoot }) { - let dependencyMapName = ""; - let dependencies; - let wrappedAst; -+ const minify = -+ options.minify && -+ options.unstable_transformProfile !== "hermes-canary" && -+ options.unstable_transformProfile !== "hermes-stable"; - - // If the module to transform is a script (meaning that is not part of the - // dependency graph and it code will just be prepended to the bundle modules), -@@ -228,19 +232,20 @@ async function transformJS(file, { config, options, projectRoot }) { - if (config.unstable_disableModuleWrapping === true) { - wrappedAst = ast; - } else { -+ let moduleFactoryName; -+ if (options.dev && !minify) { -+ moduleFactoryName = file.filename; -+ } - ({ ast: wrappedAst } = JsFileWrapping.wrapModule( - ast, - importDefault, - importAll, - dependencyMapName, -- config.globalPrefix -+ config.globalPrefix, -+ moduleFactoryName - )); - } - } -- const minify = -- options.minify && -- options.unstable_transformProfile !== "hermes-canary" && -- options.unstable_transformProfile !== "hermes-stable"; - const reserved = []; - if (config.unstable_dependencyMapReservedName != null) { - reserved.push(config.unstable_dependencyMapReservedName); diff --git a/patches/react-native+0.74.1.patch b/patches/react-native+0.74.1.patch deleted file mode 100644 index d9f55aa308..0000000000 --- a/patches/react-native+0.74.1.patch +++ /dev/null @@ -1,283 +0,0 @@ -diff --git a/node_modules/react-native/Libraries/Blob/RCTFileReaderModule.mm b/node_modules/react-native/Libraries/Blob/RCTFileReaderModule.mm -index caa5540..c5d4e67 100644 ---- a/node_modules/react-native/Libraries/Blob/RCTFileReaderModule.mm -+++ b/node_modules/react-native/Libraries/Blob/RCTFileReaderModule.mm -@@ -73,7 +73,7 @@ @implementation RCTFileReaderModule - } else { - NSString *type = [RCTConvert NSString:blob[@"type"]]; - NSString *text = [NSString stringWithFormat:@"data:%@;base64,%@", -- type != nil && [type length] > 0 ? type : @"application/octet-stream", -+ ![type isEqual:[NSNull null]] && [type length] > 0 ? type : @"application/octet-stream", - [data base64EncodedStringWithOptions:0]]; - - resolve(text); -diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -index b0d71dc..41b9a0e 100644 ---- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -+++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm -@@ -377,10 +377,6 @@ - (void)textInputDidBeginEditing - self.backedTextInputView.attributedText = [NSAttributedString new]; - } - -- if (_selectTextOnFocus) { -- [self.backedTextInputView selectAll:nil]; -- } -- - [_eventDispatcher sendTextEventWithType:RCTTextEventTypeFocus - reactTag:self.reactTag - text:[self.backedTextInputView.attributedText.string copy] -@@ -611,6 +607,10 @@ - (UIView *)reactAccessibilityElement - - (void)reactFocus - { - [self.backedTextInputView reactFocus]; -+ -+ if (_selectTextOnFocus) { -+ [self.backedTextInputView selectAll:nil]; -+ } - } - - - (void)reactBlur -diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h -index e9b330f..ec5f58c 100644 ---- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h -+++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h -@@ -15,5 +15,8 @@ - @property (nonatomic, copy) NSString *title; - @property (nonatomic, copy) RCTDirectEventBlock onRefresh; - @property (nonatomic, weak) UIScrollView *scrollView; -+@property (nonatomic, copy) UIColor *customTintColor; -+ -+- (void)forwarderBeginRefreshing; - - @end -diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m -index b09e653..d2b4e05 100644 ---- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m -+++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m -@@ -22,6 +22,7 @@ @implementation RCTRefreshControl { - NSString *_title; - UIColor *_titleColor; - CGFloat _progressViewOffset; -+ UIColor *_customTintColor; - } - - - (instancetype)init -@@ -56,6 +57,12 @@ - (void)layoutSubviews - _isInitialRender = false; - } - -+- (void)didMoveToSuperview -+{ -+ [super didMoveToSuperview]; -+ [self setTintColor:_customTintColor]; -+} -+ - - (void)beginRefreshingProgrammatically - { - UInt64 beginRefreshingTimestamp = _currentRefreshingStateTimestamp; -@@ -203,4 +210,58 @@ - (void)refreshControlValueChanged - } - } - -+- (void)setCustomTintColor:(UIColor *)customTintColor -+{ -+ _customTintColor = customTintColor; -+ [self setTintColor:customTintColor]; -+} -+ -+// Fix for https://github.com/facebook/react-native/issues/43388 -+// A bug in iOS 17.4 causes the haptic to not play when refreshing if the tintColor -+// is set before the refresh control gets added to the scrollview. We'll call this -+// function whenever the superview changes. We'll also call it if the value of customTintColor -+// changes. -+- (void)setTintColor:(UIColor *)tintColor -+{ -+ if ([self.superview isKindOfClass:[UIScrollView class]] && self.tintColor != tintColor) { -+ [super setTintColor:tintColor]; -+ } -+} -+ -+/* -+ This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native -+ libraries to perform a refresh of a scrollview and access the refresh control's onRefresh -+ function. -+ */ -+- (void)forwarderBeginRefreshing -+{ -+ _refreshingProgrammatically = NO; -+ -+ [self sizeToFit]; -+ -+ if (!self.scrollView) { -+ return; -+ } -+ -+ UIScrollView *scrollView = (UIScrollView *)self.scrollView; -+ -+ [UIView animateWithDuration:0.3 -+ delay:0 -+ options:UIViewAnimationOptionBeginFromCurrentState -+ animations:^(void) { -+ // Whenever we call this method, the scrollview will always be at a position of -+ // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl -+ [scrollView setContentOffset:CGPointMake(0, -65)]; -+ } -+ completion:^(__unused BOOL finished) { -+ [super beginRefreshing]; -+ [self setCurrentRefreshingState:super.refreshing]; -+ -+ if (self->_onRefresh) { -+ self->_onRefresh(nil); -+ } -+ } -+ ]; -+} -+ - @end -diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m -index 40aaf9c..1c60164 100644 ---- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m -+++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m -@@ -22,11 +22,12 @@ - (UIView *)view - - RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock) - RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL) --RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor) - RCT_EXPORT_VIEW_PROPERTY(title, NSString) - RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor) - RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat) - -+RCT_REMAP_VIEW_PROPERTY(tintColor, customTintColor, UIColor) -+ - RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing) - { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { -diff --git a/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m b/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m -index 1aead51..39e6244 100644 ---- a/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m -+++ b/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m -@@ -159,31 +159,6 @@ - (BOOL)touchesShouldCancelInContentView:(__unused UIView *)view - return !shouldDisableScrollInteraction; - } - --/* -- * Automatically centers the content such that if the content is smaller than the -- * ScrollView, we force it to be centered, but when you zoom or the content otherwise -- * becomes larger than the ScrollView, there is no padding around the content but it -- * can still fill the whole view. -- */ --- (void)setContentOffset:(CGPoint)contentOffset --{ -- UIView *contentView = [self contentView]; -- if (contentView && _centerContent && !CGSizeEqualToSize(contentView.frame.size, CGSizeZero)) { -- CGSize subviewSize = contentView.frame.size; -- CGSize scrollViewSize = self.bounds.size; -- if (subviewSize.width <= scrollViewSize.width) { -- contentOffset.x = -(scrollViewSize.width - subviewSize.width) / 2.0; -- } -- if (subviewSize.height <= scrollViewSize.height) { -- contentOffset.y = -(scrollViewSize.height - subviewSize.height) / 2.0; -- } -- } -- -- super.contentOffset = CGPointMake( -- RCTSanitizeNaNValue(contentOffset.x, @"scrollView.contentOffset.x"), -- RCTSanitizeNaNValue(contentOffset.y, @"scrollView.contentOffset.y")); --} -- - - (void)setFrame:(CGRect)frame - { - // Preserving and revalidating `contentOffset`. -@@ -427,6 +402,11 @@ - (void)setRemoveClippedSubviews:(__unused BOOL)removeClippedSubviews - // Does nothing - } - -+- (void)setFrame:(CGRect)frame { -+ [super setFrame:frame]; -+ [self centerContentIfNeeded]; -+} -+ - - (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex - { - [super insertReactSubview:view atIndex:atIndex]; -@@ -444,6 +424,8 @@ - (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex - RCTApplyTransformationAccordingLayoutDirection(_contentView, self.reactLayoutDirection); - [_scrollView addSubview:view]; - } -+ -+ [self centerContentIfNeeded]; - } - - - (void)removeReactSubview:(UIView *)subview -@@ -652,9 +634,46 @@ -(void)delegateMethod : (UIScrollView *)scrollView \ - } - - RCT_SCROLL_EVENT_HANDLER(scrollViewWillBeginDecelerating, onMomentumScrollBegin) --RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, onScroll) - RCT_SCROLL_EVENT_HANDLER(scrollViewDidScrollToTop, onScrollToTop) - -+-(void)scrollViewDidZoom : (UIScrollView *)scrollView -+{ -+ [self centerContentIfNeeded]; -+ -+ RCT_SEND_SCROLL_EVENT(onScroll, nil); -+ RCT_FORWARD_SCROLL_EVENT(scrollViewDidZoom : scrollView); -+} -+ -+/* -+ * Automatically centers the content such that if the content is smaller than the -+ * ScrollView, we force it to be centered, but when you zoom or the content otherwise -+ * becomes larger than the ScrollView, there is no padding around the content but it -+ * can still fill the whole view. -+ * -+ * PATCHED: This deviates from the original React Native implementation to fix two issues: -+ * -+ * - The scroll view was swallowing any taps immediately after pinching -+ * - The scroll view was jittering when crossing the full screen threshold while pinching -+ * -+ * This implementation is based on https://petersteinberger.com/blog/2013/how-to-center-uiscrollview/. -+ */ -+-(void)centerContentIfNeeded -+{ -+ if (_scrollView.centerContent && -+ !CGSizeEqualToSize(self.contentSize, CGSizeZero) && -+ !CGSizeEqualToSize(self.bounds.size, CGSizeZero) -+ ) { -+ CGFloat top = 0, left = 0; -+ if (self.contentSize.width < self.bounds.size.width) { -+ left = (self.bounds.size.width - self.contentSize.width) * 0.5f; -+ } -+ if (self.contentSize.height < self.bounds.size.height) { -+ top = (self.bounds.size.height - self.contentSize.height) * 0.5f; -+ } -+ _scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left); -+ } -+} -+ - - (void)addScrollListener:(NSObject *)scrollListener - { - [_scrollListeners addObject:scrollListener]; -@@ -913,6 +932,7 @@ - (void)updateContentSizeIfNeeded - CGSize contentSize = self.contentSize; - if (!CGSizeEqualToSize(_scrollView.contentSize, contentSize)) { - _scrollView.contentSize = contentSize; -+ [self centerContentIfNeeded]; - } - } - -diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java -index 5f5e1ab..aac00b6 100644 ---- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java -+++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java -@@ -99,8 +99,9 @@ public class JavaTimerManager { - } - - // If the JS thread is busy for multiple frames we cancel any other pending runnable. -- if (mCurrentIdleCallbackRunnable != null) { -- mCurrentIdleCallbackRunnable.cancel(); -+ IdleCallbackRunnable currentRunnable = mCurrentIdleCallbackRunnable; -+ if (currentRunnable != null) { -+ currentRunnable.cancel(); - } - - mCurrentIdleCallbackRunnable = new IdleCallbackRunnable(frameTimeNanos); diff --git a/patches/react-native+0.76.1.patch b/patches/react-native+0.76.1.patch new file mode 100644 index 0000000000..9d64061c84 --- /dev/null +++ b/patches/react-native+0.76.1.patch @@ -0,0 +1,146 @@ +diff --git a/node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts b/node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts +index 62f52a7..ca30165 100644 +--- a/node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts ++++ b/node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts +@@ -426,9 +426,10 @@ export interface ViewStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle { + */ + pointerEvents?: 'box-none' | 'none' | 'box-only' | 'auto' | undefined; + isolation?: 'auto' | 'isolate' | undefined; +- cursor?: CursorValue | undefined; ++ cursor?: CursorValue | string | undefined; + boxShadow?: ReadonlyArray | string | undefined; + filter?: ReadonlyArray | string | undefined; ++ transformOrigin?: string | (string | number)[] | undefined; + } + + export type FontVariant = +@@ -536,7 +537,11 @@ export interface TextStyle extends TextStyleIOS, TextStyleAndroid, ViewStyle { + textShadowOffset?: {width: number; height: number} | undefined; + textShadowRadius?: number | undefined; + textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase' | undefined; +- userSelect?: 'auto' | 'none' | 'text' | 'contain' | 'all' | undefined; ++ userSelect?: 'auto' | 'none' | 'text' | 'contain' | 'all' | string | undefined; ++ cursor?: CursorValue | string | undefined; ++ boxShadow?: ReadonlyArray | string | undefined; ++ filter?: ReadonlyArray | string | undefined; ++ transformOrigin?: string | (string | number)[] | undefined; + } + + /** +@@ -558,5 +563,8 @@ export interface ImageStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle { + tintColor?: ColorValue | undefined; + opacity?: AnimatableNumericValue | undefined; + objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | undefined; +- cursor?: CursorValue | undefined; ++ cursor?: CursorValue | string | undefined; ++ boxShadow?: ReadonlyArray | string | undefined; ++ filter?: ReadonlyArray | string | undefined; ++ transformOrigin?: string | (string | number)[] | undefined; + } +diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h +index e9b330f..ec5f58c 100644 +--- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h ++++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h +@@ -15,5 +15,8 @@ + @property (nonatomic, copy) NSString *title; + @property (nonatomic, copy) RCTDirectEventBlock onRefresh; + @property (nonatomic, weak) UIScrollView *scrollView; ++@property (nonatomic, copy) UIColor *customTintColor; ++ ++- (void)forwarderBeginRefreshing; + + @end +diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m +index 53bfd04..ff1b1ed 100644 +--- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m ++++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m +@@ -23,6 +23,7 @@ @implementation RCTRefreshControl { + UIColor *_titleColor; + CGFloat _progressViewOffset; + BOOL _hasMovedToWindow; ++ UIColor *_customTintColor; + } + + - (instancetype)init +@@ -58,6 +59,12 @@ - (void)layoutSubviews + _isInitialRender = false; + } + ++- (void)didMoveToSuperview ++{ ++ [super didMoveToSuperview]; ++ [self setTintColor:_customTintColor]; ++} ++ + - (void)didMoveToWindow + { + [super didMoveToWindow]; +@@ -221,4 +228,50 @@ - (void)refreshControlValueChanged + } + } + ++// Fix for https://github.com/facebook/react-native/issues/43388 ++// A bug in iOS 17.4 causes the haptic to not play when refreshing if the tintColor ++// is set before the refresh control gets added to the scrollview. We'll call this ++// function whenever the superview changes. We'll also call it if the value of customTintColor ++// changes. ++- (void)setTintColor:(UIColor *)tintColor ++{ ++ if ([self.superview isKindOfClass:[UIScrollView class]] && self.tintColor != tintColor) { ++ [super setTintColor:tintColor]; ++ } ++} ++ ++// This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native ++// libraries to perform a refresh of a scrollview and access the refresh control's onRefresh ++// function. ++- (void)forwarderBeginRefreshing ++{ ++ _refreshingProgrammatically = NO; ++ ++ [self sizeToFit]; ++ ++ if (!self.scrollView) { ++ return; ++ } ++ ++ UIScrollView *scrollView = (UIScrollView *)self.scrollView; ++ ++ [UIView animateWithDuration:0.3 ++ delay:0 ++ options:UIViewAnimationOptionBeginFromCurrentState ++ animations:^(void) { ++ // Whenever we call this method, the scrollview will always be at a position of ++ // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl ++ [scrollView setContentOffset:CGPointMake(0, -65)]; ++ } ++ completion:^(__unused BOOL finished) { ++ [super beginRefreshing]; ++ [self setCurrentRefreshingState:super.refreshing]; ++ ++ if (self->_onRefresh) { ++ self->_onRefresh(nil); ++ } ++ } ++ ]; ++} ++ + @end +diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m +index 40aaf9c..1c60164 100644 +--- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m ++++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m +@@ -22,11 +22,12 @@ - (UIView *)view + + RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock) + RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL) +-RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor) + RCT_EXPORT_VIEW_PROPERTY(title, NSString) + RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor) + RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat) + ++RCT_REMAP_VIEW_PROPERTY(tintColor, customTintColor, UIColor) ++ + RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing) + { + [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { diff --git a/patches/react-native+0.74.1.patch.md b/patches/react-native+0.76.1.patch.md similarity index 100% rename from patches/react-native+0.74.1.patch.md rename to patches/react-native+0.76.1.patch.md diff --git a/patches/react-native-compressor+1.9.0.patch b/patches/react-native-compressor+1.9.0.patch new file mode 100644 index 0000000000..5f6517b35e --- /dev/null +++ b/patches/react-native-compressor+1.9.0.patch @@ -0,0 +1,16 @@ +diff --git a/node_modules/react-native-compressor/package.json b/node_modules/react-native-compressor/package.json +index 8adf7dc..8dd43a6 100644 +--- a/node_modules/react-native-compressor/package.json ++++ b/node_modules/react-native-compressor/package.json +@@ -197,11 +197,6 @@ + "name": "RNCompressorSpec", + "type": "modules", + "jsSrcsDir": "src" +- }, +- { +- "name": "RNVideoCompressorSpec", +- "type": "modules", +- "jsSrcsDir": "src" + } + ] + } diff --git a/patches/react-native-image-crop-picker+0.41.2.patch b/patches/react-native-image-crop-picker+0.41.2.patch deleted file mode 100644 index 7f1865a5ef..0000000000 --- a/patches/react-native-image-crop-picker+0.41.2.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff --git a/node_modules/react-native-image-crop-picker/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java b/node_modules/react-native-image-crop-picker/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java -index 5de0845..fa477e7 100644 ---- a/node_modules/react-native-image-crop-picker/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java -+++ b/node_modules/react-native-image-crop-picker/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java -@@ -21,6 +21,7 @@ import android.webkit.MimeTypeMap; - - import androidx.core.app.ActivityCompat; - import androidx.core.content.FileProvider; -+import androidx.exifinterface.media.ExifInterface; - - import com.facebook.react.bridge.ActivityEventListener; - import com.facebook.react.bridge.Callback; -@@ -678,6 +679,15 @@ class PickerModule extends ReactContextBaseJavaModule implements ActivityEventLi - throw new Exception("Cannot select remote files"); - } - BitmapFactory.Options original = validateImage(path); -+ ExifInterface originalExif = new ExifInterface(path); -+ int orientation = originalExif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); -+ boolean invertDimensions = ( -+ orientation == ExifInterface.ORIENTATION_ROTATE_90 || -+ orientation == ExifInterface.ORIENTATION_ROTATE_270 || -+ orientation == ExifInterface.ORIENTATION_TRANSPOSE || -+ orientation == ExifInterface.ORIENTATION_TRANSVERSE -+ ); -+ - - // if compression options are provided image will be compressed. If none options is provided, - // then original image will be returned -@@ -687,8 +697,8 @@ class PickerModule extends ReactContextBaseJavaModule implements ActivityEventLi - long modificationDate = new File(path).lastModified(); - - image.putString("path", "file://" + compressedImagePath); -- image.putInt("width", options.outWidth); -- image.putInt("height", options.outHeight); -+ image.putInt("width", invertDimensions ? options.outHeight : options.outWidth); -+ image.putInt("height", invertDimensions ? options.outWidth : options.outHeight); - image.putString("mime", options.outMimeType); - image.putInt("size", (int) new File(compressedImagePath).length()); - image.putString("modificationDate", String.valueOf(modificationDate)); diff --git a/patches/react-native-screens+3.31.1.patch b/patches/react-native-screens+3.31.1.patch new file mode 100644 index 0000000000..1802c5861e --- /dev/null +++ b/patches/react-native-screens+3.31.1.patch @@ -0,0 +1,19 @@ +diff --git a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +index c45adc0..338a571 100644 +--- a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt ++++ b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +@@ -42,10 +42,10 @@ open class ScreenViewManager : ViewGroupManager(), RNSScreenManagerInter + props: ReactStylesDiffMap?, + stateWrapper: StateWrapper? + ): Any? { +- if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { +- // fabricViewStateManager should never be null in Fabric. The null check is only for Paper's empty impl. +- view.fabricViewStateManager?.setStateWrapper(stateWrapper) +- } ++// if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { ++// // fabricViewStateManager should never be null in Fabric. The null check is only for Paper's empty impl. ++// view.fabricViewStateManager?.setStateWrapper(stateWrapper) ++// } + return super.updateState(view, props, stateWrapper) + } + diff --git a/patches/react-native-svg+15.3.0.patch b/patches/react-native-svg+15.3.0.patch deleted file mode 100644 index 54540023f1..0000000000 --- a/patches/react-native-svg+15.3.0.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff --git a/node_modules/react-native-svg/android/src/main/java/com/horcrux/svg/PathView.java b/node_modules/react-native-svg/android/src/main/java/com/horcrux/svg/PathView.java -index 06829bd..1b15818 100644 ---- a/node_modules/react-native-svg/android/src/main/java/com/horcrux/svg/PathView.java -+++ b/node_modules/react-native-svg/android/src/main/java/com/horcrux/svg/PathView.java -@@ -14,17 +14,33 @@ import android.graphics.Paint; - import android.graphics.Path; - import com.facebook.react.bridge.ReactContext; - -+import java.util.ArrayList; -+import java.util.HashMap; -+ -+class ParsedPath { -+ final Path path; -+ final ArrayList elements; -+ -+ ParsedPath(Path path, ArrayList elements) { -+ this.path = path; -+ this.elements = elements; -+ } -+} -+ - @SuppressLint("ViewConstructor") - class PathView extends RenderableView { - private Path mPath; - -+ // This grows forever but for our use case (static icons) it's ok. -+ private static final HashMap sPathCache = new HashMap<>(); -+ - public PathView(ReactContext reactContext) { - super(reactContext); - PathParser.mScale = mScale; - mPath = new Path(); - } - -- public void setD(String d) { -+ void setDByParsing(String d) { - mPath = PathParser.parse(d); - elements = PathParser.elements; - for (PathElement elem : elements) { -@@ -33,6 +49,17 @@ class PathView extends RenderableView { - point.y *= mScale; - } - } -+ } -+ -+ public void setD(String d) { -+ ParsedPath cached = sPathCache.get(d); -+ if (cached != null) { -+ mPath = cached.path; -+ elements = cached.elements; -+ } else { -+ setDByParsing(d); -+ sPathCache.put(d, new ParsedPath(mPath, elements)); -+ } - invalidate(); - } - diff --git a/yarn.lock b/yarn.lock index bd9470408f..6fe7b95a02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3826,27 +3826,6 @@ xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-plugins@~8.0.8": - version "8.0.11" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.11.tgz#b814395a910f4c8b7cc95d9719dccb6ca53ea4c5" - integrity sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A== - dependencies: - "@expo/config-types" "^51.0.3" - "@expo/json-file" "~8.3.0" - "@expo/plist" "^0.1.0" - "@expo/sdk-runtime-versions" "^1.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.5.4" - slash "^3.0.0" - slugify "^1.6.6" - xcode "^3.0.1" - xml2js "0.6.0" - "@expo/config-plugins@~9.0.0", "@expo/config-plugins@~9.0.10": version "9.0.10" resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-9.0.10.tgz#a25fd6061ea7f707213ff8344f562025f850fdc8" @@ -3986,22 +3965,6 @@ semver "7.3.2" tempy "0.3.0" -"@expo/image-utils@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.5.1.tgz#06fade141facebcd8431355923d30f3839309942" - integrity sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A== - dependencies: - "@expo/spawn-async" "^1.7.2" - chalk "^4.0.0" - fs-extra "9.0.0" - getenv "^1.0.0" - jimp-compact "0.16.1" - node-fetch "^2.6.0" - parse-png "^2.1.0" - resolve-from "^5.0.0" - semver "^7.6.0" - tempy "0.3.0" - "@expo/image-utils@^0.6.0": version "0.6.3" resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.6.3.tgz#89c744460beefc686989b969121357bbd5520c8a" @@ -4113,23 +4076,6 @@ base64-js "^1.2.3" xmlbuilder "^14.0.0" -"@expo/prebuild-config@7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz#7abd489e18ed6514a0c9cd214eb34c0d5efda799" - integrity sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag== - dependencies: - "@expo/config" "~9.0.0-beta.0" - "@expo/config-plugins" "~8.0.8" - "@expo/config-types" "^51.0.3" - "@expo/image-utils" "^0.5.0" - "@expo/json-file" "^8.3.0" - "@react-native/normalize-colors" "0.74.85" - debug "^4.3.1" - fs-extra "^9.0.0" - resolve-from "^5.0.0" - semver "^7.6.0" - xml2js "0.6.0" - "@expo/prebuild-config@8.0.10": version "8.0.10" resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-8.0.10.tgz#1be6ab21e1bb1d1e2b5bf1b953863d95eddd6d56" @@ -5893,7 +5839,7 @@ hermes-parser "0.23.1" nullthrows "^1.1.1" -"@react-native/normalize-colors@0.74.85", "@react-native/normalize-colors@0.76.1", "@react-native/normalize-colors@0.76.3", "@react-native/normalize-colors@^0.73.0", "@react-native/normalize-colors@^0.74.1": +"@react-native/normalize-colors@0.76.1", "@react-native/normalize-colors@0.76.3", "@react-native/normalize-colors@^0.73.0", "@react-native/normalize-colors@^0.74.1": version "0.76.1" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.76.1.tgz#df8d54d78917a9f075283382fec834f5ccaecefd" integrity sha512-/+CUk/wGWIdXbJYVLw/q6Fs8Z0x91zzfXIbNiZUdSW1TNEDmytkF371H8a1/Nx3nWa1RqCMVsaZHCG4zqxeDvg== @@ -10511,7 +10457,7 @@ expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -expo-application@^6.0.0, expo-application@~6.0.0: +expo-application@^6.0.1, expo-application@~6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/expo-application/-/expo-application-6.0.1.tgz#bb5e1f15636c51c571a0062e8f9d4e504da967e4" integrity sha512-w+1quSmKp8SYKT+GAFHSN5c6u+PqoVRIfpsLyRQrQdOnBA9dA8Hw6JT9sHNFmA30A2v1b/sdYZE3qKuRJFNSWQ== @@ -10526,12 +10472,12 @@ expo-asset@~11.0.1: invariant "^2.2.4" md5-file "^3.2.3" -expo-blur@^14.0.0: +expo-blur@^14.0.1: version "14.0.1" resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.0.1.tgz#4bdbec43b5015891990e78d31d8ff2f1f5d27464" integrity sha512-3Q6jFBLbY8n2vwk28ycUC+eIlVhnlqwkXUKk/Lfaj+SGV3AZMQyrixe7OYwJdUfwqETBrnYYMB6uNrJzOSbG+g== -expo-build-properties@^0.13.0: +expo-build-properties@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/expo-build-properties/-/expo-build-properties-0.13.1.tgz#e40645b34debed5eab53a273c89543aaef58bc57" integrity sha512-7tDlAM0PPkXC0B00C6/FG19sMzwxZNyiDfn22AWVbBxWxZE1/3RqxPgT3MlPVNfvy+wJw7jt/qbAb0S06wFYVg== @@ -10539,7 +10485,7 @@ expo-build-properties@^0.13.0: ajv "^8.11.0" semver "^7.6.0" -expo-camera@~16.0.2: +expo-camera@~16.0.7: version "16.0.7" resolved "https://registry.yarnpkg.com/expo-camera/-/expo-camera-16.0.7.tgz#45e73a86c63106639cf1ff611a365d79e9d5842e" integrity sha512-F4msGjXMa2WJ6Gest9HVA8i0txwfuwNSbGtlbgcTr5givNWfxIwx5DuW+i7w+Xstv2YqSJL3qFAAIZgHfygHTQ== @@ -10558,7 +10504,7 @@ expo-constants@16.0.1, expo-constants@^13.0.2, expo-constants@~17.0.0, expo-cons dependencies: "@expo/config" "~9.0.0-beta.0" -expo-dev-client@^5.0.0-preview.9: +expo-dev-client@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-5.0.4.tgz#54c0d942dcb7aa0ef80a4bd5ef6e102f26a76bb4" integrity sha512-07OSxCkrn+IIDEDnI153YDHHtAr/3GvYdJH8HWYnVBCKzkgOxsEszyE5MHKMOou8+NZNVwGWjW5UZXoLqANcGw== @@ -10598,7 +10544,7 @@ expo-device@6.0.2, expo-device@~4.1.1: dependencies: ua-parser-js "^0.7.33" -expo-device@~7.0.0: +expo-device@~7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-7.0.1.tgz#3702fe8b4475eac63ed27f9d580ec8a78546e0d1" integrity sha512-/3lk0f9wvle+6svHqWSCBC1B5NYFmXp1D7hmIyecJJVYRLwzrwwTDyNs76oG/UDU5Appdu8QyDKycsx2hqv71w== @@ -10610,14 +10556,14 @@ expo-eas-client@~0.13.0: resolved "https://registry.yarnpkg.com/expo-eas-client/-/expo-eas-client-0.13.1.tgz#ebca627f3f58a54906394eb3f5d22f41a1822618" integrity sha512-IyeDiM6YSJG0c45kbuEo0qt76z0KTEZtisEFEtle+b+vfn9I3N+r3jbPscaI4yS3P6gpuoDyHv81YDVC6Dmkhw== -expo-file-system@^18.0.0, expo-file-system@~18.0.4: +expo-file-system@^18.0.4, expo-file-system@~18.0.4: version "18.0.4" resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.0.4.tgz#eecf8dc0b3b545e9ac5cd00352665afe2d57732f" integrity sha512-aAWEDwnu0XHOBYvQ9Q0+QIa+483vYJaC4IDsXyWQ73Rtsg273NZh5kYowY+cAocvoSmA99G6htrLBn11ax2bTQ== dependencies: web-streams-polyfill "^3.3.2" -expo-font@~13.0.0, expo-font@~13.0.1: +expo-font@~13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-13.0.1.tgz#3a7eed7a4238a352fc74a425fd8c020c5f122382" integrity sha512-8JE47B+6cLeKWr5ql8gU6YsPHjhrz1vMrTqYMm72No/8iW8Sb/uL4Oc0dpmbjq3hLLXBY0xPBQOgU7FQ6Y04Vg== @@ -10634,21 +10580,21 @@ expo-image-loader@~5.0.0: resolved "https://registry.yarnpkg.com/expo-image-loader/-/expo-image-loader-5.0.0.tgz#4f58a21ab26e40d6fccc211b664fd9fe21a5dcb8" integrity sha512-Eg+5FHtyzv3Jjw9dHwu2pWy4xjf8fu3V0Asyy42kO+t/FbvW/vjUixpTjPtgKQLQh+2/9Nk4JjFDV6FwCnF2ZA== -expo-image-manipulator@^13.0.4: +expo-image-manipulator@^13.0.5: version "13.0.5" resolved "https://registry.yarnpkg.com/expo-image-manipulator/-/expo-image-manipulator-13.0.5.tgz#ca111f9c3864391ccd598b727fe2348e447e7e86" integrity sha512-ILBwBKATmO1469VS0o1dQq2iQwekMq32XCyNaeQ9gw9+2NBoN6Z64bRHEZkPxhHe6ULDM+zOTOL32/k+iVluYQ== dependencies: expo-image-loader "~5.0.0" -expo-image-picker@~16.0.0: +expo-image-picker@~16.0.3: version "16.0.3" resolved "https://registry.yarnpkg.com/expo-image-picker/-/expo-image-picker-16.0.3.tgz#8b096777b4455272a3cb0dccfa3cee89b81bb13c" integrity sha512-c4IOqIQOtx8puWWU4fVsJhuGiAhH6gAIdrVzhimOXSEUHnfxCckRYzvznbd/0cuvaA5y9H0CSYrxpTUc/0WNVw== dependencies: expo-image-loader "~5.0.0" -expo-image@~2.0.0-preview.1: +expo-image@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-2.0.2.tgz#7e97a5f4129c7f0b76b5ca9edbd8793ba4b4ca9e" integrity sha512-LkjdE5ij48Yu7eE5E1ruXpxgmyRw33oaapPkNpDx/AKh1GEGQ0wQ4genvV1QXZmlNrzaRurzuVUvwz8n3abwdg== @@ -10663,12 +10609,12 @@ expo-keep-awake@~14.0.1: resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-14.0.1.tgz#77c38feefa95c494aa167e6df5a6eacd17af2358" integrity sha512-c5mGCAIk2YM+Vsdy90BlEJ4ZX+KG5Au9EkJUIxXWlpnuKmDAJ3N+5nEZ7EUO1ZTheqoSBeAo4jJ8rTWPU+JXdw== -expo-linear-gradient@^14.0.0: +expo-linear-gradient@^14.0.1: version "14.0.1" resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-14.0.1.tgz#f93c518014b6eb5ee17ed6562db716640ad27f3e" integrity sha512-apGtUO9AZ52ZWvX9f6K9TamWw8XcUby7jZ0Pcvd5LxUO7pl7tDPx2VlKqpzbhhS4yfCiUwX58wqocwVnE/0ZVg== -expo-linking@^7.0.1: +expo-linking@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-7.0.3.tgz#307851288ec65e1c533bcc70b57dfb6372f9679e" integrity sha512-YiDacNzeQZd/bdOwGyi+YlawM4GGbcSRkuFCpDGIK7D1KUGqLinBHwJvxUMb9Zert2Ois5IHtmZaZ1et6g229g== @@ -10691,7 +10637,7 @@ expo-manifests@~0.15.0: "@expo/config" "~10.0.4" expo-json-utils "~0.14.0" -expo-media-library@~17.0.1: +expo-media-library@~17.0.3: version "17.0.3" resolved "https://registry.yarnpkg.com/expo-media-library/-/expo-media-library-17.0.3.tgz#4ee3e6a8a2544887d910a72eaf2a15858b78cc0e" integrity sha512-vo8AqWxv1C8+U8dA5W43qs8+3dgD3VZDvcCkZBQTBnGr/2Rs7x6nNQD5s7UfYyr6qmW6102JB3+OUKHpkwEssg== @@ -10724,7 +10670,7 @@ expo-modules-core@^1.0.3: dependencies: invariant "^2.2.4" -expo-navigation-bar@~4.0.1: +expo-navigation-bar@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/expo-navigation-bar/-/expo-navigation-bar-4.0.4.tgz#058a8482665aad68d3775bcad1c7c78ae3044512" integrity sha512-rVoKQFK00+fBPx/nRapLGs+Vl3pe1x+ufkp6/GztGR601tv+1ENAC+KaIMYYQm1L8SpVR0bpNoZ+wr2Xi8Gu9A== @@ -10732,7 +10678,7 @@ expo-navigation-bar@~4.0.1: "@react-native/normalize-colors" "0.76.3" debug "^4.3.2" -expo-notifications@~0.29.5: +expo-notifications@~0.29.8: version "0.29.8" resolved "https://registry.yarnpkg.com/expo-notifications/-/expo-notifications-0.29.8.tgz#dcb2326782d07254ea9caca814444a879df7dff3" integrity sha512-WdpbWtbNFiszvpRN5aSp+M6xoAQLo1eNf1VivNe7odJMPRBUhG+OnhUWI9IqLESuNtRD/sfkMT7bYJxPqchBVw== @@ -10760,12 +10706,12 @@ expo-sharing@^13.0.0: resolved "https://registry.yarnpkg.com/expo-sharing/-/expo-sharing-13.0.0.tgz#fbc46f4afdaa265a2811fe88c2a589aae2d2de0f" integrity sha512-b23ymicRmYn/Pjj05sl9tFZHN5cH9I1f0yiqY1Yk8Q3oCx0Aznri82DnTYA4T/J6D9vrkraX0wQ4jWVMOffmlg== -expo-splash-screen@~0.27.6: - version "0.27.7" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.27.7.tgz#52171be54d8c008880d928e802819d767fbd3c12" - integrity sha512-s+eGcG185878nixlrjhhLD6UDYrvoqBUaBkIEozBVWFg3pkdsKpONPiUAco4XR3h7I/9ODq4quN28RJLFO+s0Q== +expo-splash-screen@~0.29.13: + version "0.29.13" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.29.13.tgz#2a9083cdb4f7d3e5e4427b625a5249eaae71de7a" + integrity sha512-OTaW6v2ErKTlguFDNi4PN+qrEFRA4TIEyFag4204CiFIpAB+13PqQiW4Ovt29aYlLERIjWD++PyoHeSdLSiZwg== dependencies: - "@expo/prebuild-config" "7.0.9" + "@expo/prebuild-config" "^8.0.17" expo-status-bar@~2.0.0: version "2.0.0" @@ -10785,7 +10731,7 @@ expo-system-ui@^4.0.4: "@react-native/normalize-colors" "0.76.3" debug "^4.3.2" -expo-task-manager@~12.0.1: +expo-task-manager@~12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/expo-task-manager/-/expo-task-manager-12.0.3.tgz#0814522fd8ee78c43bf6bc8ef22b0694c463f5c2" integrity sha512-XNbDWPqBJw9kuWrYFhpcjRBbuxMUlgiFdEUHpm7VmMqGmm86UAZTO20zSGkM0U25yIcmQgsHiEbfV9B2S84dqA== @@ -10797,7 +10743,7 @@ expo-updates-interface@~1.0.0: resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-1.0.0.tgz#b98c66b800d29561c62409556948b2af3d5316e5" integrity sha512-93oWtvULJOj+Pp+N/lpTcFfuREX1wNeHtp7Lwn8EbzYYmdn37MvZU3TPW2tYYCZuhzmKEXnUblYcruYoDu7IrQ== -expo-updates@~0.26.4: +expo-updates@~0.26.9: version "0.26.9" resolved "https://registry.yarnpkg.com/expo-updates/-/expo-updates-0.26.9.tgz#9be11c482c572f90d479aa1f7bd1ac509d7fa102" integrity sha512-eHdvM4+xXaLV3uuTn3ooWsDC69IPV9ukpuPDglsBWJKagVi40u7DJQ375oGNgjqxd91irEBeBSCr9tCWm905QA== @@ -10817,12 +10763,12 @@ expo-updates@~0.26.4: ignore "^5.3.1" resolve-from "^5.0.0" -expo-web-browser@~14.0.0: +expo-web-browser@~14.0.1: version "14.0.1" resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-14.0.1.tgz#97f3f141b0897364bc8364d90d6e29df0beec8aa" integrity sha512-QM9F3ie+UyIOoBvqFmT6CZojb1vMc2H+7ZlMT5dEu1PL2jtYyOeK2hLfbt/EMt7CBm/w+P29H9W9Y9gdebOkuQ== -expo@^52.0.0: +expo@^52.0.11: version "52.0.11" resolved "https://registry.yarnpkg.com/expo/-/expo-52.0.11.tgz#2c45faa2ac5061b916ea76c0146560c1bef02ef5" integrity sha512-flUffjURDVufsMpoHrgsp+QDvR6xG/hjeMbzeSyFUcPP64uh3Av1/EJ4uUXhmHYV6/8YbHMwEgUbmko85vBtKQ==