diff --git a/src/components/EmojiPicker/EmojiPickerButton.js b/src/components/EmojiPicker/EmojiPickerButton.js index 869fe1edbfe5..5888bf30b71a 100644 --- a/src/components/EmojiPicker/EmojiPickerButton.js +++ b/src/components/EmojiPicker/EmojiPickerButton.js @@ -5,8 +5,10 @@ import * as Expensicons from '@components/Icon/Expensicons'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; +import withNavigationFocus from '@components/withNavigationFocus'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; +import compose from '@libs/compose'; import getButtonState from '@libs/getButtonState'; import * as EmojiPickerAction from '@userActions/EmojiPickerAction'; @@ -43,6 +45,9 @@ function EmojiPickerButton(props) { style={({hovered, pressed}) => [styles.chatItemEmojiButton, StyleUtils.getButtonBackgroundColorStyle(getButtonState(hovered, pressed))]} disabled={props.isDisabled} onPress={() => { + if (!props.isFocused) { + return; + } if (!EmojiPickerAction.emojiPickerRef.current.isEmojiPickerVisible) { EmojiPickerAction.showEmojiPicker(props.onModalHide, props.onEmojiSelected, emojiPopoverAnchor.current, undefined, () => {}, props.emojiPickerID); } else { @@ -66,4 +71,4 @@ function EmojiPickerButton(props) { EmojiPickerButton.propTypes = propTypes; EmojiPickerButton.defaultProps = defaultProps; EmojiPickerButton.displayName = 'EmojiPickerButton'; -export default withLocalize(EmojiPickerButton); +export default compose(withLocalize, withNavigationFocus)(EmojiPickerButton); diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js index 1aeae46c252f..81c924cbc08d 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types'; -import React, {useMemo} from 'react'; +import React, {useCallback, useEffect, useMemo} from 'react'; import {View} from 'react-native'; import _ from 'underscore'; import AttachmentPicker from '@components/AttachmentPicker'; @@ -8,7 +8,9 @@ import * as Expensicons from '@components/Icon/Expensicons'; import PopoverMenu from '@components/PopoverMenu'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; +import withNavigationFocus from '@components/withNavigationFocus'; import useLocalize from '@hooks/useLocalize'; +import usePrevious from '@hooks/usePrevious'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as Browser from '@libs/Browser'; @@ -80,6 +82,9 @@ const propTypes = { // eslint-disable-next-line react/forbid-prop-types current: PropTypes.object, }).isRequired, + + /** Whether or not the screen is focused */ + isFocused: PropTypes.bool.isRequired, }; const defaultProps = { @@ -110,6 +115,7 @@ function AttachmentPickerWithMenuItems({ onAddActionPressed, onItemSelected, actionButtonRef, + isFocused, }) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -166,6 +172,24 @@ function AttachmentPickerWithMenuItems({ onMenuClosed(); }; + const prevIsFocused = usePrevious(isFocused); + + /** + * Check if current screen is inactive and previous screen is active. + * Used to close already opened popover menu when any other page is opened over current page. + * + * @return {Boolean} + */ + const didScreenBecomeInactive = useCallback(() => !isFocused && prevIsFocused, [isFocused, prevIsFocused]); + + // When the navigation is focused, we want to close the popover menu. + useEffect(() => { + if (!didScreenBecomeInactive() || !isMenuVisible) { + return; + } + setMenuVisibility(false); + }, [didScreenBecomeInactive, isMenuVisible, setMenuVisibility]); + return ( {({openPicker}) => { @@ -236,6 +260,9 @@ function AttachmentPickerWithMenuItems({ ref={actionButtonRef} onPress={(e) => { e.preventDefault(); + if (!isFocused) { + return; + } onAddActionPressed(); // Drop focus to avoid blue focus ring. @@ -253,7 +280,7 @@ function AttachmentPickerWithMenuItems({ { setMenuVisibility(false); @@ -283,4 +310,4 @@ AttachmentPickerWithMenuItems.propTypes = propTypes; AttachmentPickerWithMenuItems.defaultProps = defaultProps; AttachmentPickerWithMenuItems.displayName = 'AttachmentPickerWithMenuItems'; -export default AttachmentPickerWithMenuItems; +export default withNavigationFocus(AttachmentPickerWithMenuItems);