Skip to content

Commit 37c1b2d

Browse files
committed
fix: menu unmount issue
1 parent f69e3d5 commit 37c1b2d

File tree

3 files changed

+71
-67
lines changed

3 files changed

+71
-67
lines changed

src/components/composites/Menu/Menu.tsx

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -79,36 +79,35 @@ const Menu = (
7979
return (
8080
<>
8181
{updatedTrigger()}
82-
{isOpen && (
83-
<Overlay
84-
isOpen={isOpen}
85-
onRequestClose={handleClose}
86-
useRNModalOnAndroid
87-
{..._overlay}
88-
>
89-
<PresenceTransition visible={isOpen} {..._presenceTransition}>
90-
<Popper
91-
triggerRef={triggerRef}
92-
onClose={handleClose}
93-
placement={placement}
94-
{...resolvedProps}
95-
>
96-
<Backdrop onPress={handleClose} {..._backdrop} />
97-
<Popper.Content isOpen={isOpen}>
98-
<MenuContext.Provider
99-
value={{ closeOnSelect, onClose: handleClose }}
100-
>
101-
<FocusScope contain restoreFocus autoFocus>
102-
<MenuContent menuRef={ref} {...resolvedProps}>
103-
{children}
104-
</MenuContent>
105-
</FocusScope>
106-
</MenuContext.Provider>
107-
</Popper.Content>
108-
</Popper>
109-
</PresenceTransition>
110-
</Overlay>
111-
)}
82+
<Overlay
83+
isOpen={isOpen}
84+
onRequestClose={handleClose}
85+
useRNModalOnAndroid
86+
{..._overlay}
87+
unmountOnExit
88+
>
89+
<PresenceTransition visible={isOpen} {..._presenceTransition}>
90+
<Popper
91+
triggerRef={triggerRef}
92+
onClose={handleClose}
93+
placement={placement}
94+
{...resolvedProps}
95+
>
96+
<Backdrop onPress={handleClose} {..._backdrop} />
97+
<Popper.Content isOpen={isOpen}>
98+
<MenuContext.Provider
99+
value={{ closeOnSelect, onClose: handleClose }}
100+
>
101+
<FocusScope contain restoreFocus autoFocus>
102+
<MenuContent menuRef={ref} {...resolvedProps}>
103+
{children}
104+
</MenuContent>
105+
</FocusScope>
106+
</MenuContext.Provider>
107+
</Popper.Content>
108+
</Popper>
109+
</PresenceTransition>
110+
</Overlay>
112111
</>
113112
);
114113
};

src/components/composites/Popover/Popover.tsx

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -73,44 +73,43 @@ const Popover = (
7373
return (
7474
<Box ref={ref}>
7575
{updatedTrigger()}
76-
{isOpen && (
77-
<Overlay
78-
isOpen={isOpen}
79-
onRequestClose={handleClose}
80-
useRNModalOnAndroid
76+
<Overlay
77+
isOpen={isOpen}
78+
onRequestClose={handleClose}
79+
useRNModalOnAndroid
80+
unmountOnExit
81+
>
82+
<PresenceTransition
83+
initial={{ opacity: 0 }}
84+
animate={{ opacity: 1, transition: { duration: 150 } }}
85+
exit={{ opacity: 0, scale: 0.95, transition: { duration: 100 } }}
86+
visible={isOpen}
87+
style={StyleSheet.absoluteFill}
8188
>
82-
<PresenceTransition
83-
initial={{ opacity: 0 }}
84-
animate={{ opacity: 1, transition: { duration: 150 } }}
85-
exit={{ opacity: 0, scale: 0.95, transition: { duration: 100 } }}
86-
visible={isOpen}
87-
style={StyleSheet.absoluteFill}
88-
>
89-
<Popper onClose={handleClose} triggerRef={triggerRef} {...props}>
90-
<Backdrop onPress={handleClose} bg="transparent" />
91-
<PopoverContext.Provider
92-
value={{
93-
onClose: handleClose,
94-
initialFocusRef,
95-
finalFocusRef,
96-
popoverContentId,
97-
bodyId,
98-
headerId,
99-
headerMounted,
100-
bodyMounted,
101-
setBodyMounted,
102-
setHeaderMounted,
103-
isOpen,
104-
}}
105-
>
106-
<FocusScope contain={trapFocus} restoreFocus autoFocus>
107-
{children}
108-
</FocusScope>
109-
</PopoverContext.Provider>
110-
</Popper>
111-
</PresenceTransition>
112-
</Overlay>
113-
)}
89+
<Popper onClose={handleClose} triggerRef={triggerRef} {...props}>
90+
<Backdrop onPress={handleClose} bg="transparent" />
91+
<PopoverContext.Provider
92+
value={{
93+
onClose: handleClose,
94+
initialFocusRef,
95+
finalFocusRef,
96+
popoverContentId,
97+
bodyId,
98+
headerId,
99+
headerMounted,
100+
bodyMounted,
101+
setBodyMounted,
102+
setHeaderMounted,
103+
isOpen,
104+
}}
105+
>
106+
<FocusScope contain={trapFocus} restoreFocus autoFocus>
107+
{children}
108+
</FocusScope>
109+
</PopoverContext.Provider>
110+
</Popper>
111+
</PresenceTransition>
112+
</Overlay>
114113
</Box>
115114
);
116115
};

src/components/primitives/Overlay/Overlay.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface IOverlayProps {
1515
isKeyboardDismissable?: boolean;
1616
animationPreset?: 'fade' | 'slide' | 'none';
1717
style?: ViewStyle;
18+
unmountOnExit?: boolean;
1819
}
1920

2021
export function Overlay({
@@ -26,6 +27,7 @@ export function Overlay({
2627
animationPreset = 'fade',
2728
onRequestClose,
2829
style,
30+
unmountOnExit,
2931
}: IOverlayProps) {
3032
const [exited, setExited] = React.useState(!isOpen);
3133

@@ -56,6 +58,10 @@ export function Overlay({
5658
);
5759
}
5860

61+
if (unmountOnExit && !isOpen && exited) {
62+
return null;
63+
}
64+
5965
return (
6066
//@ts-ignore
6167
<OverlayContainer style={{ ...styleObj }}>

0 commit comments

Comments
 (0)