diff --git a/app/soapbox/components/status_action_bar.js b/app/soapbox/components/status_action_bar.js
index 367ae7b04..fc85da343 100644
--- a/app/soapbox/components/status_action_bar.js
+++ b/app/soapbox/components/status_action_bar.js
@@ -19,7 +19,7 @@ import SoapboxPropTypes from 'soapbox/utils/soapbox_prop_types';
import { openModal } from '../actions/modals';
-import { IconButton, Text } from './ui';
+import { IconButton, Text, Hoverable } from './ui';
const messages = defineMessages({
@@ -547,7 +547,6 @@ class StatusActionBar extends ImmutablePureComponent {
render() {
const { status, intl, allowedEmoji, emojiSelectorFocused, handleEmojiSelectorUnfocus, features, me } = this.props;
- const { emojiSelectorVisible } = this.state;
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
@@ -664,18 +663,17 @@ class StatusActionBar extends ImmutablePureComponent {
{reblogCount !== 0 && {reblogCount}}
-
+ )}
>
-
{emojiReactCount}
)
)}
-
+
{shareButton}
diff --git a/app/soapbox/components/ui/hoverable/hoverable.tsx b/app/soapbox/components/ui/hoverable/hoverable.tsx
new file mode 100644
index 000000000..cca3cd6df
--- /dev/null
+++ b/app/soapbox/components/ui/hoverable/hoverable.tsx
@@ -0,0 +1,49 @@
+import Portal from '@reach/portal';
+import React, { useState, useRef } from 'react';
+
+interface IHoverable {
+ component: React.Component,
+}
+
+/** Wrapper to render a given component when hovered */
+const Hoverable: React.FC = ({
+ component,
+ children,
+}): JSX.Element => {
+
+ const [portalActive, setPortalActive] = useState(false);
+ const ref = useRef(null);
+
+ const handleMouseEnter = () => {
+ setPortalActive(true);
+ };
+
+ const handleMouseLeave = () => {
+ setPortalActive(false);
+ };
+
+ const setPortalPosition = (): React.CSSProperties => {
+ if (!ref.current) return {};
+
+ const { top, height, left, width } = ref.current.getBoundingClientRect();
+
+ return {
+ top: top + height,
+ left,
+ width,
+ };
+ };
+
+ return (
+
+ {children}
+ {portalActive &&
{component}
}
+
+ );
+};
+
+export default Hoverable;
diff --git a/app/soapbox/components/ui/index.ts b/app/soapbox/components/ui/index.ts
index fa60595f5..3aa272def 100644
--- a/app/soapbox/components/ui/index.ts
+++ b/app/soapbox/components/ui/index.ts
@@ -7,6 +7,7 @@ export { default as EmojiSelector } from './emoji-selector/emoji-selector';
export { default as Form } from './form/form';
export { default as FormActions } from './form-actions/form-actions';
export { default as FormGroup } from './form-group/form-group';
+export { default as Hoverable } from './hoverable/hoverable';
export { default as HStack } from './hstack/hstack';
export { default as Icon } from './icon/icon';
export { default as IconButton } from './icon-button/icon-button';