React Native Edge-to-Edge Installation Detector
`react-native-is-edge-to-edge` is a specialized, lightweight utility package designed for React Native library authors. Its primary function is to programmatically detect the presence and activation of the `react-native-edge-to-edge` package within an application's environment. This detection capability allows third-party libraries (e.g., UI components, animation libraries) to dynamically adapt their behavior concerning system bar translucency (status and navigation bars), preventing potential visual glitches or redundant configuration efforts when `react-native-edge-to-edge` is in use. The current stable version of this detector package is 1.3.1, and its development cadence is directly tied to the needs of the broader `react-native-edge-to-edge` ecosystem it supports. It differentiates itself by offering a simple, explicit check for the main edge-to-edge library, acting as an interoperability layer rather than providing the edge-to-edge functionality itself. The package ships with TypeScript types, facilitating safer integration into TypeScript-based projects.
Common errors
-
Console warning: 'statusBarTranslucent' or 'navigationBarTranslucent' is defined but react-native-edge-to-edge is active.
cause A third-party library or an application component is explicitly setting system bar translucency properties while `react-native-edge-to-edge` is already managing these behaviors, potentially leading to redundant or conflicting configurations.fixIf you are a library user, check your component props and remove explicit `statusBarTranslucent` or `navigationBarTranslucent` settings if `react-native-edge-to-edge` is intended to control them. If you are a library author, ensure your library correctly uses `controlEdgeToEdgeValues` to guide users, and adjust your own internal logic to respect `react-native-edge-to-edge`'s active state. -
Edge-to-edge UI effects (e.g., transparent status/navigation bars) are not visible despite `isEdgeToEdge()` returning true.
cause While `react-native-is-edge-to-edge` may detect the *presence* of the main `react-native-edge-to-edge` package, the core library itself might not be correctly installed, linked, or configured in the native Android project (e.g., missing XML styles, `com.google.android.material:material` dependency issues).fixThoroughly review the installation and configuration steps for the primary `react-native-edge-to-edge` package. Check Android manifest, `styles.xml`, and `build.gradle` for correct setup and ensure all native dependencies are satisfied, especially `com.google.android.material:material`.
Warnings
- gotcha Libraries consuming `react-native-is-edge-to-edge` must still ensure their own translucency (`statusBarTranslucent`, `navigationBarTranslucent`) options are adjusted to avoid visual conflicts or redundant settings when `react-native-edge-to-edge` is detected as active. This detector package does not automatically manage system bar behavior.
- gotcha When `react-native-edge-to-edge` is detected as active, explicitly setting `statusBarTranslucent` or `navigationBarTranslucent` in a consuming library might be redundant or could lead to unexpected behavior. The `controlEdgeToEdgeValues` utility is provided to help library authors warn end-users about such unnecessary definitions during development.
Install
-
npm install react-native-is-edge-to-edge -
yarn add react-native-is-edge-to-edge -
pnpm add react-native-is-edge-to-edge
Imports
- isEdgeToEdge
const isEdgeToEdge = require('react-native-is-edge-to-edge').isEdgeToEdge;import { isEdgeToEdge } from 'react-native-is-edge-to-edge'; - controlEdgeToEdgeValues
const { controlEdgeToEdgeValues } = require('react-native-is-edge-to-edge');import { controlEdgeToEdgeValues } from 'react-native-is-edge-to-edge'; - isEdgeToEdgeFromLibrary
import isEdgeToEdgeFromLibrary from 'react-native-is-edge-to-edge/isEdgeToEdgeFromLibrary';
import { isEdgeToEdgeFromLibrary } from 'react-native-is-edge-to-edge';
Quickstart
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import {
controlEdgeToEdgeValues,
isEdgeToEdge,
isEdgeToEdgeFromLibrary, // Useful for granular checks if needed
isEdgeToEdgeFromProperty, // Checks a specific property flag
} from "react-native-is-edge-to-edge";
// Determine if react-native-edge-to-edge is active in the current environment.
// This is the primary function for most library authors.
const IS_EDGE_TO_EDGE_ACTIVE = isEdgeToEdge();
interface MyLibraryComponentProps {
// These props might be passed by the user of your library.
statusBarTranslucent?: boolean;
navigationBarTranslucent?: boolean;
}
// A hypothetical component from a third-party library that needs to
// adapt to edge-to-edge mode.
function MyAwesomeLibraryComponent({
statusBarTranslucent = false, // Default to false if not provided
navigationBarTranslucent = false, // Default to false if not provided
}: MyLibraryComponentProps) {
// In development, warn library users if they are setting redundant translucency props
// when react-native-edge-to-edge is already managing system bars.
if (__DEV__) {
controlEdgeToEdgeValues({
statusBarTranslucent,
navigationBarTranslucent,
});
}
// Your internal native component or view might then consume these adjusted values.
// If edge-to-edge is active, we prioritize its setting, otherwise fall back to user-provided props.
return (
<View style={[
styles.container,
IS_EDGE_TO_EDGE_ACTIVE && styles.edgeToEdgePadding // Apply specific styling for edge-to-edge
]}>
<Text>
Edge-to-Edge is {IS_EDGE_TO_EDGE_ACTIVE ? 'ACTIVE' : 'INACTIVE'}
</Text>
<Text>
Status Bar Translucency: {IS_EDGE_TO_EDGE_ACTIVE || statusBarTranslucent ? 'True' : 'False'}
</Text>
<Text>
Navigation Bar Translucency: {IS_EDGE_TO_EDGE_ACTIVE || navigationBarTranslucent ? 'True' : 'False'}
</Text>
{/* Imagine a native component rendering here with adjusted props */}
{/* <MyAwesomeLibraryNativeComponent
statusBarTranslucent={IS_EDGE_TO_EDGE_ACTIVE || statusBarTranslucent}
navigationBarTranslucent={IS_EDGE_TO_EDGE_ACTIVE || navigationBarTranslucent}
// ... other props
/> */}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#f0f0f0',
},
edgeToEdgePadding: {
// This is a placeholder for actual edge-to-edge safe area handling.
// In a real app, you'd use `react-native-safe-area-context` or similar.
paddingTop: 0,
paddingBottom: 0,
// Potentially more complex logic based on `react-native-edge-to-edge` hooks.
}
});
export default MyAwesomeLibraryComponent;