From 1962c6544e319a9b3f0183671a7c702f53202dda Mon Sep 17 00:00:00 2001 From: ewwwwwwww Date: Tue, 5 Jul 2022 12:57:41 -0700 Subject: [PATCH] emoji-picker fixes --- .../compose/components/compose_form.js | 2 +- .../components/emoji_picker_dropdown.tsx | 67 ++++++++++++------- app/soapbox/features/ui/index.tsx | 1 - 3 files changed, 45 insertions(+), 25 deletions(-) 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); }; };