
Research
2025 Report: Destructive Malware in Open Source Packages
Destructive malware is rising across open source registries, using delays and kill switches to wipe code, break builds, and disrupt CI/CD.
react-native-safe-area-context
Advanced tools
A flexible way to handle safe area, also works on Android and web.
A flexible way to handle safe area, also works on Android and Web!
npm install react-native-safe-area-context
You then need to link the native parts of the library for the platforms you are using.
Linking the package is not required anymore with Autolinking.
iOS Platform:
$ npx pod-install
The easiest way to link the library is using the CLI tool by running this command from the root of your project:
react-native link react-native-safe-area-context
If you can't or don't want to use the CLI tool, you can also manually link the library using the instructions below (click on the arrow to show them):
Either follow the instructions in the React Native documentation to manually link the framework or link using Cocoapods by adding this to your Podfile:
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
Make the following changes:
android/settings.gradleinclude ':react-native-safe-area-context'
project(':react-native-safe-area-context').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-safe-area-context/android')
android/app/build.gradledependencies {
...
implementation project(':react-native-safe-area-context')
}
android/app/src/main/.../MainApplication.javaOn top, where imports are:
import com.th3rdwave.safeareacontext.SafeAreaContextPackage;
Add the SafeAreaContextPackage class to your list of exported packages.
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MainReactPackage(),
...
new SafeAreaContextPackage()
);
}
Note Before 3.1.9 release of safe-area-context, Building for React Native 0.59 would not work due to missing header files. Use >= 3.1.9 to work around that.
This library has 2 important concepts, if you are familiar with React Context this is very similar.
The SafeAreaProvider component is a View from where insets provided by Consumers are relative to. This means that if this view overlaps with any system elements (status bar, notches, etc.) these values will be provided to descendent consumers. Usually you will have one provider at the top of your app.
Consumers are components and hooks that allow using inset values provided by the nearest parent Provider. Values are always relative to a provider and not to these components.
SafeAreaView is the preferred way to consume insets. This is a regular View with insets applied as extra padding or margin. It offers better performance by applying insets natively and avoids flickers that can happen with the other JS based consumers.
useSafeAreaInsets offers more flexibility, but can cause some layout flicker in certain cases. Use this if you need more control over how insets are applied.
You should add SafeAreaProvider in your app root component. You may need to add it in other places like the root of modals and routes when using react-native-screens.
Note that providers should not be inside a View that is animated with Animated or inside a ScrollView since it can cause very frequent updates.
import { SafeAreaProvider } from 'react-native-safe-area-context';
function App() {
return <SafeAreaProvider>...</SafeAreaProvider>;
}
Accepts all View props. Has a default style of {flex: 1}.
initialMetricsOptional, defaults to null.
Can be used to provide the initial value for frame and insets, this allows rendering immediatly. See optimization for more information on how to use this prop.
SafeAreaView is a regular View component with the safe area insets applied as padding or margin.
Padding or margin styles are added to the insets, for example style={{paddingTop: 10}} on a SafeAreaView that has insets of 20 will result in a top padding of 30.
import { SafeAreaView } from 'react-native-safe-area-context';
function SomeComponent() {
return (
<SafeAreaView style={{ flex: 1, backgroundColor: 'red' }}>
<View style={{ flex: 1, backgroundColor: 'blue' }} />
</SafeAreaView>
);
}
Accepts all View props.
edgesOptional, array of top, right, bottom, and left. Defaults to all.
Sets the edges to apply the safe area insets to.
For example if you don't want insets to apply to the top edge because the view does not touch the top of the screen you can use:
<SafeAreaView edges={['right', 'bottom', 'left']} />
modeOptional, padding (default) or margin.
Apply the safe area to either the padding or the margin.
This can be useful for example to create a safe area aware separator component:
<SafeAreaView mode="margin" style={{ height: 1, backgroundColor: '#eee' }} />
Returns the safe area insets of the nearest provider. This allows manipulating the inset values from JavaScript. Note that insets are not updated synchronously so it might cause a slight delay for example when rotating the screen.
Object with { top: number, right: number, bottom: number, left: number }.
import { useSafeAreaInsets } from 'react-native-safe-area-context';
function HookComponent() {
const insets = useSafeAreaInsets();
return <View style={{ paddingBottom: Math.max(insets.bottom, 16) }} />;
}
Returns the frame of the nearest provider. This can be used as an alternative to the Dimensions module.
Object with { x: number, y: number, width: number, height: number }
SafeAreaInsetsContextReact Context with the value of the safe area insets.
Can be used with class components:
import { SafeAreaInsetsContext } from 'react-native-safe-area-context';
class ClassComponent extends React.Component {
render() {
return (
<SafeAreaInsetsContext.Consumer>
{(insets) => <View style={{ paddingTop: insets.top }} />}
</SafeAreaInsetsContext.Consumer>
);
}
}
withSafeAreaInsetsHigher order component that provides safe area insets as the insets prop.
SafeAreaFrameContextReact Context with the value of the safe area frame.
initialWindowMetricsInsets and frame of the window on initial render. This can be used with the initialMetrics from SafeAreaProvider. See optimization for more information.
Object with:
{
frame: { x: number, y: number, width: number, height: number },
insets: { top: number, left: number, right: number, bottom: number },
}
NOTE: This value can be null or out of date as it is computed when the native module is created.
Use useSafeAreaInsets instead.
Use SafeAreaInsetsContext.Consumer instead.
Use SafeAreaInsetsContext instead.
Use initialWindowMetrics instead.
If you are doing server side rendering on the web you can use initialMetrics to inject insets and frame value based on the device the user has, or simply pass zero values. Since insets measurement is async it will break rendering your page content otherwise.
If you can, use SafeAreaView. It's implemented natively so when rotating the device, there is no delay from the asynchronous bridge.
To speed up the initial render, you can import initialWindowMetrics from this package and set as the initialMetrics prop on the provider as described in Web SSR. You cannot do this if your provider remounts, or you are using react-native-navigation.
import {
SafeAreaProvider,
initialWindowMetrics,
} from 'react-native-safe-area-context';
function App() {
return (
<SafeAreaProvider initialMetrics={initialWindowMetrics}>
...
</SafeAreaProvider>
);
}
This library includes a built in mock for Jest. It will use the following metrics by default:
{
frame: {
width: 320,
height: 640,
x: 0,
y: 0,
},
insets: {
left: 0,
right: 0,
bottom: 0,
top: 0,
},
}
To use it, add the following code to the jest setup file:
import mockSafeAreaContext from 'react-native-safe-area-context/jest/mock';
jest.mock('react-native-safe-area-context', () => mockSafeAreaContext);
To have more control over the test values it is also possible to pass initialMetrics to
SafeAreaProvider to provide mock data for frame and insets.
export function TestSafeAreaProvider({ children }) {
return (
<SafeAreaProvider
initialMetrics={{
frame: { x: 0, y: 0, width: 0, height: 0 },
insets: { top: 0, left: 0, right: 0, bottom: 0 },
}}
>
{children}
</SafeAreaProvider>
);
}
See the Contributing Guide
The react-native-safe-area-view package provides a similar functionality to react-native-safe-area-context by offering a SafeAreaView component that applies safe area insets to its children. However, it does not provide hooks like useSafeAreaInsets and is generally considered less flexible.
The react-native-safe-area package offers utilities to handle safe area insets, but it is less comprehensive compared to react-native-safe-area-context. It primarily focuses on providing a SafeAreaView component and lacks the context and hooks provided by react-native-safe-area-context.
FAQs
A flexible way to handle safe area, also works on Android and web.
The npm package react-native-safe-area-context receives a total of 1,919,415 weekly downloads. As such, react-native-safe-area-context popularity was classified as popular.
We found that react-native-safe-area-context demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
Destructive malware is rising across open source registries, using delays and kill switches to wipe code, break builds, and disrupt CI/CD.

Security News
Socket CTO Ahmad Nassri shares practical AI coding techniques, tools, and team workflows, plus what still feels noisy and why shipping remains human-led.

Research
/Security News
A five-month operation turned 27 npm packages into durable hosting for browser-run lures that mimic document-sharing portals and Microsoft sign-in, targeting 25 organizations across manufacturing, industrial automation, plastics, and healthcare for credential theft.