Skip to content

Conversation

@pull
Copy link

@pull pull bot commented Jan 21, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

jakex7 and others added 15 commits January 21, 2026 11:26
# Why

When `label` is a component it's displayed as a menu item as well. 

# How

If label is a component, it is passed as a child, so we need to exclude
it from menu content.
…other apps (#42242)

# Why

Adds a config plugin, which adds appropiate sharing target on iOS and
intent filters on Android.

# How

The plugin adds a `share-extension` target, which makes the app appear
in the system sharing bottom sheet. One a share is received the main app
is opened with a deeplink. Subsequent PRs include code for handling the
data.

On Android we just need to add some intent filters.

You can check out `ShareExtensionConfigPluginProps` for possible
configuration options of the plugin.

On iOS opening the main target from a sharing extension is unsupported
and generally discouraged, but possible with a hack (see
`template-files/ShareIntoViewController`). This is not guaranteed to
work in future iOS versions and is the main roadblock in marking these
changes as non-experimental. Based on other similar libraries and
information on the web I can pretty confidently say, that this hack will
not cause apps to be rejected from the App Store though.

There is some stuff, like data structures, that we'd like to share
between the extension target and the main-target. Such files are stored
in the `ios/shared` directory and are automatically linked with the
target during the prebuild.

Here is how a sample plugin configuration would look like in an app

```
      [
        "expo-sharing",
        {
          "ios": {
            "enabled": true,
            "activationRule": {
              "supportsText": 1,
              "supportsWebUrlWithMaxCount": 1,
              "supportsImageWithMaxCount": 2,
              "supportsMovieWithMaxCount": 3,
              "supportsFileWithMaxCount": 4,
              "supportsWebPageWithMaxCount": 5,
              "supportsAttachmentsWithMaxCount": 6
            }
          },
          "android": {
            "enabled": true,
            "singleShareMimeTypes": [
              "image/*",
              "application/*",
              "text/*",
              "video/*"
            ],
            "multipleShareMimeTypes": [
              "image/*",
              "application/*",
              "text/*",
              "video/*"
            ]
          }
        }
      ]
 ```
 
 iOS activation rule can also be a string 

# Test Plan

Tested on iOS and Android

Functionality demo:

https://github.com/user-attachments/assets/d2caa3b8-d861-4113-83a7-ca49281d59b7
…42356)

# Why

We should include an Android project for testing the brownfield
integrated approach

# How

Create a new Android project using Android studio to test and and
integrate react native using minimal tester as an aar

# Test Plan

Run it on Android
 



# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Adds native code changes to `expo-sharing` with functionality for
receiving and reading shared data

# How

Adds funcitons for reading shared data stored in UserDefaults by the
share-extension. There are two important methods in the API:

- `getSharedData` - Fetches raw data shared with the app, is synchronous
and doesn't require a network connection. Most of data resolving has to
be done by the user.
- `getResolvedSharedData` - Fetches the raw data and resolves it.
Includes content type, mimeType of the content etc. Especially useful
when an `url` was shared with the app. In case of urls fetches the
header of the content in order to determine what is the content type,
content uri etc. You can see it at the end of the demo video in this PR:
#42242.

`getResolvedSharedData` makes it super-easy to display the shared
content in libraries like `expo-image`, `expo-video`, `expo-audio`,
`expo-file-system`, the resolved `contentUri` can be dropped as a source
into any of those libraries (assuming correct content type)


# Test Plan

Tested in a separate test app on iOS Simulator and an iPhone 13. Tested
in iOS 26.2 and 17.5.
# Checklist
Co-authored-by: Tomasz Sapeta <tsapeta@expo.dev>
…kt` (#42025)

# Why

During pre-beta checkup I've found that we aren't exporting all types
into the docs. Also noticed a duplicated code block, which can be
removed.

# How

Update the exports, remove duplicated code.

# Test Plan

Tested in BareExpo on Android and ran the docs server locally.
# Why

In SDK 55, the router native tabs no longer export `Icon` and `Label`. 

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

Use the new API for router bottom tabs label and icon.


<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

- Create a new project using the latest canary
- Replace the contents of `src/components/app-tabs.native.tsx` with the
changes in this PR
- `npx expo run:ios`

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Adds native code changes to expo-sharing with functionality for
receiving and reading shared data

# How

Adds funcitons for reading shared data stored in UserDefaults by the
share-extension. There are two important methods in the API:

getSharedData - Fetches raw data shared with the app, is synchronous and
doesn't require a network connection. Most of data resolving has to be
done by the user.
getResolvedSharedData - Fetches the raw data and resolves it. Includes
content type, mimeType of the content etc. Especially useful when an url
was shared with the app. In case of urls fetches the header of the
content in order to determine what is the content type, content uri etc.
You can see it at the end of the demo video in this PR:
#42242.

`getResolvedSharedData` makes it super-easy to display the shared
content in libraries like expo-image, expo-video, expo-audio,
expo-file-system, the resolved contentUri can be dropped as a source
into any of those libraries (assuming correct content type)


# Test Plan

Tested in a separate test app on a Pixel 8 running Android 16
…` types (#42363)

# Why

The `ExpoRequest` and `ExpoResponse` types have been marked deprecated
since at least SDK 53 and it should be safe to remove them.

# How

Deleted the types from `expo-router/server`.

# Test Plan

- CI

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…endering (#42367)

# Why

Fixes a regression introduced in #42051
where SSR pages fail to render when a loader returns `undefined`.

#42051 changed `executeLoader()` to
return raw results instead of wrapping them in `{ data: ... }`. This
broke the check in `getHtml()`, which used to check `if (loaderResult)`.

# How

Changed the conditional from checking the result value to checking if
the route has a loader. Also ensured `null` values are preserved (not
converted to `{}`) while `undefined` is normalized to `{}`.

# Test Plan

- CI

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
@pull pull bot locked and limited conversation to collaborators Jan 21, 2026
@pull pull bot added the ⤵️ pull label Jan 21, 2026
@pull pull bot merged commit d6a5f3f into code:main Jan 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants