UNPKG

1.24 kBTypeScriptView Raw
1import { useTheme } from '@react-navigation/native';
2import * as React from 'react';
3import { StatusBar, StyleSheet } from 'react-native';
4import type { EdgeInsets } from 'react-native-safe-area-context';
5
6import type { Layout } from '../types';
7
8type Props = {
9 dark: boolean | undefined;
10 layout: Layout;
11 insets: EdgeInsets;
12 style: any;
13};
14
15export default function ModalStatusBarManager({
16 dark,
17 layout,
18 insets,
19 style,
20}: Props) {
21 const { dark: darkTheme } = useTheme();
22 const [overlapping, setOverlapping] = React.useState(true);
23
24 const scale = 1 - 20 / layout.width;
25 const offset = (insets.top - 34) * scale;
26
27 const flattenedStyle = StyleSheet.flatten(style);
28 const translateY = flattenedStyle?.transform?.find(
29 (s: any) => s.translateY !== undefined
30 )?.translateY;
31
32 React.useEffect(() => {
33 const listener = ({ value }: { value: number }) => {
34 setOverlapping(value < offset);
35 };
36
37 const sub = translateY?.addListener(listener);
38
39 return () => translateY?.removeListener(sub);
40 }, [offset, translateY]);
41
42 const darkContent = dark ?? !darkTheme;
43
44 return (
45 <StatusBar
46 animated
47 barStyle={overlapping && darkContent ? 'dark-content' : 'light-content'}
48 />
49 );
50}