Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
4 changes: 2 additions & 2 deletions .github/codemention.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ rules:
- patterns: ['packages/expo-constants/**']
mentions: ['wschurman', 'brentvatne']
- patterns: ['packages/expo-contacts/**']
mentions: ['EvanBacon']
mentions: ['Wenszel']
- patterns: ['packages/expo-crypto/**']
mentions: ['EvanBacon', 'barthap']
- patterns: ['packages/expo-dev-client/**']
Expand Down Expand Up @@ -147,7 +147,7 @@ rules:
- patterns: ['packages/expo-manifests/**']
mentions: ['wschurman']
- patterns: ['packages/expo-media-library/**']
mentions: ['behenate', 'alanjhughes']
mentions: ['Wenszel', 'alanjhughes']
- patterns: ['packages/expo-mesh-gradient/**']
mentions: ['jakex7']
- patterns: ['packages/expo-module-scripts/**']
Expand Down
53 changes: 53 additions & 0 deletions .github/workflows/brownfield.yml
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,51 @@ jobs:
with:
bundler-cache: true
ruby-version: 3.2.2
- name: 🔄 Setup ccache
run: |
brew install ccache

# In order to use ccache with Xcode, unlike on Android, we can't just change env variables - we need to change PATH.
MKDIR_PATH=$HOME/.ccache_bin
mkdir -p $MKDIR_PATH
ln -sf $(which ccache) $MKDIR_PATH/clang
ln -sf $(which ccache) $MKDIR_PATH/clang++
ln -sf $(which ccache) $MKDIR_PATH/cc
ln -sf $(which ccache) $MKDIR_PATH/c++
echo "$MKDIR_PATH" >> $GITHUB_PATH
echo "CC=$MKDIR_PATH/clang" >> $GITHUB_ENV
echo "CXX=$MKDIR_PATH/clang++" >> $GITHUB_ENV
echo "LD=$MKDIR_PATH/clang++" >> $GITHUB_ENV
echo "LDPLUSPLUS=$MKDIR_PATH/clang++" >> $GITHUB_ENV

# By default ccache includes mtime of a compiler in hashes, for each CI run mtime varies.
echo "CCACHE_COMPILERCHECK=content" >> $GITHUB_ENV

# It must be the same as in .github/actions/expo-caches/action.yml
echo "CCACHE_DIR=${{ runner.temp }}/.ccache" >> $GITHUB_ENV

# Sloppiness options disable some of the ccache checks to increase hit rate.
# We exclude ctime and mtime so the cache is hit based on file content.
# time_macros might help if in included modules there are macros like __TIME__ which would trigger a cache miss.
# modules, clang_index_store, system_headers, and ivfsoverlay are Xcode-specific options.
echo "CCACHE_SLOPPINESS=include_file_mtime,include_file_ctime,time_macros,modules,clang_index_store,system_headers,ivfsoverlay" >> $GITHUB_ENV

# Speeds up the process on cache misses by skipping the preprocessing step.
echo "CCACHE_DEPEND=true" >> $GITHUB_ENV

# Speeds up copying files on cache hits; natively supported by macOS APFS.
echo "CCACHE_FILECLONE=true" >> $GITHUB_ENV
- name: ♻️ Restore ccache
id: ccache-restore
uses: actions/cache/restore@v4
with:
path: ${{ runner.temp }}/.ccache
key: ccache-ios-brownfield-${{ hashFiles('yarn.lock', '**/Podfile.lock') }}-${{ github.sha }}
restore-keys: |
ccache-ios-brownfield-${{ hashFiles('yarn.lock', '**/Podfile.lock') }}-
ccache-ios-brownfield-
- name: 🔄 Reset ccache statistics
run: ccache -z
- name: ♻️ Restore caches
uses: ./.github/actions/expo-caches
id: expo-caches
Expand All @@ -310,6 +355,14 @@ jobs:
- name: 🍏 Build iOS artifacts (Debug)
run: npx expo-brownfield build:ios --debug --verbose
working-directory: apps/brownfield-tester/expo-app
- name: 💾 Save ccache
if: always()
uses: actions/cache/save@v4
with:
path: ${{ runner.temp }}/.ccache
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
- name: Show ccache stats
run: ccache -s -v
- name: 🔔 Notify on Slack
uses: ./.github/actions/slack-notify
if: failure() && (github.event.ref == 'refs/heads/main' || startsWith(github.event.ref, 'refs/heads/sdk-'))
Expand Down
14 changes: 7 additions & 7 deletions apps/bare-expo/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2947,7 +2947,7 @@ PODS:
- ReactNativeDependencies
- RNWorklets
- Yoga
- RNScreens (4.23.0):
- RNScreens (4.24.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -2969,9 +2969,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNScreens/common (= 4.23.0)
- RNScreens/common (= 4.24.0)
- Yoga
- RNScreens/common (4.23.0):
- RNScreens/common (4.24.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand Down Expand Up @@ -3885,7 +3885,7 @@ SPEC CHECKSUMS:
EXUpdates: bb7f327834c1663bb138a44e4b9e03b1c4acd657
EXUpdatesInterface: 29d3993072380e2d91188335ffef666bb2bfd650
FBLazyVector: 32e9ed0301d0fcbc1b2b341dd7fcbf291f51eb83
hermes-engine: 1566042511e927d64254f2efe08ae744a5eb9a00
hermes-engine: 32f15eb56763138f43fea0c89fe160318f47f5b5
libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7
libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
Expand All @@ -3903,7 +3903,7 @@ SPEC CHECKSUMS:
React: f4edc7518ccb0b54a6f580d89dd91471844b4990
React-callinvoker: 79ef4e3f1c021571f6d2dafbe45ca432b2f3a146
React-Core: 469995a2b6ef0ffff38ed123ccd202287703939e
React-Core-prebuilt: e71199b350bcaeade83eea6e463e818dcc46d718
React-Core-prebuilt: 3ad7030e5e3f741d62bbfc5c8cf9eabb96310a10
React-CoreModules: db3b65cb984dfc7e0b00db517712cff8d938fc3f
React-cxxreact: 8551bebcc6bc624ce774dccae20c383844aa9d06
React-debug: 4f6739c820d7da9c20f48caa985573b6a847e5f5
Expand Down Expand Up @@ -3973,14 +3973,14 @@ SPEC CHECKSUMS:
ReactAppDependencyProvider: 1976cdf5076a7e34718a56ead2f2069c7f54ebe9
ReactCodegen: 4e2863f450e4aec6b66a7e91d41a209aa4601c97
ReactCommon: 696163beb1630cf1f7590dbc8bfc542e40bdbe76
ReactNativeDependencies: d804b447c01215d21137868e3b5b5a920fc9f7f4
ReactNativeDependencies: fc06a98e1cc602a110da5a24971e0fce1ddece5e
RNCAsyncStorage: e85a99325df9eb0191a6ee2b2a842644c7eb29f4
RNCMaskedView: 3c9d7586e2b9bbab573591dcb823918bc4668005
RNCPicker: e0149590451d5eae242cf686014a6f6d808f93c7
RNDateTimePicker: 5e0666de98f1edfac67ee7dde6be8a5415e487a0
RNGestureHandler: 8e4a9372425d4caa9e3da5072a8dda7a54ed1097
RNReanimated: 61462806110686a6f5d7c45c6f910cf73cd57dd9
RNScreens: fb11b7412bcbdc0ffafcaf9174938d998d4e2bc4
RNScreens: 088d923c4327c63c9f8c942cae17a9d038f47d97
RNSVG: b5bd4454de003a99d3130a3c6a1b1c949c89d37d
RNWorklets: 87faff8e75d34d1240c75189e490e92901dd3544
SDWebImage: f29024626962457f3470184232766516dee8dfea
Expand Down
2 changes: 1 addition & 1 deletion apps/bare-expo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
"react-native-reanimated": "4.2.1",
"react-native-safe-area-context": "5.6.2",
"react-native-svg": "15.15.3",
"react-native-screens": "4.23.0",
"react-native-screens": "4.24.0",
"react-native-view-shot": "4.0.3",
"react-native-webview": "13.16.0",
"react-native-worklets": "0.7.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/brownfield-tester/expo-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"react-native-worklets": "0.7.2",
"react-native-reanimated": "~4.2.1",
"react-native-safe-area-context": "~5.6.2",
"react-native-screens": "~4.23.0",
"react-native-screens": "~4.24.0",
"react-native-web": "~0.21.0"
},
"devDependencies": {
Expand Down
10 changes: 5 additions & 5 deletions apps/expo-go/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3732,7 +3732,7 @@ PODS:
- RNWorklets
- SocketRocket
- Yoga
- RNScreens (4.23.0):
- RNScreens (4.24.0):
- boost
- DoubleConversion
- fast_float
Expand All @@ -3759,10 +3759,10 @@ PODS:
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- RNScreens/common (= 4.23.0)
- RNScreens/common (= 4.24.0)
- SocketRocket
- Yoga
- RNScreens/common (4.23.0):
- RNScreens/common (4.24.0):
- boost
- DoubleConversion
- fast_float
Expand Down Expand Up @@ -4759,7 +4759,7 @@ SPEC CHECKSUMS:
GoogleAppMeasurement: 8a82b93a6400c8e6551c0bcd66a9177f2e067aed
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
hermes-engine: d59202edb9173c808259b0945bb161d1e24963f0
hermes-engine: 4fd957b81383719d07171a90988b689b845cb9c5
libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7
libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
Expand Down Expand Up @@ -4857,7 +4857,7 @@ SPEC CHECKSUMS:
RNDateTimePicker: e9e210197c267461f70f3f47bec705401ff72077
RNGestureHandler: 77eecab5fd636666ca73a55bb61e2f1a685b7e84
RNReanimated: 31da8d5f1605f5367e2392748ba9f4ba6eaf1178
RNScreens: ec8bdc9f024d5828e5adf4f5e8870d5260cff616
RNScreens: 7179cc1ba31b4e18ed29f10abf20c24a7961cf4c
RNSVG: 8744ec9d5c0ca0f51cdd7a577c30ce01cd3d76b0
RNWorklets: 8e934a6b6d5a2710b9250e63a18a2d2f8b875a18
SDWebImage: f29024626962457f3470184232766516dee8dfea
Expand Down
2 changes: 1 addition & 1 deletion apps/expo-go/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
"react-native-reanimated": "4.2.1",
"react-native-safe-area-context": "5.6.2",
"react-native-svg": "15.15.3",
"react-native-screens": "4.23.0",
"react-native-screens": "4.24.0",
"react-native-view-shot": "4.0.3",
"react-native-webview": "13.16.0",
"react-native-worklets": "0.7.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/native-component-list/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@
"react-native-reanimated": "4.2.1",
"react-native-safe-area-context": "5.6.2",
"react-native-svg": "15.15.3",
"react-native-screens": "4.23.0",
"react-native-screens": "4.24.0",
"react-native-view-shot": "4.0.3",
"react-native-web": "~0.21.0",
"react-native-webview": "13.16.0",
Expand Down
108 changes: 2 additions & 106 deletions apps/native-component-list/src/screens/NavigationBarScreen.tsx
Original file line number Diff line number Diff line change
@@ -1,41 +1,9 @@
import * as NavigationBar from 'expo-navigation-bar';
import * as React from 'react';
import { Platform, ScrollView, Text } from 'react-native';
import { useSafeAreaFrame, useSafeAreaInsets } from 'react-native-safe-area-context';

import Button from '../components/Button';
import { Page, Section } from '../components/Page';
import { getRandomColor } from '../utilities/getRandomColor';

function usePosition(): [
NavigationBar.NavigationBarPosition | null,
(position: NavigationBar.NavigationBarPosition) => void,
] {
const [position, setPosition] = React.useState<NavigationBar.NavigationBarPosition | null>(null);

React.useEffect(() => {
let isMounted = true;
NavigationBar.unstable_getPositionAsync().then((position) => {
if (isMounted) {
setPosition(position);
}
});

return () => {
isMounted = false;
};
}, []);

const setNewPosition = React.useCallback(
(position: NavigationBar.NavigationBarPosition) => {
NavigationBar.setPositionAsync(position);
setPosition(position);
},
[setPosition]
);

return [position, setNewPosition];
}

export default function NavigationBarScreen() {
return (
Expand All @@ -50,18 +18,6 @@ export default function NavigationBarScreen() {
<Section title="Appearance">
<ButtonStyleExample />
</Section>
<Section title="Background Color">
<BackgroundColorExample />
</Section>
<Section title="Border Color">
<BorderColorExample />
</Section>
<Section title="Position">
<PositionExample />
</Section>
<Section title="Behavior">
<BehaviorExample />
</Section>
</Page>
</ScrollView>
);
Expand All @@ -84,76 +40,16 @@ function VisibilityExample() {
);
}

function BackgroundColorExample() {
return (
<Button
onPress={() => NavigationBar.setBackgroundColorAsync(getRandomColor())}
title="Set background color to random color"
/>
);
}

function BorderColorExample() {
return (
<Button
onPress={() => NavigationBar.setBorderColorAsync(getRandomColor())}
title="Set border color to random color"
/>
);
}

function ButtonStyleExample() {
const [style, setStyle] = React.useState<NavigationBar.NavigationBarButtonStyle>('light');
const [style, setStyle] = React.useState<NavigationBar.NavigationBarStyle>('light');
const nextStyle = style === 'light' ? 'dark' : 'light';
return (
<Button
onPress={() => {
NavigationBar.setButtonStyleAsync(nextStyle);
NavigationBar.setStyle(nextStyle);
setStyle(nextStyle);
}}
title={`Toggle bar style: ${nextStyle}`}
/>
);
}

const NavigationBarBehaviors: NavigationBar.NavigationBarBehavior[] = [
'inset-swipe',
'inset-touch',
'overlay-swipe',
];

function PositionExample() {
const [position, setPosition] = usePosition();

const insets = useSafeAreaInsets();
const frame = useSafeAreaFrame();

return (
<>
<Button
onPress={() => setPosition(position === 'absolute' ? 'relative' : 'absolute')}
title={`Position: ${position === 'absolute' ? 'relative' : 'absolute'}`}
/>
<Text>insets: {JSON.stringify(insets)}</Text>
<Text>frame: {JSON.stringify(frame)}</Text>
</>
);
}

function BehaviorExample() {
const [behavior, setBehavior] =
React.useState<NavigationBar.NavigationBarBehavior>('inset-swipe');

const nextNavigationBarBehavior = React.useMemo(() => {
const index = NavigationBarBehaviors.indexOf(behavior);
const newIndex = (index + 1) % NavigationBarBehaviors.length;
return NavigationBarBehaviors[newIndex];
}, [behavior]);

const onPressBehavior = React.useCallback(() => {
NavigationBar.setBehaviorAsync(nextNavigationBarBehavior);
setBehavior(nextNavigationBarBehavior);
}, [nextNavigationBarBehavior]);

return <Button onPress={onPressBehavior} title={`Behavior: ${nextNavigationBarBehavior}`} />;
}
2 changes: 1 addition & 1 deletion apps/notification-tester/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"react": "19.2.0",
"react-native": "0.83.2",
"react-native-safe-area-context": "5.6.2",
"react-native-screens": "4.23.0"
"react-native-screens": "4.24.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
Expand Down
2 changes: 1 addition & 1 deletion apps/router-e2e/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
"react": "19.2.0",
"react-native": "0.83.2",
"react-native-safe-area-context": "5.6.2",
"react-native-screens": "4.23.0",
"react-native-screens": "4.24.0",
"react-native-webview": "13.16.0"
},
"devDependencies": {
Expand Down
1 change: 1 addition & 0 deletions docs/.vale/writing-styles/expo-docs/HeadingCase.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ exceptions:
- '.*macOS.*'
- '.*manifest\.json.*'
- '.*metro\.config\.js.*'
- '.*Maven.*'
- '.*Netlify.*'
- '.*Node\.js.*'
- '.*Node Package Managers.*'
Expand Down
3 changes: 2 additions & 1 deletion docs/common/client-redirects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,8 @@ const RENAMED_PAGES: Record<string, string> = {
'/regulatory-compliance/privacy-shield/': '/regulatory-compliance/data-and-privacy-protection/',

// After changing brownfield docs
'/brownfield/installing-expo-modules/': '/brownfield/get-started/',
'/brownfield/installing-expo-modules/': '/brownfield/overview/',
'/brownfield/get-started/': '/brownfield/isolated-approach/',

// After removing Navigation section from Home and adding a Navigation page
'/develop/file-based-routing/': '/develop/app-navigation/',
Expand Down
Loading
Loading