@fountain-ui/lab 2.0.0-beta.80 → 2.0.0-beta.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/commonjs/StatusBarProvider/Provider.js.map +1 -1
- package/build/commonjs/StatusBarProvider/StatusBarProvider.js +111 -2
- package/build/commonjs/StatusBarProvider/StatusBarProvider.js.map +1 -1
- package/build/module/StatusBarProvider/Provider.js.map +1 -1
- package/build/module/StatusBarProvider/StatusBarProvider.js +105 -2
- package/build/module/StatusBarProvider/StatusBarProvider.js.map +1 -1
- package/build/typescript/StatusBarProvider/Provider.d.ts +13 -0
- package/package.json +2 -2
- package/src/StatusBarProvider/Provider.ts +14 -0
- package/src/StatusBarProvider/StatusBarProvider.tsx +103 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StatusBarContext","React","createContext","useStatusBarContext","useContext","Provider"],"sources":["Provider.ts"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\n\nexport interface StatusBarProviderValue {\n setTranslucent: (value: boolean) => void;\n setBackgroundColor: (value: string) => void;\n setHidden: (value: boolean) => void;\n setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;\n}\n\nexport const StatusBarContext = React.createContext<StatusBarProviderValue | null>(null);\n\nexport const useStatusBarContext = () => {\n return React.useContext(StatusBarContext);\n};\n\nexport default StatusBarContext.Provider;"],"mappings":";;;;;;;AAAA;;;;
|
|
1
|
+
{"version":3,"names":["StatusBarContext","React","createContext","useStatusBarContext","useContext","Provider"],"sources":["Provider.ts"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\n\nexport interface StatusBarProps {\n barStyle?: StatusBarStyle;\n animatedBarStyle?: boolean;\n backgroundColor?: string;\n hidden?: boolean;\n translucent?: boolean;\n}\n\nexport interface StatusBarProviderValue {\n setTranslucent: (value: boolean) => void;\n setBackgroundColor: (value: string) => void;\n setHidden: (value: boolean) => void;\n setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;\n restoreInitialStack: () => void;\n clearStack: () => void;\n pushStack: (statusBarProps: StatusBarProps) => void;\n replaceStack: (statusBarProps: StatusBarProps) => void;\n popStack: () => void;\n getCurrentStatusBarProps: () => StatusBarProps | {};\n}\n\nexport const StatusBarContext = React.createContext<StatusBarProviderValue | null>(null);\n\nexport const useStatusBarContext = () => {\n return React.useContext(StatusBarContext);\n};\n\nexport default StatusBarContext.Provider;"],"mappings":";;;;;;;AAAA;;;;AAwBO,MAAMA,gBAAgB,gBAAGC,cAAA,CAAMC,aAAN,CAAmD,IAAnD,CAAzB;;;;AAEA,MAAMC,mBAAmB,GAAG,MAAM;EACrC,OAAOF,cAAA,CAAMG,UAAN,CAAiBJ,gBAAjB,CAAP;AACH,CAFM;;;eAIQA,gBAAgB,CAACK,Q"}
|
|
@@ -5,10 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = StatusBarProvider;
|
|
7
7
|
|
|
8
|
-
var _react =
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
|
|
10
10
|
var _reactNative = require("react-native");
|
|
11
11
|
|
|
12
|
+
var R = _interopRequireWildcard(require("ramda"));
|
|
13
|
+
|
|
12
14
|
var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
|
|
13
15
|
|
|
14
16
|
var _core = require("@fountain-ui/core");
|
|
@@ -19,6 +21,10 @@ var _Provider = _interopRequireDefault(require("./Provider"));
|
|
|
19
21
|
|
|
20
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
23
|
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
+
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
+
|
|
22
28
|
const initialVisible = _reactNative.Platform.select({
|
|
23
29
|
ios: true,
|
|
24
30
|
android: false
|
|
@@ -28,6 +34,16 @@ function StatusBarProvider(props) {
|
|
|
28
34
|
const {
|
|
29
35
|
children
|
|
30
36
|
} = props;
|
|
37
|
+
const currentStatusBarPropsRef = (0, _react.useRef)({});
|
|
38
|
+
const initialStatusBarPropsStack = new Array();
|
|
39
|
+
const statusBarPropsStackRef = (0, _react.useRef)(initialStatusBarPropsStack);
|
|
40
|
+
|
|
41
|
+
const mergeStatusBarPropsRef = props => {
|
|
42
|
+
currentStatusBarPropsRef.current = { ...currentStatusBarPropsRef.current,
|
|
43
|
+
...props
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
|
|
31
47
|
const theme = (0, _core.useTheme)();
|
|
32
48
|
const defaultColor = theme.palette.background.default;
|
|
33
49
|
|
|
@@ -36,6 +52,10 @@ function StatusBarProvider(props) {
|
|
|
36
52
|
const [backgroundViewColor, setBackgroundViewColor] = _react.default.useState(defaultColor);
|
|
37
53
|
|
|
38
54
|
const setBackgroundColor = value => {
|
|
55
|
+
mergeStatusBarPropsRef({
|
|
56
|
+
backgroundColor: value
|
|
57
|
+
});
|
|
58
|
+
|
|
39
59
|
if (_reactNative.Platform.OS === 'android') {
|
|
40
60
|
_reactNative.StatusBar.setBackgroundColor(value);
|
|
41
61
|
}
|
|
@@ -46,10 +66,18 @@ function StatusBarProvider(props) {
|
|
|
46
66
|
};
|
|
47
67
|
|
|
48
68
|
const setBarStyle = (value, animated) => {
|
|
69
|
+
mergeStatusBarPropsRef({
|
|
70
|
+
barStyle: value
|
|
71
|
+
});
|
|
72
|
+
|
|
49
73
|
_reactNative.StatusBar.setBarStyle(value, animated);
|
|
50
74
|
};
|
|
51
75
|
|
|
52
76
|
const setHidden = value => {
|
|
77
|
+
mergeStatusBarPropsRef({
|
|
78
|
+
hidden: value
|
|
79
|
+
});
|
|
80
|
+
|
|
53
81
|
if (_reactNative.Platform.OS === 'ios') {
|
|
54
82
|
setVisible(!value);
|
|
55
83
|
}
|
|
@@ -58,11 +86,86 @@ function StatusBarProvider(props) {
|
|
|
58
86
|
};
|
|
59
87
|
|
|
60
88
|
const setTranslucent = value => {
|
|
89
|
+
mergeStatusBarPropsRef({
|
|
90
|
+
translucent: value
|
|
91
|
+
});
|
|
92
|
+
|
|
61
93
|
if (_reactNative.Platform.OS === 'android') {
|
|
62
94
|
_reactNative.StatusBar.setTranslucent(value);
|
|
63
95
|
}
|
|
64
96
|
};
|
|
65
97
|
|
|
98
|
+
const updateStatusBarProps = statusBarProps => {
|
|
99
|
+
const {
|
|
100
|
+
barStyle,
|
|
101
|
+
animatedBarStyle,
|
|
102
|
+
backgroundColor,
|
|
103
|
+
hidden,
|
|
104
|
+
translucent
|
|
105
|
+
} = statusBarProps;
|
|
106
|
+
|
|
107
|
+
if (!R.isNil(barStyle)) {
|
|
108
|
+
setBarStyle(barStyle, animatedBarStyle);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!R.isNil(backgroundColor)) {
|
|
112
|
+
setBackgroundColor(backgroundColor);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (!R.isNil(hidden)) {
|
|
116
|
+
setHidden(hidden);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!R.isNil(translucent)) {
|
|
120
|
+
setTranslucent(translucent);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const restoreInitialStack = () => {
|
|
125
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const initialStatusBar = statusBarPropsStackRef.current[0];
|
|
130
|
+
updateStatusBarProps(initialStatusBar);
|
|
131
|
+
statusBarPropsStackRef.current = [statusBarPropsStackRef.current[0]];
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const clearStack = () => {
|
|
135
|
+
statusBarPropsStackRef.current = new Array();
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const pushStack = statusBarProps => {
|
|
139
|
+
updateStatusBarProps(statusBarProps);
|
|
140
|
+
statusBarPropsStackRef.current.push(currentStatusBarPropsRef.current);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const replaceStack = statusBarProps => {
|
|
144
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
updateStatusBarProps(statusBarProps);
|
|
149
|
+
statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 1] = currentStatusBarPropsRef.current;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const popStack = () => {
|
|
153
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const prevStack = statusBarPropsStackRef.current.length >= 2 ? statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 2] : undefined;
|
|
158
|
+
statusBarPropsStackRef.current.pop();
|
|
159
|
+
|
|
160
|
+
if (R.isNil(prevStack)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
updateStatusBarProps(prevStack);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const getCurrentStatusBarProps = () => currentStatusBarPropsRef.current;
|
|
168
|
+
|
|
66
169
|
const shouldRenderBackgroundView = _reactNative.Platform.OS === 'ios' && visible;
|
|
67
170
|
const inset = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
|
|
68
171
|
const backgroundViewStyle = (0, _styles.css)([{
|
|
@@ -79,7 +182,13 @@ function StatusBarProvider(props) {
|
|
|
79
182
|
setBackgroundColor,
|
|
80
183
|
setBarStyle,
|
|
81
184
|
setHidden,
|
|
82
|
-
setTranslucent
|
|
185
|
+
setTranslucent,
|
|
186
|
+
pushStack,
|
|
187
|
+
popStack,
|
|
188
|
+
replaceStack,
|
|
189
|
+
getCurrentStatusBarProps,
|
|
190
|
+
restoreInitialStack,
|
|
191
|
+
clearStack
|
|
83
192
|
}
|
|
84
193
|
}, shouldRenderBackgroundView ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
85
194
|
style: backgroundViewStyle
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["initialVisible","Platform","select","ios","android","StatusBarProvider","props","children","theme","useTheme","defaultColor","palette","background","default","visible","setVisible","React","useState","backgroundViewColor","setBackgroundViewColor","setBackgroundColor","value","OS","RNStatusBar","setBarStyle","animated","setHidden","setTranslucent","shouldRenderBackgroundView","inset","useSafeAreaInsets","backgroundViewStyle","css","backgroundColor","height","top","left","position","right","zIndex","statusBar"],"sources":["StatusBarProvider.tsx"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\nimport { Platform, StatusBar as RNStatusBar, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useTheme } from '@fountain-ui/core';\nimport { css } from '@fountain-ui/styles';\nimport Provider from './Provider';\nimport type StatusBarProviderProps from './StatusBarProviderProps';\n\nconst initialVisible = Platform.select({\n ios: true,\n android: false,\n});\n\nexport default function StatusBarProvider(props: StatusBarProviderProps) {\n const { children } = props;\n\n const theme = useTheme();\n const defaultColor = theme.palette.background.default;\n\n const [visible, setVisible] = React.useState(initialVisible);\n const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);\n\n const setBackgroundColor = (value: string) => {\n if (Platform.OS === 'android') {\n RNStatusBar.setBackgroundColor(value);\n }\n\n if (Platform.OS === 'ios') {\n setBackgroundViewColor(value);\n }\n };\n\n const setBarStyle = (value: StatusBarStyle, animated?: boolean) => {\n RNStatusBar.setBarStyle(value, animated);\n };\n\n const setHidden = (value: boolean) => {\n if (Platform.OS === 'ios') {\n setVisible(!value);\n }\n\n RNStatusBar.setHidden(value);\n };\n\n const setTranslucent = (value: boolean) => {\n if (Platform.OS === 'android') {\n RNStatusBar.setTranslucent(value);\n }\n };\n\n const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;\n\n const inset = useSafeAreaInsets();\n const backgroundViewStyle = css([\n {\n backgroundColor: backgroundViewColor,\n height: inset.top,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.statusBar,\n },\n ]);\n\n return (\n <Provider value={{\n setBackgroundColor,\n setBarStyle,\n setHidden,\n setTranslucent,\n }}>\n {shouldRenderBackgroundView ? (\n <View style={backgroundViewStyle}/>\n ) : null}\n {children}\n </Provider>\n );\n}"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;AACA;;;;AAGA,MAAMA,cAAc,GAAGC,qBAAA,CAASC,MAAT,CAAgB;EACnCC,GAAG,EAAE,IAD8B;EAEnCC,OAAO,EAAE;AAF0B,CAAhB,CAAvB;;AAKe,SAASC,iBAAT,CAA2BC,KAA3B,EAA0D;EACrE,MAAM;IAAEC;EAAF,IAAeD,KAArB;EAEA,MAAME,KAAK,GAAG,IAAAC,cAAA,GAAd;EACA,MAAMC,YAAY,GAAGF,KAAK,CAACG,OAAN,CAAcC,UAAd,CAAyBC,OAA9C;;EAEA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBC,cAAA,CAAMC,QAAN,CAAejB,cAAf,CAA9B;;EACA,MAAM,CAACkB,mBAAD,EAAsBC,sBAAtB,IAAgDH,cAAA,CAAMC,QAAN,CAAeP,YAAf,CAAtD;;EAEA,MAAMU,kBAAkB,GAAIC,KAAD,IAAmB;IAC1C,IAAIpB,qBAAA,CAASqB,EAAT,KAAgB,SAApB,EAA+B;MAC3BC,sBAAA,CAAYH,kBAAZ,CAA+BC,KAA/B;IACH;;IAED,IAAIpB,qBAAA,CAASqB,EAAT,KAAgB,KAApB,EAA2B;MACvBH,sBAAsB,CAACE,KAAD,CAAtB;IACH;EACJ,CARD;;EAUA,MAAMG,WAAW,GAAG,CAACH,KAAD,EAAwBI,QAAxB,KAA+C;IAC/DF,sBAAA,CAAYC,WAAZ,CAAwBH,KAAxB,EAA+BI,QAA/B;EACH,CAFD;;EAIA,MAAMC,SAAS,GAAIL,KAAD,IAAoB;IAClC,IAAIpB,qBAAA,CAASqB,EAAT,KAAgB,KAApB,EAA2B;MACvBP,UAAU,CAAC,CAACM,KAAF,CAAV;IACH;;IAEDE,sBAAA,CAAYG,SAAZ,CAAsBL,KAAtB;EACH,CAND;;EAQA,MAAMM,cAAc,GAAIN,KAAD,IAAoB;IACvC,IAAIpB,qBAAA,CAASqB,EAAT,KAAgB,SAApB,EAA+B;MAC3BC,sBAAA,CAAYI,cAAZ,CAA2BN,KAA3B;IACH;EACJ,CAJD;;EAMA,MAAMO,0BAA0B,GAAG3B,qBAAA,CAASqB,EAAT,KAAgB,KAAhB,IAAyBR,OAA5D;EAEA,MAAMe,KAAK,GAAG,IAAAC,6CAAA,GAAd;EACA,MAAMC,mBAAmB,GAAG,IAAAC,WAAA,EAAI,CAC5B;IACIC,eAAe,EAAEf,mBADrB;IAEIgB,MAAM,EAAEL,KAAK,CAACM,GAFlB;IAGIC,IAAI,EAAE,CAHV;IAIIC,QAAQ,EAAE,UAJd;IAKIC,KAAK,EAAE,CALX;IAMIH,GAAG,EAAE,CANT;IAOII,MAAM,EAAE/B,KAAK,CAAC+B,MAAN,CAAaC;EAPzB,CAD4B,CAAJ,CAA5B;EAYA,oBACI,6BAAC,iBAAD;IAAU,KAAK,EAAE;MACbpB,kBADa;MAEbI,WAFa;MAGbE,SAHa;MAIbC;IAJa;EAAjB,GAMKC,0BAA0B,gBACvB,6BAAC,iBAAD;IAAM,KAAK,EAAEG;EAAb,EADuB,GAEvB,IARR,EASKxB,QATL,CADJ;AAaH"}
|
|
1
|
+
{"version":3,"names":["initialVisible","Platform","select","ios","android","StatusBarProvider","props","children","currentStatusBarPropsRef","useRef","initialStatusBarPropsStack","Array","statusBarPropsStackRef","mergeStatusBarPropsRef","current","theme","useTheme","defaultColor","palette","background","default","visible","setVisible","React","useState","backgroundViewColor","setBackgroundViewColor","setBackgroundColor","value","backgroundColor","OS","RNStatusBar","setBarStyle","animated","barStyle","setHidden","hidden","setTranslucent","translucent","updateStatusBarProps","statusBarProps","animatedBarStyle","R","isNil","restoreInitialStack","length","initialStatusBar","clearStack","pushStack","push","replaceStack","popStack","prevStack","undefined","pop","getCurrentStatusBarProps","shouldRenderBackgroundView","inset","useSafeAreaInsets","backgroundViewStyle","css","height","top","left","position","right","zIndex","statusBar"],"sources":["StatusBarProvider.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport type { StatusBarStyle } from 'react-native';\nimport { Platform, StatusBar as RNStatusBar, View } from 'react-native';\nimport * as R from 'ramda';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useTheme } from '@fountain-ui/core';\nimport { css } from '@fountain-ui/styles';\nimport Provider from './Provider';\nimport type { StatusBarProps } from './Provider';\nimport type StatusBarProviderProps from './StatusBarProviderProps';\n\nconst initialVisible = Platform.select({\n ios: true,\n android: false,\n});\n\nexport default function StatusBarProvider(props: StatusBarProviderProps) {\n const { children } = props;\n\n const currentStatusBarPropsRef = useRef<StatusBarProps | {}>({});\n\n const initialStatusBarPropsStack = new Array<StatusBarProps>();\n const statusBarPropsStackRef = useRef(initialStatusBarPropsStack);\n\n const mergeStatusBarPropsRef = (props: StatusBarProps) => {\n currentStatusBarPropsRef.current = {\n ...currentStatusBarPropsRef.current,\n ...props,\n };\n };\n\n const theme = useTheme();\n const defaultColor = theme.palette.background.default;\n\n const [visible, setVisible] = React.useState(initialVisible);\n const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);\n\n const setBackgroundColor = (value: string) => {\n mergeStatusBarPropsRef({ backgroundColor: value });\n\n if (Platform.OS === 'android') {\n RNStatusBar.setBackgroundColor(value);\n }\n\n if (Platform.OS === 'ios') {\n setBackgroundViewColor(value);\n }\n };\n\n const setBarStyle = (value: StatusBarStyle, animated?: boolean) => {\n mergeStatusBarPropsRef({ barStyle: value });\n RNStatusBar.setBarStyle(value, animated);\n };\n\n const setHidden = (value: boolean) => {\n mergeStatusBarPropsRef({ hidden: value });\n\n if (Platform.OS === 'ios') {\n setVisible(!value);\n }\n\n RNStatusBar.setHidden(value);\n };\n\n const setTranslucent = (value: boolean) => {\n mergeStatusBarPropsRef({ translucent: value });\n\n if (Platform.OS === 'android') {\n RNStatusBar.setTranslucent(value);\n }\n };\n\n const updateStatusBarProps = (statusBarProps: StatusBarProps) => {\n const {\n barStyle,\n animatedBarStyle,\n backgroundColor,\n hidden,\n translucent,\n } = statusBarProps;\n\n if (!R.isNil(barStyle)) {\n setBarStyle(barStyle, animatedBarStyle);\n }\n\n if (!R.isNil(backgroundColor)) {\n setBackgroundColor(backgroundColor);\n }\n\n if (!R.isNil(hidden)) {\n setHidden(hidden);\n }\n\n if (!R.isNil(translucent)) {\n setTranslucent(translucent);\n }\n };\n\n const restoreInitialStack = () => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n const initialStatusBar = statusBarPropsStackRef.current[0];\n updateStatusBarProps(initialStatusBar);\n\n statusBarPropsStackRef.current = [statusBarPropsStackRef.current[0]];\n };\n\n const clearStack = () => {\n statusBarPropsStackRef.current = new Array<StatusBarProps>();\n };\n\n const pushStack = (statusBarProps: StatusBarProps) => {\n updateStatusBarProps(statusBarProps);\n statusBarPropsStackRef.current.push(currentStatusBarPropsRef.current);\n };\n\n const replaceStack = (statusBarProps: StatusBarProps) => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n updateStatusBarProps(statusBarProps);\n statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 1] = currentStatusBarPropsRef.current;\n };\n\n const popStack = () => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n const prevStack = statusBarPropsStackRef.current.length >= 2\n ? statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 2]\n : undefined;\n\n statusBarPropsStackRef.current.pop();\n\n if (R.isNil(prevStack)) {\n return;\n }\n\n updateStatusBarProps(prevStack);\n };\n\n const getCurrentStatusBarProps = () => currentStatusBarPropsRef.current;\n\n const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;\n\n const inset = useSafeAreaInsets();\n const backgroundViewStyle = css([\n {\n backgroundColor: backgroundViewColor,\n height: inset.top,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.statusBar,\n },\n ]);\n\n return (\n <Provider value={{\n setBackgroundColor,\n setBarStyle,\n setHidden,\n setTranslucent,\n pushStack,\n popStack,\n replaceStack,\n getCurrentStatusBarProps,\n restoreInitialStack,\n clearStack,\n }}>\n {shouldRenderBackgroundView ? (\n <View style={backgroundViewStyle}/>\n ) : null}\n {children}\n </Provider>\n );\n}"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","StatusBarContext","createContext","useStatusBarContext","useContext","Provider"],"sources":["Provider.ts"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\n\nexport interface StatusBarProviderValue {\n setTranslucent: (value: boolean) => void;\n setBackgroundColor: (value: string) => void;\n setHidden: (value: boolean) => void;\n setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;\n}\n\nexport const StatusBarContext = React.createContext<StatusBarProviderValue | null>(null);\n\nexport const useStatusBarContext = () => {\n return React.useContext(StatusBarContext);\n};\n\nexport default StatusBarContext.Provider;"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;
|
|
1
|
+
{"version":3,"names":["React","StatusBarContext","createContext","useStatusBarContext","useContext","Provider"],"sources":["Provider.ts"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\n\nexport interface StatusBarProps {\n barStyle?: StatusBarStyle;\n animatedBarStyle?: boolean;\n backgroundColor?: string;\n hidden?: boolean;\n translucent?: boolean;\n}\n\nexport interface StatusBarProviderValue {\n setTranslucent: (value: boolean) => void;\n setBackgroundColor: (value: string) => void;\n setHidden: (value: boolean) => void;\n setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;\n restoreInitialStack: () => void;\n clearStack: () => void;\n pushStack: (statusBarProps: StatusBarProps) => void;\n replaceStack: (statusBarProps: StatusBarProps) => void;\n popStack: () => void;\n getCurrentStatusBarProps: () => StatusBarProps | {};\n}\n\nexport const StatusBarContext = React.createContext<StatusBarProviderValue | null>(null);\n\nexport const useStatusBarContext = () => {\n return React.useContext(StatusBarContext);\n};\n\nexport default StatusBarContext.Provider;"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAwBA,OAAO,MAAMC,gBAAgB,gBAAGD,KAAK,CAACE,aAAN,CAAmD,IAAnD,CAAzB;AAEP,OAAO,MAAMC,mBAAmB,GAAG,MAAM;EACrC,OAAOH,KAAK,CAACI,UAAN,CAAiBH,gBAAjB,CAAP;AACH,CAFM;AAIP,eAAeA,gBAAgB,CAACI,QAAhC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
2
|
import { Platform, StatusBar as RNStatusBar, View } from 'react-native';
|
|
3
|
+
import * as R from 'ramda';
|
|
3
4
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
4
5
|
import { useTheme } from '@fountain-ui/core';
|
|
5
6
|
import { css } from '@fountain-ui/styles';
|
|
@@ -12,12 +13,26 @@ export default function StatusBarProvider(props) {
|
|
|
12
13
|
const {
|
|
13
14
|
children
|
|
14
15
|
} = props;
|
|
16
|
+
const currentStatusBarPropsRef = useRef({});
|
|
17
|
+
const initialStatusBarPropsStack = new Array();
|
|
18
|
+
const statusBarPropsStackRef = useRef(initialStatusBarPropsStack);
|
|
19
|
+
|
|
20
|
+
const mergeStatusBarPropsRef = props => {
|
|
21
|
+
currentStatusBarPropsRef.current = { ...currentStatusBarPropsRef.current,
|
|
22
|
+
...props
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
15
26
|
const theme = useTheme();
|
|
16
27
|
const defaultColor = theme.palette.background.default;
|
|
17
28
|
const [visible, setVisible] = React.useState(initialVisible);
|
|
18
29
|
const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);
|
|
19
30
|
|
|
20
31
|
const setBackgroundColor = value => {
|
|
32
|
+
mergeStatusBarPropsRef({
|
|
33
|
+
backgroundColor: value
|
|
34
|
+
});
|
|
35
|
+
|
|
21
36
|
if (Platform.OS === 'android') {
|
|
22
37
|
RNStatusBar.setBackgroundColor(value);
|
|
23
38
|
}
|
|
@@ -28,10 +43,17 @@ export default function StatusBarProvider(props) {
|
|
|
28
43
|
};
|
|
29
44
|
|
|
30
45
|
const setBarStyle = (value, animated) => {
|
|
46
|
+
mergeStatusBarPropsRef({
|
|
47
|
+
barStyle: value
|
|
48
|
+
});
|
|
31
49
|
RNStatusBar.setBarStyle(value, animated);
|
|
32
50
|
};
|
|
33
51
|
|
|
34
52
|
const setHidden = value => {
|
|
53
|
+
mergeStatusBarPropsRef({
|
|
54
|
+
hidden: value
|
|
55
|
+
});
|
|
56
|
+
|
|
35
57
|
if (Platform.OS === 'ios') {
|
|
36
58
|
setVisible(!value);
|
|
37
59
|
}
|
|
@@ -40,11 +62,86 @@ export default function StatusBarProvider(props) {
|
|
|
40
62
|
};
|
|
41
63
|
|
|
42
64
|
const setTranslucent = value => {
|
|
65
|
+
mergeStatusBarPropsRef({
|
|
66
|
+
translucent: value
|
|
67
|
+
});
|
|
68
|
+
|
|
43
69
|
if (Platform.OS === 'android') {
|
|
44
70
|
RNStatusBar.setTranslucent(value);
|
|
45
71
|
}
|
|
46
72
|
};
|
|
47
73
|
|
|
74
|
+
const updateStatusBarProps = statusBarProps => {
|
|
75
|
+
const {
|
|
76
|
+
barStyle,
|
|
77
|
+
animatedBarStyle,
|
|
78
|
+
backgroundColor,
|
|
79
|
+
hidden,
|
|
80
|
+
translucent
|
|
81
|
+
} = statusBarProps;
|
|
82
|
+
|
|
83
|
+
if (!R.isNil(barStyle)) {
|
|
84
|
+
setBarStyle(barStyle, animatedBarStyle);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!R.isNil(backgroundColor)) {
|
|
88
|
+
setBackgroundColor(backgroundColor);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!R.isNil(hidden)) {
|
|
92
|
+
setHidden(hidden);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!R.isNil(translucent)) {
|
|
96
|
+
setTranslucent(translucent);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const restoreInitialStack = () => {
|
|
101
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const initialStatusBar = statusBarPropsStackRef.current[0];
|
|
106
|
+
updateStatusBarProps(initialStatusBar);
|
|
107
|
+
statusBarPropsStackRef.current = [statusBarPropsStackRef.current[0]];
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const clearStack = () => {
|
|
111
|
+
statusBarPropsStackRef.current = new Array();
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const pushStack = statusBarProps => {
|
|
115
|
+
updateStatusBarProps(statusBarProps);
|
|
116
|
+
statusBarPropsStackRef.current.push(currentStatusBarPropsRef.current);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const replaceStack = statusBarProps => {
|
|
120
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
updateStatusBarProps(statusBarProps);
|
|
125
|
+
statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 1] = currentStatusBarPropsRef.current;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const popStack = () => {
|
|
129
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const prevStack = statusBarPropsStackRef.current.length >= 2 ? statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 2] : undefined;
|
|
134
|
+
statusBarPropsStackRef.current.pop();
|
|
135
|
+
|
|
136
|
+
if (R.isNil(prevStack)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
updateStatusBarProps(prevStack);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const getCurrentStatusBarProps = () => currentStatusBarPropsRef.current;
|
|
144
|
+
|
|
48
145
|
const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;
|
|
49
146
|
const inset = useSafeAreaInsets();
|
|
50
147
|
const backgroundViewStyle = css([{
|
|
@@ -61,7 +158,13 @@ export default function StatusBarProvider(props) {
|
|
|
61
158
|
setBackgroundColor,
|
|
62
159
|
setBarStyle,
|
|
63
160
|
setHidden,
|
|
64
|
-
setTranslucent
|
|
161
|
+
setTranslucent,
|
|
162
|
+
pushStack,
|
|
163
|
+
popStack,
|
|
164
|
+
replaceStack,
|
|
165
|
+
getCurrentStatusBarProps,
|
|
166
|
+
restoreInitialStack,
|
|
167
|
+
clearStack
|
|
65
168
|
}
|
|
66
169
|
}, shouldRenderBackgroundView ? /*#__PURE__*/React.createElement(View, {
|
|
67
170
|
style: backgroundViewStyle
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Platform","StatusBar","RNStatusBar","View","useSafeAreaInsets","useTheme","css","Provider","initialVisible","select","ios","android","StatusBarProvider","props","children","theme","defaultColor","palette","background","default","visible","setVisible","useState","backgroundViewColor","setBackgroundViewColor","setBackgroundColor","value","OS","setBarStyle","animated","setHidden","setTranslucent","shouldRenderBackgroundView","inset","backgroundViewStyle","backgroundColor","height","top","left","position","right","zIndex","statusBar"],"sources":["StatusBarProvider.tsx"],"sourcesContent":["import React from 'react';\nimport type { StatusBarStyle } from 'react-native';\nimport { Platform, StatusBar as RNStatusBar, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useTheme } from '@fountain-ui/core';\nimport { css } from '@fountain-ui/styles';\nimport Provider from './Provider';\nimport type StatusBarProviderProps from './StatusBarProviderProps';\n\nconst initialVisible = Platform.select({\n ios: true,\n android: false,\n});\n\nexport default function StatusBarProvider(props: StatusBarProviderProps) {\n const { children } = props;\n\n const theme = useTheme();\n const defaultColor = theme.palette.background.default;\n\n const [visible, setVisible] = React.useState(initialVisible);\n const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);\n\n const setBackgroundColor = (value: string) => {\n if (Platform.OS === 'android') {\n RNStatusBar.setBackgroundColor(value);\n }\n\n if (Platform.OS === 'ios') {\n setBackgroundViewColor(value);\n }\n };\n\n const setBarStyle = (value: StatusBarStyle, animated?: boolean) => {\n RNStatusBar.setBarStyle(value, animated);\n };\n\n const setHidden = (value: boolean) => {\n if (Platform.OS === 'ios') {\n setVisible(!value);\n }\n\n RNStatusBar.setHidden(value);\n };\n\n const setTranslucent = (value: boolean) => {\n if (Platform.OS === 'android') {\n RNStatusBar.setTranslucent(value);\n }\n };\n\n const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;\n\n const inset = useSafeAreaInsets();\n const backgroundViewStyle = css([\n {\n backgroundColor: backgroundViewColor,\n height: inset.top,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.statusBar,\n },\n ]);\n\n return (\n <Provider value={{\n setBackgroundColor,\n setBarStyle,\n setHidden,\n setTranslucent,\n }}>\n {shouldRenderBackgroundView ? (\n <View style={backgroundViewStyle}/>\n ) : null}\n {children}\n </Provider>\n );\n}"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAEA,SAASC,QAAT,EAAmBC,SAAS,IAAIC,WAAhC,EAA6CC,IAA7C,QAAyD,cAAzD;AACA,SAASC,iBAAT,QAAkC,gCAAlC;AACA,SAASC,QAAT,QAAyB,mBAAzB;AACA,SAASC,GAAT,QAAoB,qBAApB;AACA,OAAOC,QAAP,MAAqB,YAArB;AAGA,MAAMC,cAAc,GAAGR,QAAQ,CAACS,MAAT,CAAgB;EACnCC,GAAG,EAAE,IAD8B;EAEnCC,OAAO,EAAE;AAF0B,CAAhB,CAAvB;AAKA,eAAe,SAASC,iBAAT,CAA2BC,KAA3B,EAA0D;EACrE,MAAM;IAAEC;EAAF,IAAeD,KAArB;EAEA,MAAME,KAAK,GAAGV,QAAQ,EAAtB;EACA,MAAMW,YAAY,GAAGD,KAAK,CAACE,OAAN,CAAcC,UAAd,CAAyBC,OAA9C;EAEA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBtB,KAAK,CAACuB,QAAN,CAAed,cAAf,CAA9B;EACA,MAAM,CAACe,mBAAD,EAAsBC,sBAAtB,IAAgDzB,KAAK,CAACuB,QAAN,CAAeN,YAAf,CAAtD;;EAEA,MAAMS,kBAAkB,GAAIC,KAAD,IAAmB;IAC1C,IAAI1B,QAAQ,CAAC2B,EAAT,KAAgB,SAApB,EAA+B;MAC3BzB,WAAW,CAACuB,kBAAZ,CAA+BC,KAA/B;IACH;;IAED,IAAI1B,QAAQ,CAAC2B,EAAT,KAAgB,KAApB,EAA2B;MACvBH,sBAAsB,CAACE,KAAD,CAAtB;IACH;EACJ,CARD;;EAUA,MAAME,WAAW,GAAG,CAACF,KAAD,EAAwBG,QAAxB,KAA+C;IAC/D3B,WAAW,CAAC0B,WAAZ,CAAwBF,KAAxB,EAA+BG,QAA/B;EACH,CAFD;;EAIA,MAAMC,SAAS,GAAIJ,KAAD,IAAoB;IAClC,IAAI1B,QAAQ,CAAC2B,EAAT,KAAgB,KAApB,EAA2B;MACvBN,UAAU,CAAC,CAACK,KAAF,CAAV;IACH;;IAEDxB,WAAW,CAAC4B,SAAZ,CAAsBJ,KAAtB;EACH,CAND;;EAQA,MAAMK,cAAc,GAAIL,KAAD,IAAoB;IACvC,IAAI1B,QAAQ,CAAC2B,EAAT,KAAgB,SAApB,EAA+B;MAC3BzB,WAAW,CAAC6B,cAAZ,CAA2BL,KAA3B;IACH;EACJ,CAJD;;EAMA,MAAMM,0BAA0B,GAAGhC,QAAQ,CAAC2B,EAAT,KAAgB,KAAhB,IAAyBP,OAA5D;EAEA,MAAMa,KAAK,GAAG7B,iBAAiB,EAA/B;EACA,MAAM8B,mBAAmB,GAAG5B,GAAG,CAAC,CAC5B;IACI6B,eAAe,EAAEZ,mBADrB;IAEIa,MAAM,EAAEH,KAAK,CAACI,GAFlB;IAGIC,IAAI,EAAE,CAHV;IAIIC,QAAQ,EAAE,UAJd;IAKIC,KAAK,EAAE,CALX;IAMIH,GAAG,EAAE,CANT;IAOII,MAAM,EAAE1B,KAAK,CAAC0B,MAAN,CAAaC;EAPzB,CAD4B,CAAD,CAA/B;EAYA,oBACI,oBAAC,QAAD;IAAU,KAAK,EAAE;MACbjB,kBADa;MAEbG,WAFa;MAGbE,SAHa;MAIbC;IAJa;EAAjB,GAMKC,0BAA0B,gBACvB,oBAAC,IAAD;IAAM,KAAK,EAAEE;EAAb,EADuB,GAEvB,IARR,EASKpB,QATL,CADJ;AAaH"}
|
|
1
|
+
{"version":3,"names":["React","useRef","Platform","StatusBar","RNStatusBar","View","R","useSafeAreaInsets","useTheme","css","Provider","initialVisible","select","ios","android","StatusBarProvider","props","children","currentStatusBarPropsRef","initialStatusBarPropsStack","Array","statusBarPropsStackRef","mergeStatusBarPropsRef","current","theme","defaultColor","palette","background","default","visible","setVisible","useState","backgroundViewColor","setBackgroundViewColor","setBackgroundColor","value","backgroundColor","OS","setBarStyle","animated","barStyle","setHidden","hidden","setTranslucent","translucent","updateStatusBarProps","statusBarProps","animatedBarStyle","isNil","restoreInitialStack","length","initialStatusBar","clearStack","pushStack","push","replaceStack","popStack","prevStack","undefined","pop","getCurrentStatusBarProps","shouldRenderBackgroundView","inset","backgroundViewStyle","height","top","left","position","right","zIndex","statusBar"],"sources":["StatusBarProvider.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport type { StatusBarStyle } from 'react-native';\nimport { Platform, StatusBar as RNStatusBar, View } from 'react-native';\nimport * as R from 'ramda';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useTheme } from '@fountain-ui/core';\nimport { css } from '@fountain-ui/styles';\nimport Provider from './Provider';\nimport type { StatusBarProps } from './Provider';\nimport type StatusBarProviderProps from './StatusBarProviderProps';\n\nconst initialVisible = Platform.select({\n ios: true,\n android: false,\n});\n\nexport default function StatusBarProvider(props: StatusBarProviderProps) {\n const { children } = props;\n\n const currentStatusBarPropsRef = useRef<StatusBarProps | {}>({});\n\n const initialStatusBarPropsStack = new Array<StatusBarProps>();\n const statusBarPropsStackRef = useRef(initialStatusBarPropsStack);\n\n const mergeStatusBarPropsRef = (props: StatusBarProps) => {\n currentStatusBarPropsRef.current = {\n ...currentStatusBarPropsRef.current,\n ...props,\n };\n };\n\n const theme = useTheme();\n const defaultColor = theme.palette.background.default;\n\n const [visible, setVisible] = React.useState(initialVisible);\n const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);\n\n const setBackgroundColor = (value: string) => {\n mergeStatusBarPropsRef({ backgroundColor: value });\n\n if (Platform.OS === 'android') {\n RNStatusBar.setBackgroundColor(value);\n }\n\n if (Platform.OS === 'ios') {\n setBackgroundViewColor(value);\n }\n };\n\n const setBarStyle = (value: StatusBarStyle, animated?: boolean) => {\n mergeStatusBarPropsRef({ barStyle: value });\n RNStatusBar.setBarStyle(value, animated);\n };\n\n const setHidden = (value: boolean) => {\n mergeStatusBarPropsRef({ hidden: value });\n\n if (Platform.OS === 'ios') {\n setVisible(!value);\n }\n\n RNStatusBar.setHidden(value);\n };\n\n const setTranslucent = (value: boolean) => {\n mergeStatusBarPropsRef({ translucent: value });\n\n if (Platform.OS === 'android') {\n RNStatusBar.setTranslucent(value);\n }\n };\n\n const updateStatusBarProps = (statusBarProps: StatusBarProps) => {\n const {\n barStyle,\n animatedBarStyle,\n backgroundColor,\n hidden,\n translucent,\n } = statusBarProps;\n\n if (!R.isNil(barStyle)) {\n setBarStyle(barStyle, animatedBarStyle);\n }\n\n if (!R.isNil(backgroundColor)) {\n setBackgroundColor(backgroundColor);\n }\n\n if (!R.isNil(hidden)) {\n setHidden(hidden);\n }\n\n if (!R.isNil(translucent)) {\n setTranslucent(translucent);\n }\n };\n\n const restoreInitialStack = () => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n const initialStatusBar = statusBarPropsStackRef.current[0];\n updateStatusBarProps(initialStatusBar);\n\n statusBarPropsStackRef.current = [statusBarPropsStackRef.current[0]];\n };\n\n const clearStack = () => {\n statusBarPropsStackRef.current = new Array<StatusBarProps>();\n };\n\n const pushStack = (statusBarProps: StatusBarProps) => {\n updateStatusBarProps(statusBarProps);\n statusBarPropsStackRef.current.push(currentStatusBarPropsRef.current);\n };\n\n const replaceStack = (statusBarProps: StatusBarProps) => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n updateStatusBarProps(statusBarProps);\n statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 1] = currentStatusBarPropsRef.current;\n };\n\n const popStack = () => {\n if (statusBarPropsStackRef.current.length === 0) {\n return;\n }\n\n const prevStack = statusBarPropsStackRef.current.length >= 2\n ? statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 2]\n : undefined;\n\n statusBarPropsStackRef.current.pop();\n\n if (R.isNil(prevStack)) {\n return;\n }\n\n updateStatusBarProps(prevStack);\n };\n\n const getCurrentStatusBarProps = () => currentStatusBarPropsRef.current;\n\n const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;\n\n const inset = useSafeAreaInsets();\n const backgroundViewStyle = css([\n {\n backgroundColor: backgroundViewColor,\n height: inset.top,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.statusBar,\n },\n ]);\n\n return (\n <Provider value={{\n setBackgroundColor,\n setBarStyle,\n setHidden,\n setTranslucent,\n pushStack,\n popStack,\n replaceStack,\n getCurrentStatusBarProps,\n restoreInitialStack,\n clearStack,\n }}>\n {shouldRenderBackgroundView ? (\n <View style={backgroundViewStyle}/>\n ) : null}\n {children}\n </Provider>\n );\n}"],"mappings":"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"}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { StatusBarStyle } from 'react-native';
|
|
3
|
+
export interface StatusBarProps {
|
|
4
|
+
barStyle?: StatusBarStyle;
|
|
5
|
+
animatedBarStyle?: boolean;
|
|
6
|
+
backgroundColor?: string;
|
|
7
|
+
hidden?: boolean;
|
|
8
|
+
translucent?: boolean;
|
|
9
|
+
}
|
|
3
10
|
export interface StatusBarProviderValue {
|
|
4
11
|
setTranslucent: (value: boolean) => void;
|
|
5
12
|
setBackgroundColor: (value: string) => void;
|
|
6
13
|
setHidden: (value: boolean) => void;
|
|
7
14
|
setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;
|
|
15
|
+
restoreInitialStack: () => void;
|
|
16
|
+
clearStack: () => void;
|
|
17
|
+
pushStack: (statusBarProps: StatusBarProps) => void;
|
|
18
|
+
replaceStack: (statusBarProps: StatusBarProps) => void;
|
|
19
|
+
popStack: () => void;
|
|
20
|
+
getCurrentStatusBarProps: () => StatusBarProps | {};
|
|
8
21
|
}
|
|
9
22
|
export declare const StatusBarContext: React.Context<StatusBarProviderValue | null>;
|
|
10
23
|
export declare const useStatusBarContext: () => StatusBarProviderValue | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fountain-ui/lab",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.81",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Fountain-UI Team",
|
|
6
6
|
"description": "Incubator for Fountain-UI React components.",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "87b7f59e7a8c74e81db8816455020b3d6526686c"
|
|
74
74
|
}
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { StatusBarStyle } from 'react-native';
|
|
3
3
|
|
|
4
|
+
export interface StatusBarProps {
|
|
5
|
+
barStyle?: StatusBarStyle;
|
|
6
|
+
animatedBarStyle?: boolean;
|
|
7
|
+
backgroundColor?: string;
|
|
8
|
+
hidden?: boolean;
|
|
9
|
+
translucent?: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
4
12
|
export interface StatusBarProviderValue {
|
|
5
13
|
setTranslucent: (value: boolean) => void;
|
|
6
14
|
setBackgroundColor: (value: string) => void;
|
|
7
15
|
setHidden: (value: boolean) => void;
|
|
8
16
|
setBarStyle: (value: StatusBarStyle, animated?: boolean) => void;
|
|
17
|
+
restoreInitialStack: () => void;
|
|
18
|
+
clearStack: () => void;
|
|
19
|
+
pushStack: (statusBarProps: StatusBarProps) => void;
|
|
20
|
+
replaceStack: (statusBarProps: StatusBarProps) => void;
|
|
21
|
+
popStack: () => void;
|
|
22
|
+
getCurrentStatusBarProps: () => StatusBarProps | {};
|
|
9
23
|
}
|
|
10
24
|
|
|
11
25
|
export const StatusBarContext = React.createContext<StatusBarProviderValue | null>(null);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
2
|
import type { StatusBarStyle } from 'react-native';
|
|
3
3
|
import { Platform, StatusBar as RNStatusBar, View } from 'react-native';
|
|
4
|
+
import * as R from 'ramda';
|
|
4
5
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
5
6
|
import { useTheme } from '@fountain-ui/core';
|
|
6
7
|
import { css } from '@fountain-ui/styles';
|
|
7
8
|
import Provider from './Provider';
|
|
9
|
+
import type { StatusBarProps } from './Provider';
|
|
8
10
|
import type StatusBarProviderProps from './StatusBarProviderProps';
|
|
9
11
|
|
|
10
12
|
const initialVisible = Platform.select({
|
|
@@ -15,6 +17,18 @@ const initialVisible = Platform.select({
|
|
|
15
17
|
export default function StatusBarProvider(props: StatusBarProviderProps) {
|
|
16
18
|
const { children } = props;
|
|
17
19
|
|
|
20
|
+
const currentStatusBarPropsRef = useRef<StatusBarProps | {}>({});
|
|
21
|
+
|
|
22
|
+
const initialStatusBarPropsStack = new Array<StatusBarProps>();
|
|
23
|
+
const statusBarPropsStackRef = useRef(initialStatusBarPropsStack);
|
|
24
|
+
|
|
25
|
+
const mergeStatusBarPropsRef = (props: StatusBarProps) => {
|
|
26
|
+
currentStatusBarPropsRef.current = {
|
|
27
|
+
...currentStatusBarPropsRef.current,
|
|
28
|
+
...props,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
18
32
|
const theme = useTheme();
|
|
19
33
|
const defaultColor = theme.palette.background.default;
|
|
20
34
|
|
|
@@ -22,6 +36,8 @@ export default function StatusBarProvider(props: StatusBarProviderProps) {
|
|
|
22
36
|
const [backgroundViewColor, setBackgroundViewColor] = React.useState(defaultColor);
|
|
23
37
|
|
|
24
38
|
const setBackgroundColor = (value: string) => {
|
|
39
|
+
mergeStatusBarPropsRef({ backgroundColor: value });
|
|
40
|
+
|
|
25
41
|
if (Platform.OS === 'android') {
|
|
26
42
|
RNStatusBar.setBackgroundColor(value);
|
|
27
43
|
}
|
|
@@ -32,10 +48,13 @@ export default function StatusBarProvider(props: StatusBarProviderProps) {
|
|
|
32
48
|
};
|
|
33
49
|
|
|
34
50
|
const setBarStyle = (value: StatusBarStyle, animated?: boolean) => {
|
|
51
|
+
mergeStatusBarPropsRef({ barStyle: value });
|
|
35
52
|
RNStatusBar.setBarStyle(value, animated);
|
|
36
53
|
};
|
|
37
54
|
|
|
38
55
|
const setHidden = (value: boolean) => {
|
|
56
|
+
mergeStatusBarPropsRef({ hidden: value });
|
|
57
|
+
|
|
39
58
|
if (Platform.OS === 'ios') {
|
|
40
59
|
setVisible(!value);
|
|
41
60
|
}
|
|
@@ -44,11 +63,88 @@ export default function StatusBarProvider(props: StatusBarProviderProps) {
|
|
|
44
63
|
};
|
|
45
64
|
|
|
46
65
|
const setTranslucent = (value: boolean) => {
|
|
66
|
+
mergeStatusBarPropsRef({ translucent: value });
|
|
67
|
+
|
|
47
68
|
if (Platform.OS === 'android') {
|
|
48
69
|
RNStatusBar.setTranslucent(value);
|
|
49
70
|
}
|
|
50
71
|
};
|
|
51
72
|
|
|
73
|
+
const updateStatusBarProps = (statusBarProps: StatusBarProps) => {
|
|
74
|
+
const {
|
|
75
|
+
barStyle,
|
|
76
|
+
animatedBarStyle,
|
|
77
|
+
backgroundColor,
|
|
78
|
+
hidden,
|
|
79
|
+
translucent,
|
|
80
|
+
} = statusBarProps;
|
|
81
|
+
|
|
82
|
+
if (!R.isNil(barStyle)) {
|
|
83
|
+
setBarStyle(barStyle, animatedBarStyle);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!R.isNil(backgroundColor)) {
|
|
87
|
+
setBackgroundColor(backgroundColor);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!R.isNil(hidden)) {
|
|
91
|
+
setHidden(hidden);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!R.isNil(translucent)) {
|
|
95
|
+
setTranslucent(translucent);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const restoreInitialStack = () => {
|
|
100
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const initialStatusBar = statusBarPropsStackRef.current[0];
|
|
105
|
+
updateStatusBarProps(initialStatusBar);
|
|
106
|
+
|
|
107
|
+
statusBarPropsStackRef.current = [statusBarPropsStackRef.current[0]];
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const clearStack = () => {
|
|
111
|
+
statusBarPropsStackRef.current = new Array<StatusBarProps>();
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const pushStack = (statusBarProps: StatusBarProps) => {
|
|
115
|
+
updateStatusBarProps(statusBarProps);
|
|
116
|
+
statusBarPropsStackRef.current.push(currentStatusBarPropsRef.current);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const replaceStack = (statusBarProps: StatusBarProps) => {
|
|
120
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
updateStatusBarProps(statusBarProps);
|
|
125
|
+
statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 1] = currentStatusBarPropsRef.current;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const popStack = () => {
|
|
129
|
+
if (statusBarPropsStackRef.current.length === 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const prevStack = statusBarPropsStackRef.current.length >= 2
|
|
134
|
+
? statusBarPropsStackRef.current[statusBarPropsStackRef.current.length - 2]
|
|
135
|
+
: undefined;
|
|
136
|
+
|
|
137
|
+
statusBarPropsStackRef.current.pop();
|
|
138
|
+
|
|
139
|
+
if (R.isNil(prevStack)) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
updateStatusBarProps(prevStack);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const getCurrentStatusBarProps = () => currentStatusBarPropsRef.current;
|
|
147
|
+
|
|
52
148
|
const shouldRenderBackgroundView = Platform.OS === 'ios' && visible;
|
|
53
149
|
|
|
54
150
|
const inset = useSafeAreaInsets();
|
|
@@ -70,6 +166,12 @@ export default function StatusBarProvider(props: StatusBarProviderProps) {
|
|
|
70
166
|
setBarStyle,
|
|
71
167
|
setHidden,
|
|
72
168
|
setTranslucent,
|
|
169
|
+
pushStack,
|
|
170
|
+
popStack,
|
|
171
|
+
replaceStack,
|
|
172
|
+
getCurrentStatusBarProps,
|
|
173
|
+
restoreInitialStack,
|
|
174
|
+
clearStack,
|
|
73
175
|
}}>
|
|
74
176
|
{shouldRenderBackgroundView ? (
|
|
75
177
|
<View style={backgroundViewStyle}/>
|