react-native-paper icon indicating copy to clipboard operation
react-native-paper copied to clipboard

Icons not showing after upgrading to Expo SDK 50

Open benjaminkomen opened this issue 5 months ago • 27 comments

Current behaviour

After upgrading to Expo SDK 50, icons are not showing in Storybook (using react-native-web). Instead of icons it falls back to this unicode square and the related warning is displayed in the console.

The reason seems to be the change in babel-preset-expo, as lined out by expo in their release notes. It seems that react-native-paper uses react-native-vector-icons, but they are not aliased anymore.

Expected behaviour

Material Icons used in react-native-paper components are displayed correctly with react-native-web using Expo SDK 50.

How to reproduce?

  • Upgrade to Expo SDK 50
  • View your react-native-paper component on the web (using react-native-web)

Preview

Before

Screenshot 2024-01-23 at 12 55 37 PM

After

Screenshot 2024-01-23 at 12 56 44 PM

What have you tried so far?

  • Adding react-native-vector-icons as a dependency does not solve the problem.
  • The issue is fixed by adding the following to babel.config.js:
plugins: [
      [
        'babel-plugin-module-resolver', {
        alias: {
          'react-native-vector-icons': '@expo/vector-icons',
        },
      }],
    ],

but ideally this would be fixed in a better way.

Your Environment

software version
ios 17.2
android 14
react-native 0.73.2
react-native-paper 5.12.2
node 18.18.0
npm or yarn v1.22.21
expo sdk 50.0.2

benjaminkomen avatar Jan 23 '24 21:01 benjaminkomen

Thank you for creating the issue. I experience the same with import Ionicons from "@expo/vector-icons/Ionicons"; and iOS. Icons just gone, I don't see any squares even. The suggested fix did not work for me, so I had to revert to @49.

PavelPolyakov avatar Jan 24 '24 08:01 PavelPolyakov

Team, We are also facing same issue in React Native using Vector icons. The suggested fix did not work for us. could you please help us?

velusoft avatar Jan 25 '24 07:01 velusoft

Same issue here

Eliost avatar Jan 26 '24 11:01 Eliost

Experiencing the same issue

mattThousand avatar Jan 26 '24 19:01 mattThousand

I also had issue but it was solved by setting containerColor="transparent on the IconButton component. I have only tried web.

mathias-berg avatar Jan 28 '24 22:01 mathias-berg

same here.

karimessouabni avatar Feb 10 '24 22:02 karimessouabni

Same issue here, any fix?... I had to revert to SDK 49.

simonmaquilon avatar Feb 13 '24 22:02 simonmaquilon

Is this only on web everyone is experiencing this? or ios/android too?

WillSmithTE avatar Feb 15 '24 19:02 WillSmithTE

I'm experiencing this on iOS too.

mazshakibaii avatar Feb 19 '24 00:02 mazshakibaii

I'm experiencing this on Web too since updating to expo 50

FloKla avatar Feb 19 '24 14:02 FloKla

i am experiencing on android..

AnjanaDhakal avatar Mar 12 '24 17:03 AnjanaDhakal

We just upgraded our app from Expo 49 to Expo 50, encountered this issue on web, but the tempfix proposed by @benjaminkomen did work 👍 (if relevant, we are using Material Theme version 2)

willstepp avatar Mar 14 '24 21:03 willstepp

@benjaminkomen thanks for the clue.. I slightly changed your code and it works!! For those having similar issue edit your babel.congif.js file as this one:

module.exports = function (api) {
  api.cache(true)
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      'nativewind/babel',
      'react-native-reanimated/plugin',
      'transform-inline-environment-variables',
      [
        'module-resolver',
        {
          alias: {
            '@': './src',
            'react-native-vector-icons': '@expo/vector-icons',
          },
        },
      ],
    ],
    env: {
      production: {
        plugins: ['react-native-paper/babel'],
      },
    },
  }
}

drcodemonster avatar Mar 16 '24 00:03 drcodemonster

I'm experiencing this problem with all the react-native-paper components, when I generate my iOS build with the EAS CLI all the icons are a square in place, I've tried the solutions presented above and nothing has worked, has anyone found another solution?

pedrolmsin avatar Mar 19 '24 14:03 pedrolmsin

For those who are experiencing the same issue, my icons didn't appear when I used EAS to generate my iOS build, I had to change api.cache(true) to api.cache(false), then the icons started to appear in the iOS build, my babel.conf was as follows:

module.exports = function(api) { api.cache(false); return { presets: ['babel-preset-expo'], plugins: [ [ 'babel-plugin-module-resolver', { alias: { 'react-native-vector-icons': '@expo/vector-icons', }, } ], ], env: { production: { plugins: ['react-native-paper/babel'], }, }, }; };

pedrolmsin avatar Mar 20 '24 01:03 pedrolmsin

any update on this?

kevinstevanus avatar Apr 07 '24 05:04 kevinstevanus

babel-plugin-module-resolver does not work for me and I still can not upgrade to v50. In addition, when I open the screen with icons I see the next warning.

I'm confused. This issue has some regular upvotes, but it does seem that for the majority of people icons are working. How is our case different then? 🤔

Screenshot 2024-04-08 at 19 01 08

PavelPolyakov avatar Apr 08 '24 17:04 PavelPolyakov

I did another test — created a clean app with npx create-expo-app StickerSmash and there icons were doing fine ✅

Which made me think that this bug is only present for those who upgrades.

This is what helped me at the end:

rm package-lock.json
rm bun.lockb
rm -rf node_modules
npm i 
bun i

Icons are there — back in place 🥳

PavelPolyakov avatar Apr 09 '24 18:04 PavelPolyakov

Any updates?

I tried removing package-lock, and added the mentioned fix in babel.config.js. nothing works in iOS. Icons are visible on android.

upgrading from SDK 49 to 50, followed by expo install --fix

Victor-Varghese avatar Apr 12 '24 06:04 Victor-Varghese

Has anyone managed to get a working workaround after upgrading to v50? I see icons in iOs but nothing in Android

butri71 avatar May 09 '24 10:05 butri71

UPDATE

I started the upgrade process from scratch and it worked. Icons was working on ios and android without any workarounds.

Link: https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/

npm install expo@latest
npx expo install --fix

Related: https://github.com/expo/expo/issues/27602

Victor-Varghese avatar May 09 '24 11:05 Victor-Varghese

Any updates?

I tried removing package-lock, and added the mentioned fix in babel.config.js. nothing works in iOS. Icons are visible on android.

upgrading from SDK 49 to 50, followed by expo install --fix

Unfortunately Expo 51 (current latest) requires moving away from React Navigation in favor of Expo Router in order to support web apps, which is quite a big architectural change. It would be ideal if this fix could work on Expo 50 as well, or if there could be a way to still use Expo 51 with React Navigation.

JPStrydom avatar May 09 '24 12:05 JPStrydom

@JPStrydom expo router under the hood uses react-navigation, make sure you guys clear the cache after the upgrade process

https://stackoverflow.com/a/72332470/5519872

raajnadar avatar May 09 '24 12:05 raajnadar

Any updates? I tried removing package-lock, and added the mentioned fix in babel.config.js. nothing works in iOS. Icons are visible on android. upgrading from SDK 49 to 50, followed by expo install --fix

Unfortunately Expo 51 (current latest) requires moving away from React Navigation in favor of Expo Router in order to support web apps, which is quite a big architectural change. It would be ideal if this fix could work on Expo 50 as well, or if there could be a way to still use Expo 51 with React Navigation.

@JPStrydom it worked for me in SDK 50 not 51

Victor-Varghese avatar May 09 '24 12:05 Victor-Varghese

We build without cache in our pipelines and still had the same issues with icons on web. At least the babel plugin fix works for us as an interim solution:

module.exports = api => {
  api.cache(true);
  return {
    env: { production: { plugins: ['react-native-paper/babel'] } },
    plugins: [
      ['module:react-native-dotenv', { moduleName: '@env' }],
      [
        // TODO: [Expo 50] Once the web icon issue on RNP has been fixed, this alias override can be removed and babel-plugin-module-resolver can be uninstalled (https://github.com/callstack/react-native-paper/issues/4295)
        'babel-plugin-module-resolver',
        { alias: { 'react-native-vector-icons': '@expo/vector-icons' } }
      ]
    ],
    presets: ['babel-preset-expo']
  };
};

I understand that expo-router uses react-navigation under the hood, but, as far as I understand, one cannot build for web using the Metro bundler (as opposed to the old @expo/webpack-config bundler) without using Expo router.

Is this understanding correct, or can one build for web with Metro without migrating to expo-router?

JPStrydom avatar May 09 '24 12:05 JPStrydom