diff --git a/app/soapbox/features/compose/components/compose_form.js b/app/soapbox/features/compose/components/compose_form.js
index 0bd15ab7a..08bb34d5a 100644
--- a/app/soapbox/features/compose/components/compose_form.js
+++ b/app/soapbox/features/compose/components/compose_form.js
@@ -376,7 +376,7 @@ class ComposeForm extends ImmutablePureComponent {
>
{features.media &&
}
-
+
{features.polls &&
}
{features.privacyScopes &&
}
{features.scheduledStatuses &&
}
diff --git a/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx b/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx
index 489f845c6..04d90f8cf 100644
--- a/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx
+++ b/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import { supportsPassiveEvents } from 'detect-passive-events';
-import React, { useEffect, useState } from 'react';
+import React, { useEffect, useState, useLayoutEffect } from 'react';
import { createPortal } from 'react-dom';
import { defineMessages, useIntl } from 'react-intl';
import { usePopper } from 'react-popper';
@@ -41,12 +41,31 @@ interface IEmojiPickerDropdown {
intl: any,
onPickEmoji: (emoji: Emoji) => void,
onSkinTone: () => void,
- skinTone: () => void,
+ condensed: boolean,
}
+// Fixes render bug where popover has a delayed position update
+const RenderAfter = ({ children, update }: any) => {
+ const [nextTick, setNextTick] = useState(false);
+
+ useEffect(() => {
+ setTimeout(() => {
+ setNextTick(true);
+ }, 0);
+ }, []);
+
+ useLayoutEffect(() => {
+ if (nextTick) {
+ update();
+ }
+ }, [nextTick, update]);
+
+ return nextTick ? children : null;
+};
+
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
-const EmojiPickerDropdown: React.FC
= ({ custom_emojis, frequentlyUsedEmojis, onPickEmoji, onSkinTone, skinTone }) => {
+const EmojiPickerDropdown: React.FC = ({ custom_emojis, frequentlyUsedEmojis, onPickEmoji, onSkinTone, condensed }) => {
const intl = useIntl();
const settings = useSettings();
const title = intl.formatMessage(messages.emoji);
@@ -54,14 +73,14 @@ const EmojiPickerDropdown: React.FC = ({ custom_emojis, fr
const theme = (userTheme === 'dark' || userTheme === 'light') ? userTheme : 'auto';
const [popperElement, setPopperElement] = useState(null);
- const [referenceElement, setReferenceElement] = useState(null);
+ const [popperReference, setPopperReference] = useState(null);
const [containerElement, setContainerElement] = useState(null);
const [visible, setVisible] = useState(false);
const [loading, setLoading] = useState(false);
- const { styles, attributes } = usePopper(referenceElement, popperElement, {
- placement: 'top-start',
+ const { styles, attributes, update } = usePopper(popperReference, popperElement, {
+ placement: condensed ? 'bottom-start' : 'top-start',
});
const handleToggle = () => {
@@ -145,21 +164,19 @@ const EmojiPickerDropdown: React.FC = ({ custom_emojis, fr
Popup = () => ;
} else {
Popup = () => (
-
-
-
+
);
}
@@ -170,7 +187,7 @@ const EmojiPickerDropdown: React.FC = ({ custom_emojis, fr
'text-gray-400 hover:text-gray-600': true,
'pulse-loading': visible && loading,
})}
- ref={setReferenceElement}
+ ref={setPopperReference}
src={require('@tabler/icons/icons/mood-happy.svg')}
title={title}
aria-label={title}
@@ -190,7 +207,11 @@ const EmojiPickerDropdown: React.FC = ({ custom_emojis, fr
style={styles.popper}
{...attributes.popper}
>
- {visible && ()}
+ {visible && (
+
+
+
+ )}
,
document.body,
)}
diff --git a/app/soapbox/features/ui/index.tsx b/app/soapbox/features/ui/index.tsx
index a207e5056..6c9af5d3a 100644
--- a/app/soapbox/features/ui/index.tsx
+++ b/app/soapbox/features/ui/index.tsx
@@ -551,7 +551,6 @@ const UI: React.FC = ({ children }) => {
// @ts-ignore
hotkeys.current.__mousetrap__.stopCallback = (_e, element) => {
- console.log(element.tagName);
return ['TEXTAREA', 'SELECT', 'INPUT', 'EM-EMOJI-PICKER'].includes(element.tagName);
};
};