From c60b1c1cb9dab7c89d88b991e058470764b35ad6 Mon Sep 17 00:00:00 2001 From: Abbey Campbell Date: Tue, 10 Mar 2026 13:48:58 -0700 Subject: [PATCH 01/12] replace deprecated runOnJS --- src/components/Camera/hooks/useZoom.ts | 5 +++-- .../SharedComponents/ActivityAnimation/Confetti.tsx | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/Camera/hooks/useZoom.ts b/src/components/Camera/hooks/useZoom.ts index 20bd06f82..e6e374d44 100644 --- a/src/components/Camera/hooks/useZoom.ts +++ b/src/components/Camera/hooks/useZoom.ts @@ -12,12 +12,13 @@ import { import { Extrapolation, interpolate, - runOnJS, useAnimatedProps, useSharedValue, withSpring, } from "react-native-reanimated"; import type { CameraDevice, CameraProps } from "react-native-vision-camera"; +// eslint-disable-next-line import/no-extraneous-dependencies +import { scheduleOnRN } from "react-native-worklets"; // This is taken from react-native-vision library itself: https://github.com/mrousavy/react-native-vision-camera/blob/9eed89aac6155eba155595f3e006707152550d0d/package/example/src/Constants.ts#L19 https://github.com/mrousavy/react-native-vision-camera/blob/9eed89aac6155eba155595f3e006707152550d0d/package/example/src/CameraPage.tsx#L34 @@ -115,7 +116,7 @@ const useZoom = ( device: CameraDevice ): object => { ); zoom.set( newZoom ); - runOnJS( updateZoomTextValue )( newZoom ); + scheduleOnRN( updateZoomTextValue, newZoom ); }, [maxZoomWithPinch, minZoom, updateZoomTextValue, startZoom, zoom] ); const animatedProps = useAnimatedProps < CameraProps >( diff --git a/src/components/SharedComponents/ActivityAnimation/Confetti.tsx b/src/components/SharedComponents/ActivityAnimation/Confetti.tsx index aa4c5cb58..b2f10fbdb 100644 --- a/src/components/SharedComponents/ActivityAnimation/Confetti.tsx +++ b/src/components/SharedComponents/ActivityAnimation/Confetti.tsx @@ -11,11 +11,11 @@ import type { SharedValue } from "react-native-reanimated"; import Animated, { Easing, interpolate, - runOnJS, useAnimatedStyle, useSharedValue, withTiming, } from "react-native-reanimated"; +import { scheduleOnRN } from "react-native-worklets"; import colors from "styles/tailwindColors"; type ConfettiProps = PropsWithChildren<{ @@ -85,7 +85,7 @@ const Confetti = ( { count, duration = 5000 }: ConfettiProps ) => { }, finished => { if ( finished ) { - runOnJS( setAutoDestroy )( true ); + scheduleOnRN( setAutoDestroy, true ); } }, ) ); From 1d5ecf64169bf640cfaa2f709863b7d5e9077209 Mon Sep 17 00:00:00 2001 From: Abbey Campbell Date: Wed, 11 Mar 2026 12:08:42 -0700 Subject: [PATCH 02/12] bump react-native-reanimated to 4.2.0 --- ios/Podfile.lock | 24 ++++---- package-lock.json | 150 +++++++++++++++++++++++----------------------- package.json | 4 +- 3 files changed, 90 insertions(+), 88 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e00a66c1e..6bf1f6667 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3125,7 +3125,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNReanimated (4.1.6): + - RNReanimated (4.2.0): - boost - DoubleConversion - fast_float @@ -3152,11 +3152,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 4.1.6) + - RNReanimated/reanimated (= 4.2.0) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated (4.1.6): + - RNReanimated/reanimated (4.2.0): - boost - DoubleConversion - fast_float @@ -3183,11 +3183,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 4.1.6) + - RNReanimated/reanimated/apple (= 4.2.0) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated/apple (4.1.6): + - RNReanimated/reanimated/apple (4.2.0): - boost - DoubleConversion - fast_float @@ -3389,7 +3389,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNWorklets (0.5.2): + - RNWorklets (0.7.4): - boost - DoubleConversion - fast_float @@ -3416,10 +3416,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNWorklets/worklets (= 0.5.2) + - RNWorklets/worklets (= 0.7.4) - SocketRocket - Yoga - - RNWorklets/worklets (0.5.2): + - RNWorklets/worklets (0.7.4): - boost - DoubleConversion - fast_float @@ -3446,10 +3446,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNWorklets/worklets/apple (= 0.5.2) + - RNWorklets/worklets/apple (= 0.7.4) - SocketRocket - Yoga - - RNWorklets/worklets/apple (0.5.2): + - RNWorklets/worklets/apple (0.7.4): - boost - DoubleConversion - fast_float @@ -4076,12 +4076,12 @@ SPEC CHECKSUMS: RNGoogleSignin: b126da02b9402311c8093e72b064a7e85d139921 RNLocalize: d8ccb568b40c72c767714db3808ce66a1ecf444a RNPermissions: 79345e03d8bede3692368496ec89dcc4768585b5 - RNReanimated: 84b0ffbe148232bda35e2527d0b938a97a51c5e7 + RNReanimated: 9342633c89caa4899897e4aaaa85912b824dc6e7 RNScreens: 4f2aed147a2775017923789d8a0a2d377712ec2e RNShareMenu: 8871da57c9d3ed2b94d30c784d6f67d062e3b016 RNStoreReview: 8f6061907efb6474757db004ee8faac728fd2ada RNSVG: f2979aa72b14050b9220415c19de398f9cec9aaf - RNWorklets: 88b4f0eb7d19cbc07d19274ee66b15200e206d38 + RNWorklets: ca03ce776c15a592ef0700386071466810c41ea0 SensitiveInfo: 09107b865dc23b4e9c0a61ec01385387bf3391a8 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 VisionCamera: 0044a94f7489f19e19d5938e97dfc36f4784af3c diff --git a/package-lock.json b/package-lock.json index fd1762063..8b63976ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "~4.1.0", + "react-native-reanimated": "4.2.0", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", @@ -105,7 +105,7 @@ "react-native-vision-camera": "^4.7.3", "react-native-volume-manager": "^2.0.8", "react-native-webview": "^13.15.0", - "react-native-worklets": "^0.5.0", + "react-native-worklets": "^0.7.0", "react-native-worklets-core": "^1.6.2", "realm": "^20.2.0", "sanitize-html": "^2.13.0", @@ -219,9 +219,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -300,13 +300,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -325,12 +325,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -646,12 +646,12 @@ "license": "MIT" }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1158,17 +1158,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -2264,17 +2264,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" @@ -2300,9 +2301,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -14571,14 +14572,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -20941,19 +20934,18 @@ } }, "node_modules/react-native-reanimated": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.6.tgz", - "integrity": "sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.0.tgz", + "integrity": "sha512-frhu5b8/m/VvaMWz48V8RxcsXnE3hrlErQ5chr21MzAeDCpY4X14sQjvm+jvu3aOI+7Cz2atdRpyhhIuqxVaXg==", "license": "MIT", "dependencies": { - "react-native-is-edge-to-edge": "^1.2.1", - "semver": "7.7.2" + "react-native-is-edge-to-edge": "1.2.1", + "semver": "7.7.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0", "react": "*", "react-native": "*", - "react-native-worklets": ">=0.5.0" + "react-native-worklets": ">=0.7.0" } }, "node_modules/react-native-reanimated-carousel": { @@ -20968,10 +20960,20 @@ "react-native-reanimated": ">=3.0.0" } }, + "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", + "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-reanimated/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -21221,25 +21223,25 @@ } }, "node_modules/react-native-worklets": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.2.tgz", - "integrity": "sha512-lCzmuIPAK/UaOJYEPgYpVqrsxby1I54f7PyyZUMEO04nwc00CDrCvv9lCTY1daLHYTF8lS3f9zlzErfVsIKqkA==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.7.4.tgz", + "integrity": "sha512-NYOdM1MwBb3n+AtMqy1tFy3Mn8DliQtd8sbzAVRf9Gc+uvQ0zRfxN7dS8ZzoyX7t6cyQL5THuGhlnX+iFlQTag==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "semver": "7.7.2" + "@babel/plugin-transform-arrow-functions": "7.27.1", + "@babel/plugin-transform-class-properties": "7.27.1", + "@babel/plugin-transform-classes": "7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "7.27.1", + "@babel/plugin-transform-optional-chaining": "7.27.1", + "@babel/plugin-transform-shorthand-properties": "7.27.1", + "@babel/plugin-transform-template-literals": "7.27.1", + "@babel/plugin-transform-unicode-regex": "7.27.1", + "@babel/preset-typescript": "7.27.1", + "convert-source-map": "2.0.0", + "semver": "7.7.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0", + "@babel/core": "*", "react": "*", "react-native": "*" } @@ -21258,9 +21260,9 @@ } }, "node_modules/react-native-worklets/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index c4a615cfa..4aa855e4d 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "~4.1.0", + "react-native-reanimated": "4.2.0", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", @@ -139,7 +139,7 @@ "react-native-svg-transformer": "^1.5.2", "react-native-url-polyfill": "^2.0.0", "react-native-vision-camera": "^4.7.3", - "react-native-worklets": "^0.5.0", + "react-native-worklets": "^0.7.0", "react-native-volume-manager": "^2.0.8", "react-native-webview": "^13.15.0", "react-native-worklets-core": "^1.6.2", From 960b2159f92e679a282fa73168f7db2886069dcf Mon Sep 17 00:00:00 2001 From: Abbey Campbell Date: Wed, 11 Mar 2026 12:17:21 -0700 Subject: [PATCH 03/12] bump react-native-reanimated to 4.2.1 --- ios/Podfile.lock | 12 ++++++------ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 6bf1f6667..71e63a0ff 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3125,7 +3125,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNReanimated (4.2.0): + - RNReanimated (4.2.1): - boost - DoubleConversion - fast_float @@ -3152,11 +3152,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 4.2.0) + - RNReanimated/reanimated (= 4.2.1) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated (4.2.0): + - RNReanimated/reanimated (4.2.1): - boost - DoubleConversion - fast_float @@ -3183,11 +3183,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 4.2.0) + - RNReanimated/reanimated/apple (= 4.2.1) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated/apple (4.2.0): + - RNReanimated/reanimated/apple (4.2.1): - boost - DoubleConversion - fast_float @@ -4076,7 +4076,7 @@ SPEC CHECKSUMS: RNGoogleSignin: b126da02b9402311c8093e72b064a7e85d139921 RNLocalize: d8ccb568b40c72c767714db3808ce66a1ecf444a RNPermissions: 79345e03d8bede3692368496ec89dcc4768585b5 - RNReanimated: 9342633c89caa4899897e4aaaa85912b824dc6e7 + RNReanimated: e79d7f42b76ba026e7dc5fb3e3f81991c590d3af RNScreens: 4f2aed147a2775017923789d8a0a2d377712ec2e RNShareMenu: 8871da57c9d3ed2b94d30c784d6f67d062e3b016 RNStoreReview: 8f6061907efb6474757db004ee8faac728fd2ada diff --git a/package-lock.json b/package-lock.json index 8b63976ba..fbf48d977 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "4.2.0", + "react-native-reanimated": "4.2.1", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", @@ -20934,9 +20934,9 @@ } }, "node_modules/react-native-reanimated": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.0.tgz", - "integrity": "sha512-frhu5b8/m/VvaMWz48V8RxcsXnE3hrlErQ5chr21MzAeDCpY4X14sQjvm+jvu3aOI+7Cz2atdRpyhhIuqxVaXg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.1.tgz", + "integrity": "sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "1.2.1", diff --git a/package.json b/package.json index 4aa855e4d..eaef72ea2 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "4.2.0", + "react-native-reanimated": "4.2.1", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", From 8c5f73bbb6055f1adbc418b415b487ed02c32414 Mon Sep 17 00:00:00 2001 From: Abbey Campbell Date: Wed, 11 Mar 2026 13:05:13 -0700 Subject: [PATCH 04/12] bump react-native-reanimated to 4.2.2 --- ios/Podfile.lock | 12 ++++++------ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 71e63a0ff..9291bb189 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3125,7 +3125,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNReanimated (4.2.1): + - RNReanimated (4.2.2): - boost - DoubleConversion - fast_float @@ -3152,11 +3152,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 4.2.1) + - RNReanimated/reanimated (= 4.2.2) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated (4.2.1): + - RNReanimated/reanimated (4.2.2): - boost - DoubleConversion - fast_float @@ -3183,11 +3183,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 4.2.1) + - RNReanimated/reanimated/apple (= 4.2.2) - RNWorklets - SocketRocket - Yoga - - RNReanimated/reanimated/apple (4.2.1): + - RNReanimated/reanimated/apple (4.2.2): - boost - DoubleConversion - fast_float @@ -4076,7 +4076,7 @@ SPEC CHECKSUMS: RNGoogleSignin: b126da02b9402311c8093e72b064a7e85d139921 RNLocalize: d8ccb568b40c72c767714db3808ce66a1ecf444a RNPermissions: 79345e03d8bede3692368496ec89dcc4768585b5 - RNReanimated: e79d7f42b76ba026e7dc5fb3e3f81991c590d3af + RNReanimated: 372fdfc5e6abdf42bddf588e206d15aedf46121a RNScreens: 4f2aed147a2775017923789d8a0a2d377712ec2e RNShareMenu: 8871da57c9d3ed2b94d30c784d6f67d062e3b016 RNStoreReview: 8f6061907efb6474757db004ee8faac728fd2ada diff --git a/package-lock.json b/package-lock.json index fbf48d977..5f1a37a8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "4.2.1", + "react-native-reanimated": "^4.2.2", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", @@ -20934,9 +20934,9 @@ } }, "node_modules/react-native-reanimated": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.1.tgz", - "integrity": "sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.2.tgz", + "integrity": "sha512-o3kKvdD8cVlg12Z4u3jv0MFAt53QV4k7gD9OLwQqU8eZLyd8QvaOjVZIghMZhC2pjP93uUU44PlO5JgF8S4Vxw==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "1.2.1", diff --git a/package.json b/package.json index eaef72ea2..349c2d583 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "react-native-orientation-locker": "github:wonday/react-native-orientation-locker", "react-native-paper": "^5.12.3", "react-native-permissions": "^4.1.5", - "react-native-reanimated": "4.2.1", + "react-native-reanimated": "^4.2.2", "react-native-reanimated-carousel": "^4.0.3", "react-native-render-html": "^6.3.4", "react-native-restart": "^0.0.27", From a7f262d9d65017d5a1a714fa9c5a9579446cde7f Mon Sep 17 00:00:00 2001 From: Abbey Campbell Date: Wed, 11 Mar 2026 13:06:09 -0700 Subject: [PATCH 05/12] add mock for worklets and update snapshots --- tests/jest.setup.js | 6 ++++++ .../Camera/__snapshots__/PhotoCarousel.test.js.snap | 6 ------ .../UploadStatus/__snapshots__/UploadStatus.test.js.snap | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/jest.setup.js b/tests/jest.setup.js index 3f77149a5..9849f264b 100644 --- a/tests/jest.setup.js +++ b/tests/jest.setup.js @@ -55,6 +55,12 @@ jest.mock( "@react-native-community/netinfo", () => mockRNCNetInfo ); jest.mock( "react-native-device-info", () => mockRNDeviceInfo ); jest.mock( "react-native-safe-area-context", () => mockSafeAreaContext ); +// Reanimated 4.2 + Worklets 0.7: Jest loads native worklets which fails in Node. See: +// https://github.com/software-mansion/react-native-reanimated/discussions/8806 +// we can remove this once the fix is released +// eslint-disable-next-line import/no-extraneous-dependencies +jest.mock( "react-native-worklets", () => require( "react-native-worklets/src/mock" ) ); + require( "react-native-reanimated" ).setUpTests(); // Some test environments may need a little more time diff --git a/tests/unit/components/Camera/__snapshots__/PhotoCarousel.test.js.snap b/tests/unit/components/Camera/__snapshots__/PhotoCarousel.test.js.snap index 492f22f45..b86cad55d 100644 --- a/tests/unit/components/Camera/__snapshots__/PhotoCarousel.test.js.snap +++ b/tests/unit/components/Camera/__snapshots__/PhotoCarousel.test.js.snap @@ -70,7 +70,6 @@ exports[`PhotoCarousel renders correctly 1`] = ` } } jestInlineStyle={{}} - nativeID="0" style={ [ { @@ -248,7 +247,6 @@ exports[`PhotoCarousel renders correctly 1`] = ` } } jestInlineStyle={{}} - nativeID="1" style={ [ { @@ -426,7 +424,6 @@ exports[`PhotoCarousel renders correctly 1`] = ` } } jestInlineStyle={{}} - nativeID="2" style={ [ { @@ -648,7 +645,6 @@ exports[`PhotoCarousel renders correctly for large screen 1`] = ` } } jestInlineStyle={{}} - nativeID="3" style={ [ { @@ -831,7 +827,6 @@ exports[`PhotoCarousel renders correctly for large screen 1`] = ` } } jestInlineStyle={{}} - nativeID="4" style={ [ { @@ -1014,7 +1009,6 @@ exports[`PhotoCarousel renders correctly for large screen 1`] = ` } } jestInlineStyle={{}} - nativeID="5" style={ [ { diff --git a/tests/unit/components/SharedComponents/UploadStatus/__snapshots__/UploadStatus.test.js.snap b/tests/unit/components/SharedComponents/UploadStatus/__snapshots__/UploadStatus.test.js.snap index c944b9d0f..7cab72481 100644 --- a/tests/unit/components/SharedComponents/UploadStatus/__snapshots__/UploadStatus.test.js.snap +++ b/tests/unit/components/SharedComponents/UploadStatus/__snapshots__/UploadStatus.test.js.snap @@ -48,7 +48,6 @@ exports[`UploadStatus displays complete icon when progress is 1 1`] = ` "value": {}, } } - nativeID="2" testID="UploadIcon.complete.undefined" > Date: Thu, 12 Mar 2026 13:31:25 -0700 Subject: [PATCH 06/12] fix forgot password layout --- src/components/LoginSignUp/ForgotPassword.tsx | 57 ++++++++----------- .../LoginSignUp/ForgotPasswordForm.tsx | 52 ++++------------- 2 files changed, 37 insertions(+), 72 deletions(-) diff --git a/src/components/LoginSignUp/ForgotPassword.tsx b/src/components/LoginSignUp/ForgotPassword.tsx index f80149594..03a0da5e3 100644 --- a/src/components/LoginSignUp/ForgotPassword.tsx +++ b/src/components/LoginSignUp/ForgotPassword.tsx @@ -1,10 +1,11 @@ import { useNavigation } from "@react-navigation/native"; import { WarningSheet } from "components/SharedComponents"; -import type { ScrollView } from "components/styledComponents"; +import { View } from "components/styledComponents"; import { t } from "i18next"; import React, { useCallback, useState } from "react"; import { Keyboard, TouchableWithoutFeedback } from "react-native"; import { openInbox } from "sharedHelpers/mail"; +import useKeyboardInfo from "sharedHooks/useKeyboardInfo"; import { resetPassword, @@ -13,14 +14,10 @@ import ForgotPasswordForm from "./ForgotPasswordForm"; import Header from "./Header"; import LoginSignUpWrapper from "./LoginSignUpWrapper"; -interface RenderProps { - // eslint-disable-next-line react/no-unused-prop-types - scrollViewRef: { current: null | React.Ref }; -} - const ForgotPassword = ( ) => { const navigation = useNavigation( ); const [showSheet, setShowSheet] = useState( false ); + const { keyboardShown } = useKeyboardInfo( ); const reset = useCallback( async ( email: string ) => { await resetPassword( email ); @@ -32,34 +29,30 @@ const ForgotPassword = ( ) => { Keyboard.dismiss( ); }; - const renderForgotPassword = useCallback( ( { scrollViewRef }: RenderProps ) => ( - <> - {showSheet && ( - setShowSheet( false )} - confirm={openInbox} - headerText={t( "CHECK-YOUR-EMAIL" )} - text={t( "If-an-account-with-that-email-exists" )} - buttonText={t( "OPEN-EMAIL" )} - secondButtonText={t( "BACK-TO-LOGIN" )} - handleSecondButtonPress={( ) => { - setShowSheet( false ); - navigation.navigate( "LoginStackNavigator", { screen: "Login" } ); - }} - buttonType="focus" - loading={false} - /> - )} -
- - - ), [showSheet, setShowSheet, reset, navigation] ); - return ( - - {renderForgotPassword} - + + {showSheet && ( + setShowSheet( false )} + confirm={openInbox} + headerText={t( "CHECK-YOUR-EMAIL" )} + text={t( "If-an-account-with-that-email-exists" )} + buttonText={t( "OPEN-EMAIL" )} + secondButtonText={t( "BACK-TO-LOGIN" )} + handleSecondButtonPress={( ) => { + setShowSheet( false ); + navigation.navigate( "LoginStackNavigator", { screen: "Login" } ); + }} + buttonType="focus" + loading={false} + /> + )} + +
+ + + ); }; diff --git a/src/components/LoginSignUp/ForgotPasswordForm.tsx b/src/components/LoginSignUp/ForgotPasswordForm.tsx index 8f7a1e6f9..d20214c7d 100644 --- a/src/components/LoginSignUp/ForgotPasswordForm.tsx +++ b/src/components/LoginSignUp/ForgotPasswordForm.tsx @@ -3,30 +3,22 @@ import { Body1, Button, } from "components/SharedComponents"; -import type { ScrollView } from "components/styledComponents"; import { View } from "components/styledComponents"; import { t } from "i18next"; -import type { ElementRef, Node } from "react"; -import React, { - useCallback, useEffect, useRef, useState, -} from "react"; +import type { Node } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { TouchableWithoutFeedback } from "react-native"; -import useKeyboardInfo from "sharedHooks/useKeyboardInfo"; import LoginSignUpInputField from "./LoginSignUpInputField"; interface Props { reset: ( email: string ) => Promise; - scrollViewRef?: { current: null | ElementRef }; } -const ForgotPasswordForm = ( { reset, scrollViewRef }: Props ): Node => { +const ForgotPasswordForm = ( { reset }: Props ): Node => { const [email, setEmail] = useState( "" ); const emailRef = useRef( null ); const navigation = useNavigation( ); - const { keyboardShown } = useKeyboardInfo( ); - - const inputFieldRef = useRef( null ); const blurFields = () => { if ( emailRef.current ) { @@ -46,24 +38,6 @@ const ForgotPasswordForm = ( { reset, scrollViewRef }: Props ): Node => { return unsubscribeTransition; }, [navigation] ); - const scrollToItem = useCallback( ( ) => { - if ( scrollViewRef?.current && inputFieldRef?.current ) { - inputFieldRef.current?.measureLayout( - scrollViewRef.current, - ( _, y ) => { - scrollViewRef.current?.scrollTo( { y, animated: true } ); - }, - () => console.log( "Failed to measure" ), - ); - } - }, [scrollViewRef] ); - - useEffect( ( ) => { - if ( keyboardShown ) { - scrollToItem( ); - } - }, [keyboardShown, scrollToItem] ); - return ( @@ -79,17 +53,15 @@ const ForgotPasswordForm = ( { reset, scrollViewRef }: Props ): Node => { onChangeText={text => setEmail( text )} testID="Login.email" /> - -