Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: New architecture support #4574

Merged
merged 13 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ jobs:
- run:
name: Install dependencies
command: |
yarn install --cwd example --frozen-lockfile
yarn install --cwd docs --frozen-lockfile
yarn install --frozen-lockfile
sudo corepack enable
yarn set version berry
Copy link
Member

@satya164 satya164 Dec 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI shouldn't call set version. It should be already set in the package.json. CI should use the same package manager everyone else would use when they run yarn directly in the project.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is, but currently circleCI image is used and they provide it with yarn1 only, so I had to do it that way to force usage of newer version. I'm thinking about updating the CI config and getting away from circleCI image that seem a bit deprecated

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BogiKay it will be automatically handled if setup like this https://github.com/callstack/react-native-paper/pull/4574/files#r1886705407

But also enabling corepack should already mean that it would use correct package manager from package.json and install it - so there shouldn't need to be an extra step for setting version.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extra step setting version explicitly removed. Thanks!

yarn --cwd example --frozen-lockfile
yarn --cwd docs --frozen-lockfile
yarn --frozen-lockfile
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--frozen-lockfile is for yarn 1, --immutable is for berry

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! Missed that due to backward compatibility. Updated

- save_cache:
key: dependencies-{{ checksum "package.json" }}
paths:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,6 @@ CHANGELOG.md
lib/

.expo

# Yarn
.yarn/*
1 change: 1 addition & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
3 changes: 3 additions & 0 deletions docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ docs/components
# legacy
dist/
.linaria-cache/

# Yarn
.yarn/*
25,445 changes: 14,826 additions & 10,619 deletions docs/yarn.lock

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion example/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
# XDE
#
.expo/
/coverage
/coverage

# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
6 changes: 2 additions & 4 deletions example/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ react {
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]

autolinkLibrariesWithApp()
}

// Override `hermesEnabled` by `expo.jsEngine`
Expand Down Expand Up @@ -221,9 +223,6 @@ dependencies {
}

implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")

implementation("com.facebook.react:flipper-integration")


if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
Expand All @@ -232,5 +231,4 @@ dependencies {
}
}

apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
applyNativeModulesAppBuildGradle(project)
1 change: 1 addition & 0 deletions example/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
android:allowBackup="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
android:supportsRtl="true"
>

<meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.react.flipper.ReactNativeFlipper;
import com.facebook.react.soloader.OpenSourceMergedSoMapping;
import com.facebook.soloader.SoLoader;

import expo.modules.ApplicationLifecycleDispatcher;
Expand Down Expand Up @@ -60,7 +60,7 @@ public ReactNativeHost getReactNativeHost() {
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
SoLoader.init(this, OpenSourceMergedSoMapping)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
Expand Down
8 changes: 4 additions & 4 deletions example/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

buildscript {
ext {
buildToolsVersion = findProperty('android.buildToolsVersion') ?: '34.0.0'
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21')
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '34')
buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0'
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24')
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35')
targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.8.0'

frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0'

// We use NDK 25 which has both M1 support and is the side-by-side NDK version from AGP.
ndkVersion = "25.1.8937393"
ndkVersion = "26.1.10909125"
}
repositories {
google()
Expand Down
2 changes: 1 addition & 1 deletion example/android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# your application. You should enable this flag either if you want
# to write custom TurboModules/Fabric components OR use libraries that
# are providing them.
newArchEnabled=false
newArchEnabled=true

# The hosted JavaScript engine
# Supported values: expo.jsEngine = "hermes" | "jsc"
Expand Down
5 changes: 2 additions & 3 deletions example/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"primaryColor": "#6200EE",
"userInterfaceStyle": "automatic",
"icon": "./assets/images/paper-icon.png",
"newArchEnabled": true,
"packagerOpts": {
"config": "./metro.config.js",
"projectRoots": ""
Expand Down Expand Up @@ -39,9 +40,7 @@
"projectId": "ba8f5139-58fe-48f0-b2f2-2d675b6eb2d4"
}
},
"runtimeVersion": {
"policy": "sdkVersion"
},
"runtimeVersion": "exposdk:52.0.0",
"updates": {
"url": "https://u.expo.dev/ba8f5139-58fe-48f0-b2f2-2d675b6eb2d4"
},
Expand Down
48 changes: 24 additions & 24 deletions example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,36 @@
"@expo/vector-icons": "^14.0.0",
"@expo/webpack-config": "~19.0.1",
"@pchmn/expo-material3-theme": "^1.3.2",
"@react-native-async-storage/async-storage": "1.21.0",
"@react-native-masked-view/masked-view": "0.3.0",
"@react-navigation/bottom-tabs": "^6.5.3",
"@react-navigation/drawer": "^6.5.7",
"@react-navigation/native": "^6.1.2",
"@react-navigation/stack": "^6.3.11",
"expo": "~50.0.20",
"expo-crypto": "~12.8.1",
"expo-dev-client": "~3.3.12",
"expo-font": "~11.10.3",
"expo-keep-awake": "~12.8.2",
"expo-splash-screen": "~0.26.5",
"expo-status-bar": "~1.11.1",
"expo-updates": "~0.24.13",
"@react-native-async-storage/async-storage": "1.23.1",
"@react-native-masked-view/masked-view": "0.3.2",
"@react-navigation/bottom-tabs": "^6.6.1",
"@react-navigation/drawer": "^6.7.2",
"@react-navigation/native": "^6.1.18",
"@react-navigation/stack": "^6.4.1",
"expo": "^52.0.0",
"expo-crypto": "~14.0.1",
"expo-dev-client": "~5.0.4",
"expo-font": "~13.0.1",
"expo-keep-awake": "~14.0.1",
"expo-splash-screen": "~0.29.13",
"expo-status-bar": "~2.0.0",
"expo-updates": "~0.26.9",
"file-loader": "^6.2.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-native": "0.73.6",
"react-native-gesture-handler": "~2.14.0",
"react-native-reanimated": "~3.6.2",
"react-native-safe-area-context": "4.8.2",
"react-native-screens": "~3.29.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"react-native": "0.76.3",
"react-native-gesture-handler": "~2.20.2",
"react-native-reanimated": "~3.16.1",
"react-native-safe-area-context": "4.12.0",
"react-native-screens": "~4.1.0",
"react-native-vector-icons": "^10.1.0",
"react-native-web": "~0.19.6",
"react-native-web": "~0.19.13",
"typeface-roboto": "^1.1.13"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@babel/core": "^7.25.2",
"babel-plugin-module-resolver": "^5.0.0",
"babel-preset-expo": "^10.0.0",
"babel-preset-expo": "~12.0.0",
"url-loader": "^4.1.1"
},
"engines": {
Expand Down
113 changes: 63 additions & 50 deletions example/src/RootNavigator.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { Platform } from 'react-native';
import { Platform, StyleSheet, View } from 'react-native';

import type { DrawerNavigationProp } from '@react-navigation/drawer';
import { getHeaderTitle } from '@react-navigation/elements';
Expand All @@ -19,55 +19,68 @@ export default function Root() {
? CardStyleInterpolators.forFadeFromBottomAndroid
: CardStyleInterpolators.forHorizontalIOS;
return (
<Stack.Navigator
screenOptions={({ navigation }) => {
return {
detachPreviousScreen: !navigation.isFocused(),
cardStyleInterpolator,
header: ({ navigation, route, options, back }) => {
const title = getHeaderTitle(options, route.name);
return (
<Appbar.Header elevated>
{back ? (
<Appbar.BackAction onPress={() => navigation.goBack()} />
) : (navigation as any).openDrawer ? (
<Appbar.Action
icon="menu"
isLeading
onPress={() =>
(
navigation as any as DrawerNavigationProp<{}>
).openDrawer()
}
/>
) : null}
<Appbar.Content title={title} />
</Appbar.Header>
);
},
};
}}
>
<Stack.Screen
name="ExampleList"
component={ExampleList}
options={{
title: 'Examples',
<View style={styles.stackWrapper}>
<Stack.Navigator
screenOptions={({ navigation }) => {
return {
detachPreviousScreen: !navigation.isFocused(),
cardStyleInterpolator,
header: ({ navigation, route, options, back }) => {
const title = getHeaderTitle(options, route.name);
return (
<Appbar.Header elevated>
{back ? (
<Appbar.BackAction onPress={() => navigation.goBack()} />
) : (navigation as any).openDrawer ? (
<Appbar.Action
icon="menu"
isLeading
onPress={() =>
(
navigation as any as DrawerNavigationProp<{}>
).openDrawer()
}
/>
) : null}
<Appbar.Content title={title} />
</Appbar.Header>
);
},
};
}}
/>
{(Object.keys(examples) as Array<keyof typeof examples>).map((id) => {
return (
<Stack.Screen
key={id}
name={id}
component={examples[id]}
options={{
title: examples[id].title,
headerShown: id !== 'themingWithReactNavigation',
}}
/>
);
})}
</Stack.Navigator>
>
<Stack.Screen
name="ExampleList"
component={ExampleList}
options={{
title: 'Examples',
}}
/>
{(Object.keys(examples) as Array<keyof typeof examples>).map((id) => {
return (
<Stack.Screen
key={id}
name={id}
component={examples[id]}
options={{
title: examples[id].title,
headerShown: id !== 'themingWithReactNavigation',
}}
/>
);
})}
</Stack.Navigator>
</View>
);
}

const styles = StyleSheet.create({
stackWrapper: {
flex: 1,
...Platform.select({
web: {
overflow: 'scroll',
},
}),
},
});
Comment on lines +77 to +86
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is React Navigation not working on Web? This shouldn't be needed

Copy link
Contributor Author

@BogiKay BogiKay Dec 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scrolling doesn't work without these changes. If I remember correctly it's caused by react-native-screens changes

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could've something to do with the styles in here that differ from default expo setup

https://github.com/callstack/react-native-paper/blob/main/example/public/index.html

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tried the default ones from expo and it didn't help. I investigated that in the past and the breaking change is somewhere within components provided by navigation stack

Loading
Loading