Upgrade to Expo 51 and React Native 0.74 (#3980)

* upgrade packages

* remove `expo-image-picker` patch

* remove old expo-updates patch

* rename rn patch

* downgrade crop picker

* bump `ExpoGifView` `SDWebImage` version

* apply config changes

* update build docs for apple silicon

* update build docs for apple silicon

* update expo-updates patch

* add back patch readme

* bump `expo-dev-client`

* bump `babel-preset`

* update `babel.config.js`

* update `react-native-paste-input` patch

* remove old ota updates hook

* update types

* update types

* downgrade pager-view

* update animated ref type

* fix web-only type

* update `react-native-bottom-sheet` `BottomSheetTextInput`

* add `expo-application` to jest mocks

* remove reanimated patch

* update notifications patch

* update reanimated path

* fix import

* update yarn.lock

* use `ItemT` instead of `any`

* expo bump

* Revert logic change, fix types

* Fix JSON file

---------

Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
zio/stable
Hailey 2024-05-28 18:15:35 -07:00 committed by GitHub
parent 5ceb440d4e
commit 888bec7b4f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 1172 additions and 4794 deletions

View File

@ -175,7 +175,6 @@ module.exports = function (config) {
checkAutomatically: 'NEVER', checkAutomatically: 'NEVER',
channel: UPDATES_CHANNEL, channel: UPDATES_CHANNEL,
}, },
assetBundlePatterns: ['**/*'],
plugins: [ plugins: [
'expo-localization', 'expo-localization',
Boolean(process.env.SENTRY_AUTH_TOKEN) && 'sentry-expo', Boolean(process.env.SENTRY_AUTH_TOKEN) && 'sentry-expo',

View File

@ -8,9 +8,6 @@ module.exports = function (api) {
{ {
lazyImports: true, lazyImports: true,
native: { native: {
// We should be able to remove this after upgrading Expo
// to a version that includes https://github.com/expo/expo/pull/24672.
unstable_transformProfile: 'hermes-stable',
// Disable ESM -> CJS compilation because Metro takes care of it. // Disable ESM -> CJS compilation because Metro takes care of it.
// However, we need it in Jest tests since those run without Metro. // However, we need it in Jest tests since those run without Metro.
disableImportExportTransform: !isTestEnv, disableImportExportTransform: !isTestEnv,

View File

@ -4,7 +4,10 @@
- Set up your environment [using the expo instructions](https://docs.expo.dev/guides/local-app-development/). - Set up your environment [using the expo instructions](https://docs.expo.dev/guides/local-app-development/).
- make sure that the JAVA_HOME points to the zulu-17 directory in your `.zshrc` or `.bashrc` file: `export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home`. DO NOT use another JDK or you will encounter build errors. - make sure that the JAVA_HOME points to the zulu-17 directory in your `.zshrc` or `.bashrc` file: `export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home`. DO NOT use another JDK or you will encounter build errors.
- If you're running macOS, make sure you are running the correct versions of Ruby and Cocoapods: - If you're running macOS, make sure you are running the correct versions of Ruby and Cocoapods:-
- If you are using Apple Silicon and this is the first time you are building for RN 0.74+, you may need to run:
- `arch -arm64 brew install llvm`
- `sudo gem install ffi`
- Check if you've installed Cocoapods through `homebrew`. If you have, remove it: - Check if you've installed Cocoapods through `homebrew`. If you have, remove it:
- `brew info cocoapods` - `brew info cocoapods`
- If output says `Installed`: - If output says `Installed`:

View File

@ -1,10 +1,10 @@
/* global jest */ /* global jest */
import {configure} from '@testing-library/react-native'
import 'react-native-gesture-handler/jestSetup' import 'react-native-gesture-handler/jestSetup'
// IMPORTANT: this is what's used in the native runtime // IMPORTANT: this is what's used in the native runtime
import 'react-native-url-polyfill/auto' import 'react-native-url-polyfill/auto'
import {configure} from '@testing-library/react-native'
configure({asyncUtilTimeout: 20000}) configure({asyncUtilTimeout: 20000})
jest.mock('@react-native-async-storage/async-storage', () => jest.mock('@react-native-async-storage/async-storage', () =>
@ -90,3 +90,8 @@ jest.mock('sentry-expo', () => ({
})) }))
jest.mock('crypto', () => ({})) jest.mock('crypto', () => ({}))
jest.mock('expo-application', () => ({
nativeApplicationVersion: '1.0.0',
nativeBuildVersion: '1',
}))

View File

@ -10,8 +10,8 @@ Pod::Spec.new do |s|
s.static_framework = true s.static_framework = true
s.dependency 'ExpoModulesCore' s.dependency 'ExpoModulesCore'
s.dependency 'SDWebImage', '~> 5.17.0' s.dependency 'SDWebImage', '~> 5.19.1'
s.dependency 'SDWebImageWebPCoder', '~> 0.13.0' s.dependency 'SDWebImageWebPCoder', '~> 0.14.6'
# Swift/Objective-C compatibility # Swift/Objective-C compatibility
s.pod_target_xcconfig = { s.pod_target_xcconfig = {

View File

@ -65,7 +65,7 @@
"@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1",
"@fortawesome/react-native-fontawesome": "^0.3.0", "@fortawesome/react-native-fontawesome": "^0.3.0",
"@lingui/react": "^4.5.0", "@lingui/react": "^4.5.0",
"@mattermost/react-native-paste-input": "^0.6.4", "@mattermost/react-native-paste-input": "^0.7.1",
"@miblanchard/react-native-slider": "^2.3.1", "@miblanchard/react-native-slider": "^2.3.1",
"@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-dropdown-menu": "^2.0.6",
"@react-native-async-storage/async-storage": "1.23.1", "@react-native-async-storage/async-storage": "1.23.1",
@ -107,35 +107,36 @@
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"bcp-47-match": "^2.0.3", "bcp-47-match": "^2.0.3",
"date-fns": "^2.30.0", "date-fns": "^2.30.0",
"deprecated-react-native-prop-types": "^5.0.0",
"email-validator": "^2.0.4", "email-validator": "^2.0.4",
"emoji-mart": "^5.5.2", "emoji-mart": "^5.5.2",
"eventemitter3": "^5.0.1", "eventemitter3": "^5.0.1",
"expo": "^50.0.17", "expo": "^51.0.8",
"expo-application": "^5.8.3", "expo-application": "^5.9.1",
"expo-build-properties": "^0.11.1", "expo-build-properties": "^0.12.1",
"expo-camera": "~14.0.4", "expo-camera": "~14.1.3",
"expo-clipboard": "^5.0.1", "expo-clipboard": "^5.0.1",
"expo-constants": "~15.4.5", "expo-constants": "~15.4.6",
"expo-dev-client": "~3.3.8", "expo-dev-client": "^4.0.14",
"expo-device": "~5.9.3", "expo-device": "~5.9.3",
"expo-file-system": "^16.0.9", "expo-file-system": "^16.0.9",
"expo-haptics": "^12.8.1", "expo-haptics": "^12.8.1",
"expo-image": "~1.10.6", "expo-image": "~1.12.9",
"expo-image-manipulator": "^11.8.0", "expo-image-manipulator": "^12.0.3",
"expo-image-picker": "~14.7.1", "expo-image-picker": "~15.0.4",
"expo-linear-gradient": "^12.7.2", "expo-linear-gradient": "^13.0.2",
"expo-linking": "^6.2.2", "expo-linking": "^6.3.1",
"expo-localization": "~14.8.3", "expo-localization": "~15.0.3",
"expo-media-library": "~15.9.1", "expo-media-library": "~16.0.3",
"expo-navigation-bar": "~2.8.1", "expo-navigation-bar": "~3.0.4",
"expo-notifications": "~0.27.6", "expo-notifications": "~0.28.1",
"expo-sharing": "^11.10.0", "expo-sharing": "^12.0.1",
"expo-splash-screen": "~0.26.4", "expo-splash-screen": "~0.27.4",
"expo-status-bar": "~1.11.1", "expo-status-bar": "~1.12.1",
"expo-system-ui": "~2.9.3", "expo-system-ui": "~3.0.4",
"expo-task-manager": "~11.7.2", "expo-task-manager": "~11.8.1",
"expo-updates": "~0.24.10", "expo-updates": "~0.25.11",
"expo-web-browser": "~12.8.2", "expo-web-browser": "~13.0.3",
"fast-text-encoding": "^1.0.6", "fast-text-encoding": "^1.0.6",
"history": "^5.3.0", "history": "^5.3.0",
"js-sha256": "^0.9.0", "js-sha256": "^0.9.0",
@ -164,30 +165,30 @@
"react-compiler-runtime": "file:./lib/react-compiler-runtime", "react-compiler-runtime": "file:./lib/react-compiler-runtime",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-keyed-flatten-children": "^3.0.0", "react-keyed-flatten-children": "^3.0.0",
"react-native": "0.73.2", "react-native": "0.74.1",
"react-native-date-picker": "^4.4.0", "react-native-date-picker": "^4.4.2",
"react-native-drawer-layout": "^4.0.0-alpha.3", "react-native-drawer-layout": "^4.0.0-alpha.3",
"react-native-fs": "^2.20.0", "react-native-fs": "^2.20.0",
"react-native-gesture-handler": "~2.14.0", "react-native-gesture-handler": "~2.16.2",
"react-native-get-random-values": "~1.11.0", "react-native-get-random-values": "~1.11.0",
"react-native-image-crop-picker": "^0.38.1", "react-native-image-crop-picker": "0.40.3",
"react-native-ios-context-menu": "^1.15.3", "react-native-ios-context-menu": "^1.15.3",
"react-native-keyboard-controller": "^1.12.1", "react-native-keyboard-controller": "^1.12.1",
"react-native-pager-view": "6.2.3", "react-native-pager-view": "6.2.3",
"react-native-picker-select": "^8.1.0", "react-native-picker-select": "^9.1.3",
"react-native-progress": "bluesky-social/react-native-progress", "react-native-progress": "bluesky-social/react-native-progress",
"react-native-reanimated": "^3.6.0", "react-native-reanimated": "^3.11.0",
"react-native-root-siblings": "^4.1.1", "react-native-root-siblings": "^4.1.1",
"react-native-safe-area-context": "4.8.2", "react-native-safe-area-context": "4.10.1",
"react-native-screens": "~3.29.0", "react-native-screens": "~3.31.1",
"react-native-svg": "14.1.0", "react-native-svg": "^15.2.0",
"react-native-uitextview": "^1.1.6", "react-native-uitextview": "^1.1.7",
"react-native-url-polyfill": "^1.3.0", "react-native-url-polyfill": "^1.3.0",
"react-native-uuid": "^2.0.1", "react-native-uuid": "^2.0.2",
"react-native-view-shot": "^3.8.0", "react-native-view-shot": "^3.8.0",
"react-native-web": "~0.19.6", "react-native-web": "~0.19.11",
"react-native-web-webview": "^1.0.2", "react-native-web-webview": "^1.0.2",
"react-native-webview": "13.6.4", "react-native-webview": "13.10.2",
"react-responsive": "^9.0.2", "react-responsive": "^9.0.2",
"react-textarea-autosize": "^8.5.3", "react-textarea-autosize": "^8.5.3",
"rn-fetch-blob": "^0.12.0", "rn-fetch-blob": "^0.12.0",
@ -210,7 +211,7 @@
"@lingui/macro": "^4.5.0", "@lingui/macro": "^4.5.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
"@react-native-community/eslint-config": "^3.0.0", "@react-native-community/eslint-config": "^3.0.0",
"@react-native/typescript-config": "^0.74.0", "@react-native/typescript-config": "^0.74.1",
"@testing-library/jest-native": "^5.4.1", "@testing-library/jest-native": "^5.4.1",
"@testing-library/react-native": "^11.5.2", "@testing-library/react-native": "^11.5.2",
"@tsconfig/react-native": "^2.0.3", "@tsconfig/react-native": "^2.0.3",
@ -254,7 +255,7 @@
"jest-expo": "^50.0.1", "jest-expo": "^50.0.1",
"jest-junit": "^15.0.0", "jest-junit": "^15.0.0",
"lint-staged": "^13.2.3", "lint-staged": "^13.2.3",
"metro-react-native-babel-preset": "^0.73.7", "metro-react-native-babel-preset": "^0.74.1",
"prettier": "^2.8.3", "prettier": "^2.8.3",
"react-native-dotenv": "^3.3.1", "react-native-dotenv": "^3.3.1",
"react-refresh": "^0.14.0", "react-refresh": "^0.14.0",
@ -270,7 +271,8 @@
}, },
"resolutions": { "resolutions": {
"@types/react": "^18", "@types/react": "^18",
"**/zeed-dom": "0.10.9" "**/zeed-dom": "0.10.9",
"@react-native/babel-preset": "0.74.1"
}, },
"jest": { "jest": {
"preset": "jest-expo/ios", "preset": "jest-expo/ios",

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,16 @@
diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m
index e916023..0564d97 100644
--- a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m
+++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m
@@ -22,6 +22,11 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge
_backedTextInputView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_backedTextInputView.textInputDelegate = self;
+ // Disable inline predictions to prevent jank in the composer
+ if (@available(iOS 17.0, *)) {
+ _backedTextInputView.inlinePredictionType = UITextInlinePredictionTypeNo;
+ }
+
[self addSubview:_backedTextInputView];
}

View File

@ -1,112 +0,0 @@
diff --git a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt
index 3f50f8c..ee47fa1 100644
--- a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt
+++ b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt
@@ -33,7 +33,9 @@ import kotlin.coroutines.resumeWithException
// TODO(@bbarthec): rename to ExpoImagePicker
private const val moduleName = "ExponentImagePicker"
+
class ImagePickerModule : Module() {
+ private var isPickerOpen = false
override fun definition() = ModuleDefinition {
Name(moduleName)
@@ -129,6 +131,11 @@ class ImagePickerModule : Module() {
options: ImagePickerOptions
): Any {
return try {
+ if(isPickerOpen) {
+ return ImagePickerResponse(canceled = true)
+ }
+
+ isPickerOpen = true
var result = launchPicker(pickerLauncher)
if (
!options.allowsMultipleSelection &&
@@ -143,6 +150,8 @@ class ImagePickerModule : Module() {
mediaHandler.readExtras(result.data, options)
} catch (cause: OperationCanceledException) {
return ImagePickerResponse(canceled = true)
+ } finally {
+ isPickerOpen = false
}
}
diff --git a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/contracts/ImageLibraryContract.kt b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/contracts/ImageLibraryContract.kt
index ff15c91..9763012 100644
--- a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/contracts/ImageLibraryContract.kt
+++ b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/contracts/ImageLibraryContract.kt
@@ -5,12 +5,7 @@ import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.net.Uri
-import androidx.activity.result.PickVisualMediaRequest
-import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia
-import androidx.activity.result.contract.ActivityResultContracts.PickMultipleVisualMedia
import expo.modules.imagepicker.ImagePickerOptions
-import expo.modules.imagepicker.MediaTypes
-import expo.modules.imagepicker.UNLIMITED_SELECTION
import expo.modules.imagepicker.getAllDataUris
import expo.modules.imagepicker.toMediaType
import expo.modules.kotlin.activityresult.AppContextActivityResultContract
@@ -26,51 +21,26 @@ import java.io.Serializable
* @see [androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents]
*/
internal class ImageLibraryContract(
- private val appContextProvider: AppContextProvider
+ private val appContextProvider: AppContextProvider,
) : AppContextActivityResultContract<ImageLibraryContractOptions, ImagePickerContractResult> {
private val contentResolver: ContentResolver
get() = appContextProvider.appContext.reactContext?.contentResolver
?: throw Exceptions.ReactContextLost()
override fun createIntent(context: Context, input: ImageLibraryContractOptions): Intent {
- val request = PickVisualMediaRequest.Builder()
- .setMediaType(
- when (input.options.mediaTypes) {
- MediaTypes.VIDEOS -> {
- PickVisualMedia.VideoOnly
- }
-
- MediaTypes.IMAGES -> {
- PickVisualMedia.ImageOnly
- }
-
- else -> {
- PickVisualMedia.ImageAndVideo
- }
- }
- )
- .build()
+ val intent = Intent(Intent.ACTION_GET_CONTENT)
+ .addCategory(Intent.CATEGORY_OPENABLE)
+ .setType("image/*")
if (input.options.allowsMultipleSelection) {
- val selectionLimit = input.options.selectionLimit
-
- if (selectionLimit == 1) {
- // If multiple selection is allowed but the limit is 1, we should ignore
- // the multiple selection flag and just treat it as a single selection.
- return PickVisualMedia().createIntent(context, request)
+ if(input.options.selectionLimit == 1) {
+ return intent
}
- if (selectionLimit > 1) {
- return PickMultipleVisualMedia(selectionLimit).createIntent(context, request)
- }
-
- // If the selection limit is 0, it is the same as unlimited selection.
- if (selectionLimit == UNLIMITED_SELECTION) {
- return PickMultipleVisualMedia().createIntent(context, request)
- }
+ intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
- return PickVisualMedia().createIntent(context, request)
+ return intent
}
override fun parseResult(input: ImageLibraryContractOptions, resultCode: Int, intent: Intent?) =

View File

@ -1,3 +0,0 @@
added by https://github.com/bluesky-social/social-app/pull/2384#pullrequestreview-1800985521
hackfixes the image picker on android so that the user can select from their typical image sources

View File

@ -1,13 +1,13 @@
diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle
index 97bf4f4..6e9d427 100644 index d233e1f..cc2f856 100644
--- a/node_modules/expo-notifications/android/build.gradle --- a/node_modules/expo-notifications/android/build.gradle
+++ b/node_modules/expo-notifications/android/build.gradle +++ b/node_modules/expo-notifications/android/build.gradle
@@ -118,6 +118,7 @@ dependencies { @@ -32,6 +32,7 @@ dependencies {
api 'com.google.firebase:firebase-messaging:22.0.0' api 'com.google.firebase:firebase-messaging:22.0.0'
api 'me.leolin:ShortcutBadger:1.1.22@aar' api 'me.leolin:ShortcutBadger:1.1.22@aar'
+ implementation project(':expo-background-notification-handler') + implementation project(':expo-background-notification-handler')
if (project.findProject(':expo-modules-test-core')) { if (project.findProject(':expo-modules-test-core')) {
testImplementation project(':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/JSONNotificationContentBuilder.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/JSONNotificationContentBuilder.java 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
@ -16,14 +16,14 @@ index 0af7fe0..8f2c8d8 100644
+++ b/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; @@ -14,6 +14,7 @@ import expo.modules.notifications.notifications.enums.NotificationPriority;
import expo.modules.notifications.notifications.model.NotificationContent; import expo.modules.notifications.notifications.model.NotificationContent;
public class JSONNotificationContentBuilder extends NotificationContent.Builder { public class JSONNotificationContentBuilder extends NotificationContent.Builder {
+ private static final String CHANNEL_ID_KEY = "channelId"; + private static final String CHANNEL_ID_KEY = "channelId";
private static final String TITLE_KEY = "title"; private static final String TITLE_KEY = "title";
private static final String TEXT_KEY = "message"; private static final String TEXT_KEY = "message";
private static final String SUBTITLE_KEY = "subtitle"; private static final String SUBTITLE_KEY = "subtitle";
@@ -36,6 +37,7 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder @@ -36,6 +37,7 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder
public NotificationContent.Builder setPayload(JSONObject payload) { public NotificationContent.Builder setPayload(JSONObject payload) {
this.setTitle(getTitle(payload)) this.setTitle(getTitle(payload))
+ .setChannelId(getChannelId(payload)) + .setChannelId(getChannelId(payload))
@ -33,7 +33,7 @@ index 0af7fe0..8f2c8d8 100644
@@ -60,6 +62,14 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder @@ -60,6 +62,14 @@ public class JSONNotificationContentBuilder extends NotificationContent.Builder
return this; return this;
} }
+ protected String getChannelId(JSONObject payload) { + protected String getChannelId(JSONObject payload) {
+ try { + try {
+ return payload.getString(CHANNEL_ID_KEY); + return payload.getString(CHANNEL_ID_KEY);
@ -46,71 +46,73 @@ index 0af7fe0..8f2c8d8 100644
try { try {
return payload.getString(TITLE_KEY); 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 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..1619f59 100644 index f1fed19..166b34f 100644
--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java --- 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 +++ 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; @@ -20,6 +20,7 @@ import expo.modules.notifications.notifications.enums.NotificationPriority;
* should be created using {@link NotificationContent.Builder}. * should be created using {@link NotificationContent.Builder}.
*/ */
public class NotificationContent implements Parcelable, Serializable { public class NotificationContent implements Parcelable, Serializable {
+ private String mChannelId; + private string mChannelId;
private String mTitle; private String mTitle;
private String mText; private String mText;
private String mSubtitle; private String mSubtitle;
@@ -50,6 +51,9 @@ public class NotificationContent implements Parcelable, Serializable { @@ -50,6 +51,11 @@ public class NotificationContent implements Parcelable, Serializable {
} }
}; };
+ @Nullable + @Nullable
+ public String getChannelId() { return mChannelId; } + public String getChannelId() {
+ return mTitle;
+ }
+ +
@Nullable @Nullable
public String getTitle() { public String getTitle() {
return mTitle; return mTitle;
@@ -121,6 +125,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -121,6 +127,7 @@ public class NotificationContent implements Parcelable, Serializable {
} }
protected NotificationContent(Parcel in) { protected NotificationContent(Parcel in) {
+ mChannelId = in.readString(); + mChannelId = in.readString();
mTitle = in.readString(); mTitle = in.readString();
mText = in.readString(); mText = in.readString();
mSubtitle = in.readString(); mSubtitle = in.readString();
@@ -146,6 +151,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -146,6 +153,7 @@ public class NotificationContent implements Parcelable, Serializable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mChannelId); + dest.writeString(mChannelId);
dest.writeString(mTitle); dest.writeString(mTitle);
dest.writeString(mText); dest.writeString(mText);
dest.writeString(mSubtitle); dest.writeString(mSubtitle);
@@ -166,6 +172,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -166,6 +174,7 @@ public class NotificationContent implements Parcelable, Serializable {
private static final long serialVersionUID = 397666843266836802L; private static final long serialVersionUID = 397666843266836802L;
private void writeObject(java.io.ObjectOutputStream out) throws IOException { private void writeObject(java.io.ObjectOutputStream out) throws IOException {
+ out.writeObject(mChannelId); + out.writeObject(mChannelId);
out.writeObject(mTitle); out.writeObject(mTitle);
out.writeObject(mText); out.writeObject(mText);
out.writeObject(mSubtitle); out.writeObject(mSubtitle);
@@ -190,6 +197,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -190,6 +199,7 @@ public class NotificationContent implements Parcelable, Serializable {
} }
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
+ mChannelId = (String) in.readObject(); + mChannelId = (String) in.readObject();
mTitle = (String) in.readObject(); mTitle = (String) in.readObject();
mText = (String) in.readObject(); mText = (String) in.readObject();
mSubtitle = (String) in.readObject(); mSubtitle = (String) in.readObject();
@@ -240,6 +248,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -240,6 +250,7 @@ public class NotificationContent implements Parcelable, Serializable {
} }
public static class Builder { public static class Builder {
+ private String mChannelId; + private string mChannelId;
private String mTitle; private String mTitle;
private String mText; private String mText;
private String mSubtitle; private String mSubtitle;
@@ -260,6 +269,11 @@ public class NotificationContent implements Parcelable, Serializable { @@ -260,6 +271,11 @@ public class NotificationContent implements Parcelable, Serializable {
useDefaultVibrationPattern(); useDefaultVibrationPattern();
} }
+ public Builder setChannelId(String channelId) { + public Builder setChannelId(String channelId) {
+ mChannelId = channelId; + mChannelId = channelId;
+ return this; + return this;
@ -119,8 +121,8 @@ index f1fed19..1619f59 100644
public Builder setTitle(String title) { public Builder setTitle(String title) {
mTitle = title; mTitle = title;
return this; return this;
@@ -336,6 +350,7 @@ public class NotificationContent implements Parcelable, Serializable { @@ -336,6 +352,7 @@ public class NotificationContent implements Parcelable, Serializable {
public NotificationContent build() { public NotificationContent build() {
NotificationContent content = new NotificationContent(); NotificationContent content = new NotificationContent();
+ content.mChannelId = mChannelId; + content.mChannelId = mChannelId;
@ -128,28 +130,20 @@ index f1fed19..1619f59 100644
content.mSubtitle = mSubtitle; content.mSubtitle = mSubtitle;
content.mText = mText; 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 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..aab71ea 100644 index 6bd9928..ee93d70 100644
--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java --- 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 +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.java
@@ -7,7 +7,6 @@ import android.content.pm.PackageManager; @@ -48,6 +48,10 @@ public class ExpoNotificationBuilder extends ChannelAwareNotificationBuilder {
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
import android.provider.Settings;
@@ -48,6 +47,10 @@ public class ExpoNotificationBuilder extends ChannelAwareNotificationBuilder {
NotificationContent content = getNotificationContent(); NotificationContent content = getNotificationContent();
+ if (content.getChannelId() != null) { + if (content.getChannelId() != null) {
+ builder.setChannelId(content.getChannelId()); + builder.setChannelId(content.getChannelId());
+ } + }
+ +
builder.setAutoCancel(content.isAutoDismiss()); builder.setAutoCancel(content.isAutoDismiss());
builder.setOngoing(content.isSticky()); 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 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 index 55b3a8d..1b99d5b 100644
--- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt
@ -164,7 +158,7 @@ index 55b3a8d..1b99d5b 100644
import org.json.JSONObject import org.json.JSONObject
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*
-open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate { -open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate {
+open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate, BackgroundNotificationHandlerInterface { +open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate, BackgroundNotificationHandlerInterface {
companion object { companion object {
@ -172,7 +166,7 @@ index 55b3a8d..1b99d5b 100644
// than by static properties. Fortunately, using weak references we can // than by static properties. Fortunately, using weak references we can
@@ -89,12 +92,21 @@ open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseM @@ -89,12 +92,21 @@ open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseM
fun getBackgroundTasks() = sBackgroundTaskConsumerReferences.values.mapNotNull { it.get() } fun getBackgroundTasks() = sBackgroundTaskConsumerReferences.values.mapNotNull { it.get() }
override fun onMessageReceived(remoteMessage: RemoteMessage) { override fun onMessageReceived(remoteMessage: RemoteMessage) {
- NotificationsService.receive(context, createNotification(remoteMessage)) - NotificationsService.receive(context, createNotification(remoteMessage))
- getBackgroundTasks().forEach { - getBackgroundTasks().forEach {
@ -187,7 +181,7 @@ index 55b3a8d..1b99d5b 100644
+ } + }
} }
} }
+ override fun showMessage(remoteMessage: RemoteMessage) { + override fun showMessage(remoteMessage: RemoteMessage) {
+ NotificationsService.receive(context, createNotification(remoteMessage)) + NotificationsService.receive(context, createNotification(remoteMessage))
+ } + }

View File

@ -1,11 +1,11 @@
diff --git a/node_modules/expo-updates/ios/EXUpdates/Update/NewUpdate.swift b/node_modules/expo-updates/ios/EXUpdates/Update/NewUpdate.swift diff --git a/node_modules/expo-updates/ios/EXUpdates/Update/ExpoUpdatesUpdate.swift b/node_modules/expo-updates/ios/EXUpdates/Update/ExpoUpdatesUpdate.swift
index 189a5f5..8d5b8e6 100644 index b85291e..07a5d3c 100644
--- a/node_modules/expo-updates/ios/EXUpdates/Update/NewUpdate.swift --- a/node_modules/expo-updates/ios/EXUpdates/Update/ExpoUpdatesUpdate.swift
+++ b/node_modules/expo-updates/ios/EXUpdates/Update/NewUpdate.swift +++ b/node_modules/expo-updates/ios/EXUpdates/Update/ExpoUpdatesUpdate.swift
@@ -68,13 +68,20 @@ public final class NewUpdate: Update { @@ -78,13 +78,20 @@ public final class ExpoUpdatesUpdate: Update {
processedAssets.append(asset) status = UpdateStatus.StatusPending
} }
+ // Instead of relying on various hacks to get the correct format for the specific + // Instead of relying on various hacks to get the correct format for the specific
+ // platform on the backend, we can just add this little patch.. + // platform on the backend, we can just add this little patch..
+ let dateFormatter = DateFormatter() + let dateFormatter = DateFormatter()
@ -23,4 +23,4 @@ index 189a5f5..8d5b8e6 100644
+ commitTime: date, + commitTime: date,
runtimeVersion: runtimeVersion, runtimeVersion: runtimeVersion,
keep: true, keep: true,
status: UpdateStatus.StatusPending, status: status,

View File

@ -4,4 +4,4 @@ This is a small patch to convert timestamp formats that are returned from the ba
backend to return the correct format for a specific format (the format required on Android is not the same as on iOS) backend to return the correct format for a specific format (the format required on Android is not the same as on iOS)
we can just add this conversion in. we can just add this conversion in.
Don't remove unless we make changes on the backend to support both platforms. Don't remove unless we make changes on the backend to support both platforms.

View File

@ -1,30 +1,28 @@
diff --git a/node_modules/react-native-reanimated/lib/module/reanimated2/index.js b/node_modules/react-native-reanimated/lib/module/reanimated2/index.js diff --git a/node_modules/react-native-reanimated/lib/module/reanimated2/index.js b/node_modules/react-native-reanimated/lib/module/reanimated2/index.js
index 91e49f4..c10d3fc 100644 index ac9be5d..86d4605 100644
--- a/node_modules/react-native-reanimated/lib/module/reanimated2/index.js --- a/node_modules/react-native-reanimated/lib/module/reanimated2/index.js
+++ b/node_modules/react-native-reanimated/lib/module/reanimated2/index.js +++ b/node_modules/react-native-reanimated/lib/module/reanimated2/index.js
@@ -45,4 +45,5 @@ export { getUseOfValueInStyleWarning } from './pluginUtils'; @@ -47,4 +47,5 @@ export { LayoutAnimationConfig } from './component/LayoutAnimationConfig';
export { withReanimatedTimer, advanceAnimationByTime, advanceAnimationByFrame, setUpTests, getAnimatedStyle } from './jestUtils'; export { PerformanceMonitor } from './component/PerformanceMonitor';
export { LayoutAnimationConfig } from './component/LayoutAnimationConfig';
export { startMapper, stopMapper } from './mappers'; export { startMapper, stopMapper } from './mappers';
export { startScreenTransition, finishScreenTransition, ScreenTransition } from './screenTransition';
+export { isReducedMotion } from './PlatformChecker'; +export { isReducedMotion } from './PlatformChecker';
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts b/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts diff --git a/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts b/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts
index 96bd913..ad63a09 100644 index f01dc57..161ef22 100644
--- a/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts --- a/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts
+++ b/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts +++ b/node_modules/react-native-reanimated/lib/typescript/reanimated2/index.d.ts
@@ -33,3 +33,4 @@ export type { Adaptable, AdaptTransforms, AnimateProps, AnimatedProps, AnimatedT @@ -36,3 +36,4 @@ export type { FlatListPropsWithLayout } from './component/FlatList';
export type { AnimatedScrollViewProps } from './component/ScrollView';
export type { FlatListPropsWithLayout } from './component/FlatList';
export { startMapper, stopMapper } from './mappers'; export { startMapper, stopMapper } from './mappers';
export { startScreenTransition, finishScreenTransition, ScreenTransition, } from './screenTransition';
export type { AnimatedScreenTransition, GoBackGesture, ScreenTransitionConfig, } from './screenTransition';
+export { isReducedMotion } from './PlatformChecker'; +export { isReducedMotion } from './PlatformChecker';
diff --git a/node_modules/react-native-reanimated/src/reanimated2/index.ts b/node_modules/react-native-reanimated/src/reanimated2/index.ts diff --git a/node_modules/react-native-reanimated/src/reanimated2/index.ts b/node_modules/react-native-reanimated/src/reanimated2/index.ts
index 096dc05..38fc01d 100644 index 5885fa1..a3c693f 100644
--- a/node_modules/react-native-reanimated/src/reanimated2/index.ts --- a/node_modules/react-native-reanimated/src/reanimated2/index.ts
+++ b/node_modules/react-native-reanimated/src/reanimated2/index.ts +++ b/node_modules/react-native-reanimated/src/reanimated2/index.ts
@@ -271,3 +271,4 @@ export type { @@ -284,3 +284,4 @@ export type {
export type { AnimatedScrollViewProps } from './component/ScrollView'; GoBackGesture,
export type { FlatListPropsWithLayout } from './component/FlatList'; ScreenTransitionConfig,
export { startMapper, stopMapper } from './mappers'; } from './screenTransition';
+export { isReducedMotion } from './PlatformChecker'; +export { isReducedMotion } from './PlatformChecker';
\ No newline at end of file

View File

@ -1,56 +0,0 @@
import * as Updates from 'expo-updates'
import {useCallback, useEffect} from 'react'
import {AppState} from 'react-native'
import {logger} from '#/logger'
export function useOTAUpdate() {
// HELPER FUNCTIONS
const checkForUpdate = useCallback(async () => {
logger.debug('useOTAUpdate: Checking for update...')
try {
// Check if new OTA update is available
const update = await Updates.checkForUpdateAsync()
// If updates aren't available stop the function execution
if (!update.isAvailable) {
return
}
// Otherwise fetch the update in the background, so even if the user rejects switching to latest version it will be done automatically on next relaunch.
await Updates.fetchUpdateAsync()
} catch (e) {
logger.error('useOTAUpdate: Error while checking for update', {
message: e,
})
}
}, [])
const updateEventListener = useCallback((event: Updates.UpdateEvent) => {
logger.debug('useOTAUpdate: Listening for update...')
if (event.type === Updates.UpdateEventType.ERROR) {
logger.error('useOTAUpdate: Error while listening for update', {
message: event.message,
})
} else if (event.type === Updates.UpdateEventType.NO_UPDATE_AVAILABLE) {
// Handle no update available
// do nothing
} else if (event.type === Updates.UpdateEventType.UPDATE_AVAILABLE) {
// Handle update available
// open modal, ask for user confirmation, and reload the app
}
}, [])
useEffect(() => {
// ADD EVENT LISTENERS
const updateEventSubscription = Updates.addListener(updateEventListener)
const appStateSubscription = AppState.addEventListener('change', state => {
if (state === 'active' && !__DEV__) {
checkForUpdate()
}
})
// REMOVE EVENT LISTENERS (CLEANUP)
return () => {
updateEventSubscription.remove()
appStateSubscription.remove()
}
}, []) // eslint-disable-line react-hooks/exhaustive-deps
// disable exhaustive deps because we don't want to run this effect again
}

View File

@ -109,7 +109,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
], ],
) )
const scrollRefs = useSharedValue<AnimatedRef<any>[]>([]) const scrollRefs = useSharedValue<Array<AnimatedRef<any> | null>>([])
const registerRef = React.useCallback( const registerRef = React.useCallback(
(scrollRef: AnimatedRef<any> | null, atIndex: number) => { (scrollRef: AnimatedRef<any> | null, atIndex: number) => {
scrollRefs.modify(refs => { scrollRefs.modify(refs => {
@ -130,8 +130,9 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
lastForcedScrollY.value = forcedScrollY lastForcedScrollY.value = forcedScrollY
const refs = scrollRefs.value const refs = scrollRefs.value
for (let i = 0; i < refs.length; i++) { for (let i = 0; i < refs.length; i++) {
if (i !== currentPage && refs[i] != null) { const scollRef = refs[i]
scrollTo(refs[i], 0, forcedScrollY, false) if (i !== currentPage && scollRef != null) {
scrollTo(scollRef, 0, forcedScrollY, false)
} }
} }
} }

View File

@ -14,6 +14,7 @@
import React from 'react' import React from 'react'
import { import {
FlatList,
FlatListProps, FlatListProps,
ScrollViewProps, ScrollViewProps,
StyleSheet, StyleSheet,
@ -67,7 +68,7 @@ export const FlatList_INTERNAL = React.forwardRef(function FlatListImpl<ItemT>(
desktopFixedHeight, desktopFixedHeight,
...props ...props
}: React.PropsWithChildren<FlatListProps<ItemT> & AddedProps>, }: React.PropsWithChildren<FlatListProps<ItemT> & AddedProps>,
ref: React.Ref<Animated.FlatList<ItemT>>, ref: React.Ref<FlatList<ItemT>>,
) { ) {
const pal = usePalette('default') const pal = usePalette('default')
const {isMobile} = useWebMediaQueries() const {isMobile} = useWebMediaQueries()

View File

@ -1,27 +1,28 @@
import React from 'react' import React from 'react'
import {StyleSheet, View} from 'react-native' import {StyleSheet, View} from 'react-native'
import {Text} from '../com/util/text/Text' import RNPickerSelect, {PickerSelectProps} from 'react-native-picker-select'
import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types'
import {ViewHeader} from 'view/com/util/ViewHeader'
import {CenteredView} from 'view/com/util/Views'
import {Button} from 'view/com/util/forms/Button'
import { import {
FontAwesomeIcon, FontAwesomeIcon,
FontAwesomeIconStyle, FontAwesomeIconStyle,
} from '@fortawesome/react-native-fontawesome' } from '@fortawesome/react-native-fontawesome'
import {useAnalytics} from 'lib/analytics/analytics' import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useFocusEffect} from '@react-navigation/native' import {useFocusEffect} from '@react-navigation/native'
import {APP_LANGUAGES, LANGUAGES} from 'lib/../locale/languages'
import RNPickerSelect, {PickerSelectProps} from 'react-native-picker-select' import {sanitizeAppLanguageSetting} from '#/locale/helpers'
import {useSetMinimalShellMode} from '#/state/shell'
import {useModalControls} from '#/state/modals' import {useModalControls} from '#/state/modals'
import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences' import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences'
import {Trans, msg} from '@lingui/macro' import {useSetMinimalShellMode} from '#/state/shell'
import {useLingui} from '@lingui/react' import {APP_LANGUAGES, LANGUAGES} from 'lib/../locale/languages'
import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {useAnalytics} from 'lib/analytics/analytics'
import {usePalette} from 'lib/hooks/usePalette'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types'
import {s} from 'lib/styles'
import {Button} from 'view/com/util/forms/Button'
import {ViewHeader} from 'view/com/util/ViewHeader'
import {CenteredView} from 'view/com/util/Views'
import {Text} from '../com/util/text/Text'
type Props = NativeStackScreenProps<CommonNavigatorParams, 'LanguageSettings'> type Props = NativeStackScreenProps<CommonNavigatorParams, 'LanguageSettings'>
@ -132,9 +133,10 @@ export function LanguageSettingsScreen(_props: Props) {
paddingVertical: 8, paddingVertical: 8,
borderRadius: 24, borderRadius: 24,
}, },
inputWeb: { inputWeb: {
// @ts-ignore web only
cursor: 'pointer', cursor: 'pointer',
// @ts-ignore web only
'-moz-appearance': 'none', '-moz-appearance': 'none',
'-webkit-appearance': 'none', '-webkit-appearance': 'none',
appearance: 'none', appearance: 'none',
@ -224,8 +226,8 @@ export function LanguageSettingsScreen(_props: Props) {
borderRadius: 24, borderRadius: 24,
}, },
inputWeb: { inputWeb: {
// @ts-ignore web only
cursor: 'pointer', cursor: 'pointer',
// @ts-ignore web only
'-moz-appearance': 'none', '-moz-appearance': 'none',
'-webkit-appearance': 'none', '-webkit-appearance': 'none',
appearance: 'none', appearance: 'none',

View File

@ -739,8 +739,8 @@ let SearchInputBox = ({
style={[ style={[
{backgroundColor: pal.colors.backgroundLight}, {backgroundColor: pal.colors.backgroundLight},
styles.headerSearchContainer, styles.headerSearchContainer,
// @ts-expect-error web only
isWeb && { isWeb && {
// @ts-ignore web only
cursor: 'default', cursor: 'default',
}, },
]} ]}

1891
yarn.lock

File diff suppressed because it is too large Load Diff