1 | import { useTheme } from '@react-navigation/native';
|
2 | import * as React from 'react';
|
3 | import { StatusBar, StyleSheet } from 'react-native';
|
4 | import type { EdgeInsets } from 'react-native-safe-area-context';
|
5 |
|
6 | import type { Layout } from '../types';
|
7 |
|
8 | type Props = {
|
9 | dark: boolean | undefined;
|
10 | layout: Layout;
|
11 | insets: EdgeInsets;
|
12 | style: any;
|
13 | };
|
14 |
|
15 | export 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 | }
|