-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
PortalManager.tsx
54 lines (48 loc) · 1.27 KB
/
PortalManager.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import * as React from 'react';
import { View, StyleSheet } from 'react-native';
type State = {
portals: Array<{
key: number;
children: React.ReactNode;
}>;
};
/**
* Portal host is the component which actually renders all Portals.
*/
export default class PortalManager extends React.PureComponent<{}, State> {
state: State = {
portals: [],
};
mount = (key: number, children: React.ReactNode) => {
this.setState((state) => ({
portals: [...state.portals, { key, children }],
}));
};
update = (key: number, children: React.ReactNode) =>
this.setState((state) => ({
portals: state.portals.map((item) => {
if (item.key === key) {
return { ...item, children };
}
return item;
}),
}));
unmount = (key: number) =>
this.setState((state) => ({
portals: state.portals.filter((item) => item.key !== key),
}));
render() {
return this.state.portals.map(({ key, children }) => (
<View
key={key}
collapsable={
false /* Need collapsable=false here to clip the elevations, otherwise they appear above sibling components */
}
pointerEvents="box-none"
style={StyleSheet.absoluteFill}
>
{children}
</View>
));
}
}