diff --git a/assets/images/add-reaction.svg b/assets/images/add-reaction.svg
new file mode 100644
index 000000000000..a576e2c84622
--- /dev/null
+++ b/assets/images/add-reaction.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/CONST.js b/src/CONST.js
index b8c26f163376..a9a12482a461 100755
--- a/src/CONST.js
+++ b/src/CONST.js
@@ -973,6 +973,32 @@ const CONST = {
MAKE_REQUEST_WITH_SIDE_EFFECTS: 'makeRequestWithSideEffects',
},
+ QUICK_REACTIONS: [
+ {
+ name: '+1',
+ code: '👍',
+ types: [
+ '👍🏿',
+ '👍🏾',
+ '👍🏽',
+ '👍🏼',
+ '👍🏻',
+ ],
+ },
+ {
+ name: 'heart',
+ code: '❤️',
+ },
+ {
+ name: 'joy',
+ code: '😂',
+ },
+ {
+ name: 'fire',
+ code: '🔥',
+ },
+ ],
+
TFA_CODE_LENGTH: 6,
CHAT_ATTACHMENT_TOKEN_KEY: 'X-Chat-Attachment-Token',
diff --git a/src/components/BaseMiniContextMenuItem.js b/src/components/BaseMiniContextMenuItem.js
new file mode 100644
index 000000000000..c91df470ba34
--- /dev/null
+++ b/src/components/BaseMiniContextMenuItem.js
@@ -0,0 +1,77 @@
+import {Pressable, View} from 'react-native';
+import React from 'react';
+import PropTypes from 'prop-types';
+import _ from 'underscore';
+import styles from '../styles/styles';
+import * as StyleUtils from '../styles/StyleUtils';
+import getButtonState from '../libs/getButtonState';
+import variables from '../styles/variables';
+import Tooltip from './Tooltip';
+
+const propTypes = {
+ /**
+ * Text to display when hovering the menu item
+ */
+ tooltipText: PropTypes.string.isRequired,
+
+ /**
+ * Callback to fire on press
+ */
+ onPress: PropTypes.func.isRequired,
+
+ /**
+ * The children to display within the menu item
+ */
+ children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]).isRequired,
+
+ /**
+ * Whether the button should be in the active state
+ */
+ isDelayButtonStateComplete: PropTypes.bool,
+
+ /**
+ * A ref to forward to the Pressable
+ */
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+};
+
+const defaultProps = {
+ isDelayButtonStateComplete: true,
+ innerRef: () => {},
+};
+
+/**
+ * Component that renders a mini context menu item with a
+ * pressable. Also renders a tooltip when hovering the item.
+ * @param {Object} props
+ * @returns {JSX.Element}
+ */
+const BaseMiniContextMenuItem = props => (
+
+ [
+ styles.reportActionContextMenuMiniButton,
+ StyleUtils.getButtonBackgroundColorStyle(getButtonState(hovered, pressed, props.isDelayButtonStateComplete)),
+ ]
+ }
+ >
+ {pressableState => (
+
+ {_.isFunction(props.children) ? props.children(pressableState) : props.children}
+
+ )}
+
+
+);
+
+BaseMiniContextMenuItem.propTypes = propTypes;
+BaseMiniContextMenuItem.defaultProps = defaultProps;
+BaseMiniContextMenuItem.displayName = 'BaseMiniContextMenuItem';
+
+// eslint-disable-next-line react/jsx-props-no-spreading
+export default React.forwardRef((props, ref) => );
diff --git a/src/components/ContextMenuItem.js b/src/components/ContextMenuItem.js
index c87fc5e9b4c3..9dace75bec03 100644
--- a/src/components/ContextMenuItem.js
+++ b/src/components/ContextMenuItem.js
@@ -1,14 +1,12 @@
import React, {Component} from 'react';
import PropTypes from 'prop-types';
-import {Pressable, View} from 'react-native';
import MenuItem from './MenuItem';
-import Tooltip from './Tooltip';
import Icon from './Icon';
import styles from '../styles/styles';
import * as StyleUtils from '../styles/StyleUtils';
import getButtonState from '../libs/getButtonState';
import withDelayToggleButtonState, {withDelayToggleButtonStatePropTypes} from './withDelayToggleButtonState';
-import variables from '../styles/variables';
+import BaseMiniContextMenuItem from './BaseMiniContextMenuItem';
const propTypes = {
/** Icon Component */
@@ -75,29 +73,19 @@ class ContextMenuItem extends Component {
return (
this.props.isMini
? (
-
- [
- styles.reportActionContextMenuMiniButton,
- StyleUtils.getButtonBackgroundColorStyle(getButtonState(hovered, pressed, this.props.isDelayButtonStateComplete)),
- ]
- }
- >
- {({hovered, pressed}) => (
-
-
-
- )}
-
-
+
+ {({hovered, pressed}) => (
+
+ )}
+
) : (