expo bump

This commit is contained in:
Oleksii Bulenok
2026-07-27 14:00:44 +02:00
parent aac662180f
commit 00b5ff01ee
18 changed files with 56 additions and 231 deletions
+50 -50
View File
@@ -159,43 +159,43 @@
"emoji-mart": "^5.6.0",
"emoji-regex": "^10.4.0",
"eventemitter3": "^5.0.1",
"expo": "54.0.35",
"expo": "57.0.8",
"expo-age-range": "0.2.18",
"expo-application": "~7.0.8",
"expo-asset": "~12.0.13",
"expo-blur": "~15.0.8",
"expo-build-properties": "~1.0.10",
"expo-camera": "~17.0.10",
"expo-clipboard": "~8.0.8",
"expo-contacts": "^15.0.10",
"expo-dev-client": "~6.0.20",
"expo-device": "~8.0.10",
"expo-file-system": "~19.0.21",
"expo-font": "~14.0.11",
"expo-glass-effect": "0.1.10",
"expo-haptics": "~15.0.8",
"expo-image": "~3.0.11",
"expo-image-manipulator": "~14.0.8",
"expo-image-picker": "~17.0.10",
"expo-intent-launcher": "~13.0.8",
"expo-keep-awake": "~15.0.8",
"expo-linear-gradient": "~15.0.8",
"expo-linking": "~8.0.11",
"expo-localization": "~17.0.8",
"expo-location": "~19.0.8",
"expo-media-library": "~18.2.1",
"expo-notifications": "~0.32.17",
"expo-application": "~57.0.2",
"expo-asset": "~57.0.7",
"expo-blur": "~57.0.2",
"expo-build-properties": "~57.0.7",
"expo-camera": "~57.0.3",
"expo-clipboard": "~57.0.1",
"expo-contacts": "^57.0.2",
"expo-dev-client": "~57.0.9",
"expo-device": "~57.0.1",
"expo-file-system": "~57.0.1",
"expo-font": "~57.0.1",
"expo-glass-effect": "57.0.1",
"expo-haptics": "~57.0.1",
"expo-image": "~57.0.1",
"expo-image-manipulator": "~57.0.6",
"expo-image-picker": "~57.0.6",
"expo-intent-launcher": "~57.0.1",
"expo-keep-awake": "~57.0.1",
"expo-linear-gradient": "~57.0.1",
"expo-linking": "~57.0.4",
"expo-localization": "~57.0.1",
"expo-location": "~57.0.6",
"expo-media-library": "~57.0.3",
"expo-notifications": "~57.0.7",
"expo-paste-input": "^0.2.1",
"expo-privacy-sensitive": "^0.2.0",
"expo-screen-orientation": "~9.0.8",
"expo-sharing": "~14.0.8",
"expo-sms": "^14.0.7",
"expo-splash-screen": "~31.0.13",
"expo-system-ui": "~6.0.9",
"expo-updates": "~29.0.17",
"expo-video": "~3.0.16",
"expo-video-thumbnails": "^10.0.8",
"expo-web-browser": "~15.0.10",
"expo-screen-orientation": "~57.0.1",
"expo-sharing": "~57.0.7",
"expo-sms": "^57.0.1",
"expo-splash-screen": "~57.0.5",
"expo-system-ui": "~57.0.1",
"expo-updates": "~57.0.10",
"expo-video": "~57.0.2",
"expo-video-thumbnails": "^57.0.1",
"expo-web-browser": "~57.0.2",
"fast-deep-equal": "^3.1.3",
"fast-text-encoding": "^1.0.6",
"fuse.js": "^7.1.0",
@@ -215,36 +215,36 @@
"normalize-url": "^8.0.0",
"psl": "1.9.0",
"radix-ui": "^1.4.3",
"react": "19.1.0",
"react": "19.2.3",
"react-compiler-runtime": "19.1.0-rc.3",
"react-dom": "19.1.0",
"react-dom": "19.2.3",
"react-hotkeys-hook": "5.2.4",
"react-image-crop": "^11.0.7",
"react-is": "19",
"react-keyed-flatten-children": "^5.0.0",
"react-native": "0.81.5",
"react-native": "0.86.0",
"react-native-compressor": "1.13.0",
"react-native-date-picker": "^5.0.13",
"react-native-device-attest": "^0.1.6",
"react-native-drawer-layout": "^4.2.3",
"react-native-edge-to-edge": "^1.8.1",
"react-native-gesture-handler": "~2.30.0",
"react-native-keyboard-controller": "^1.21.8",
"react-native-gesture-handler": "~2.32.0",
"react-native-keyboard-controller": "^1.21.9",
"react-native-mmkv": "^3.3.3",
"react-native-pager-view": "6.8.0",
"react-native-progress": "^5.0.1",
"react-native-qrcode-styled": "^0.3.3",
"react-native-reanimated": "~4.3.2",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "4.24.0",
"react-native-safe-area-context": "~5.7.0",
"react-native-screens": "4.26.2",
"react-native-scroll-forwarder": "link:./modules/react-native-scroll-forwarder",
"react-native-svg": "15.12.1",
"react-native-svg": "15.15.4",
"react-native-uuid": "^2.0.3",
"react-native-view-shot": "^4.0.3",
"react-native-view-shot": "^5.1.0",
"react-native-web": "^0.21.0",
"react-native-web-webview": "^1.0.2",
"react-native-webview": "^13.15.0",
"react-native-worklets": "0.8.3",
"react-native-webview": "^13.16.1",
"react-native-worklets": "0.10.0",
"react-remove-scroll-bar": "^2.3.8",
"react-responsive": "^10.0.1",
"react-textarea-autosize": "^8.5.3",
@@ -275,13 +275,13 @@
"@types/lodash.debounce": "^4.0.7",
"@types/lodash.shuffle": "^4.2.7",
"@types/psl": "1.1.1",
"@types/react": "^19.1.17",
"@types/react-dom": "^19.1.11",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@typescript/native": "npm:typescript@^7.0.2",
"babel-jest": "^29.7.0",
"babel-plugin-module-resolver": "^5.0.2",
"babel-plugin-react-compiler": "19.1.0-rc.3",
"babel-preset-expo": "~54.0.10",
"babel-preset-expo": "~57.0.4",
"eslint-plugin-bsky-internal": "link:eslint",
"eslint-plugin-react-compiler": "19.1.0-rc.2",
"eslint-plugin-react-native": "^5.0.0",
@@ -292,7 +292,7 @@
"husky": "^9.1.7",
"is-ci": "^3.0.1",
"jest": "^29.7.0",
"jest-expo": "~54.0.17",
"jest-expo": "~57.0.2",
"jest-junit": "^16.0.0",
"lint-staged": "^17.0.8",
"oxlint": "^1.73.0",
@@ -302,7 +302,7 @@
"react-refresh": "^0.14.0",
"svgo": "^4.0.2",
"ts-plugin-sort-import-suggestions": "^1.0.4",
"typescript": "npm:@typescript/typescript6@^6.0.2",
"typescript": "^6.0.3",
"webpack-bundle-analyzer": "^4.10.1"
},
"jest": {
-103
View File
@@ -1,103 +0,0 @@
diff --git a/build/Image.types.d.ts b/build/Image.types.d.ts
index 022ae487e65ae9d624f8a4be262b01944928f250..416504fe18ecd00fdc713faca23485fb292caf2c 100644
--- a/build/Image.types.d.ts
+++ b/build/Image.types.d.ts
@@ -152,6 +152,16 @@ export interface ImageProps extends Omit<ViewProps, 'style' | 'children'> {
* @default 'normal'
*/
priority?: 'low' | 'normal' | 'high' | null;
+ /**
+ * The loading behavior for the image. Maps to the native HTML `loading` attribute on web.
+ *
+ * - `'lazy'` - Defers loading until the image is near the viewport.
+ * - `'eager'` - Loads the image immediately.
+ *
+ * @default undefined
+ * @platform web
+ */
+ loading?: 'lazy' | 'eager' | null;
/**
* Determines whether to cache the image and where: on the disk, in the memory or both.
*
diff --git a/src/ExpoImage.web.tsx b/src/ExpoImage.web.tsx
index 2a49ff00649b374b86fa780653a4b0d6f13a4a57..1c3de93ef280bf6f3c27bed34c794b8ff59e3db3 100644
--- a/src/ExpoImage.web.tsx
+++ b/src/ExpoImage.web.tsx
@@ -70,6 +70,7 @@ export default function ExpoImage({
onLoadEnd,
onDisplay,
priority,
+ loading,
blurRadius,
recyclingKey,
style,
@@ -118,6 +119,7 @@ export default function ExpoImage({
accessibilityLabel={accessibilityLabel ?? alt}
cachePolicy={cachePolicy}
priority={priority}
+ loading={loading}
tintColor={tintColor}
/>
),
@@ -149,6 +151,7 @@ export default function ExpoImage({
className={className}
cachePolicy={cachePolicy}
priority={priority}
+ loading={loading}
contentPosition={selectedSource ? contentPosition : { top: '50%', left: '50%' }}
hashPlaceholderContentPosition={contentPosition}
hashPlaceholderStyle={imageHashStyle}
diff --git a/src/Image.types.ts b/src/Image.types.ts
index 9dec0e7aee61dfaa73a3cfa535d08259c9dad209..61c162114977dff35b633ac6b1f3d59e373bbbfe 100644
--- a/src/Image.types.ts
+++ b/src/Image.types.ts
@@ -178,6 +178,17 @@ export interface ImageProps extends Omit<ViewProps, 'style' | 'children'> {
*/
priority?: 'low' | 'normal' | 'high' | null;
+ /**
+ * The loading behavior for the image. Maps to the native HTML `loading` attribute on web.
+ *
+ * - `'lazy'` - Defers loading until the image is near the viewport.
+ * - `'eager'` - Loads the image immediately.
+ *
+ * @default undefined
+ * @platform web
+ */
+ loading?: 'lazy' | 'eager' | null;
+
/**
* Determines whether to cache the image and where: on the disk, in the memory or both.
*
diff --git a/src/web/ImageWrapper.tsx b/src/web/ImageWrapper.tsx
index e8f891d525892f8d3668e34cf96cefccfbfc49f6..89a5cb1e3a8574fc3bd1d0361895a610e3165dfb 100644
--- a/src/web/ImageWrapper.tsx
+++ b/src/web/ImageWrapper.tsx
@@ -30,6 +30,7 @@ const ImageWrapper = React.forwardRef(
contentPosition,
hashPlaceholderContentPosition,
priority,
+ loading,
style,
hashPlaceholderStyle,
tintColor,
@@ -82,6 +83,7 @@ const ImageWrapper = React.forwardRef(
// @ts-ignore
// eslint-disable-next-line react/no-unknown-property
fetchPriority={getFetchPriorityFromImagePriority(priority || 'normal')}
+ loading={loading || undefined}
{...getImageWrapperEventHandler(events, sourceWithHeaders)}
{...getImgPropsFromSource(source)}
{...props}
diff --git a/src/web/ImageWrapper.types.ts b/src/web/ImageWrapper.types.ts
index 19bbe2f15999124cda0ca7c81b3ebcf289f522f8..179837f803a3d315c85075895f4191631b37eda7 100644
--- a/src/web/ImageWrapper.types.ts
+++ b/src/web/ImageWrapper.types.ts
@@ -29,6 +29,7 @@ export type ImageWrapperProps = {
contentPosition?: ImageContentPositionObject;
hashPlaceholderContentPosition?: ImageContentPositionObject;
priority?: string | null;
+ loading?: 'lazy' | 'eager' | null;
style: CSSProperties;
tintColor?: string | null;
hashPlaceholderStyle?: CSSProperties;
-3
View File
@@ -1,3 +0,0 @@
## Expo Image
Patches in https://github.com/expo/expo/pull/41442
@@ -1,31 +0,0 @@
diff --git a/apple/RNGestureHandler.mm b/apple/RNGestureHandler.mm
index c4f760c41a9965245edcfa5e7cb781f8d2c7b66a..bf7d1fb092e22cbcedf787e606876e533879f810 100644
--- a/apple/RNGestureHandler.mm
+++ b/apple/RNGestureHandler.mm
@@ -470,15 +470,19 @@ + (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco
// We may try to extract "DummyGestureHandler" in case when "otherGestureRecognizer" belongs to
// a native view being wrapped with "NativeViewGestureHandler"
- RNGHUIView *reactView = recognizer.view;
- while (reactView != nil && reactView.reactTag == nil) {
- reactView = reactView.superview;
- }
+ RNGHUIView *view = recognizer.view;
+ while (view != nil) {
+ for (UIGestureRecognizer *candidateRecognizer in view.gestureRecognizers) {
+ if ([candidateRecognizer isKindOfClass:[RNDummyGestureRecognizer class]]) {
+ return candidateRecognizer.gestureHandler;
+ }
+ }
- for (UIGestureRecognizer *recognizer in reactView.gestureRecognizers) {
- if ([recognizer isKindOfClass:[RNDummyGestureRecognizer class]]) {
- return recognizer.gestureHandler;
+ if ([view isKindOfClass:[RCTViewComponentView class]]) {
+ return nil;
}
+
+ view = view.superview;
}
return nil;
@@ -1,5 +0,0 @@
# react-native-gesture-handler.patch
Updated `findGestureHandlerByRecognizer:` in `apple/RNGestureHandler.mm` to the version from RN GH 2.32.0
This fixes `UIContextMenuInteraction` from `ExpoBlueskyPeekMenuView.swift`. https://github.com/software-mansion/react-native-gesture-handler/commit/fba4dcc06d71dce08b10b2afc738a2af5b01e86a
@@ -1,28 +0,0 @@
diff --git a/src/index.js b/src/index.js
index fa76d7e1272e7fbe4bbd153104db127f1f6eecad..018b6860b7fa02d498d73b5fd06028bae99abedb 100644
--- a/src/index.js
+++ b/src/index.js
@@ -125,13 +125,17 @@ export function captureRef<T: React$ElementType>(
}
}
if (typeof view !== "number") {
- const node = findNodeHandle(view);
- if (!node) {
- return Promise.reject(
- new Error("findNodeHandle failed to resolve view=" + String(view))
- );
+ if (Platform.OS == 'web') {
+ view = view;
+ } else {
+ const node = findNodeHandle(view);
+ if (!node) {
+ return Promise.reject(
+ new Error("findNodeHandle failed to resolve view=" + String(view))
+ );
+ }
+ view = node;
}
- view = node;
}
const { options, errors } = validateOptions(optionsObject);
if (__DEV__ && errors.length > 0) {
@@ -1,3 +0,0 @@
## react-native-view-shot patch
Temporary patch for web, where `view`'s type has changed.
+6 -8
View File
@@ -22,21 +22,19 @@ allowBuilds:
patchedDependencies:
'@sentry/expo-upload-sourcemaps@8.18.0': patches/@sentry__expo-upload-sourcemaps@8.18.0.patch
'expo-age-range@0.2.18': patches/expo-age-range@0.2.18.patch
'expo-haptics@15.0.8': patches/expo-haptics@15.0.8.patch
'expo-image@3.0.11': patches/expo-image@3.0.11.patch
'expo-media-library@18.2.1': patches/expo-media-library@18.2.1.patch
'expo-haptics@57.0.1': patches/expo-haptics@57.0.1.patch
'expo-media-library@57.0.3': patches/expo-media-library@57.0.3.patch
'expo-modules-core@3.0.30': patches/expo-modules-core@3.0.30.patch
'expo-notifications@0.32.17': patches/expo-notifications@0.32.17.patch
'expo-updates@29.0.17': patches/expo-updates@29.0.17.patch
'expo-notifications@57.0.7': patches/expo-notifications@57.0.7.patch
'expo-updates@57.0.10': patches/expo-updates@57.0.10.patch
'react-native-compressor@1.13.0': patches/react-native-compressor@1.13.0.patch
'react-native-date-picker@5.0.13': patches/react-native-date-picker@5.0.13.patch
'react-native-drawer-layout@4.2.3': patches/react-native-drawer-layout@4.2.3.patch
'react-native-gesture-handler': patches/react-native-gesture-handler.patch
'react-native-keyboard-controller@1.21.8': patches/react-native-keyboard-controller@1.21.8.patch
'react-native-keyboard-controller@1.21.9': patches/react-native-keyboard-controller@1.21.9.patch
'react-native-pager-view@6.8.0': patches/react-native-pager-view@6.8.0.patch
'react-native-reanimated@4.3.2': patches/react-native-reanimated@4.3.2.patch
react-native-screens@4.24.0: patches/react-native-screens@4.24.0.patch
'react-native-svg@15.12.1': patches/react-native-svg@15.12.1.patch
'react-native-svg@15.15.4': patches/react-native-svg@15.15.4.patch
'react-native-view-shot@4.0.3': patches/react-native-view-shot@4.0.3.patch
react-native-worklets@0.8.3: patches/react-native-worklets@0.8.3.patch
'react-native@0.81.5': patches/react-native@0.81.5.patch