diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 145b20c3..89169afc 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -57,6 +57,7 @@ import { getMentions, } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; +import { UseStateProvider } from '../../components/UseStateProvider'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { TUploadContent, @@ -606,34 +607,29 @@ export const RoomInput = forwardRef( ); - const closeEmojiBoard = () => { - setEmojiBoardTab(undefined); - if (!mobileOrTablet()) ReactEditor.focus(editor); - }; - - const emojiBoard = ( + // The native dock renders the board in the composer's top slot, so its + // open/close state lives here (only read on native). Desktop keeps its + // state isolated inside the UseStateProvider below so opening the pop-out + // doesn't re-render the whole composer. + const dockedEmojiBoard = dockEmojiBoard && emojiBoardTab !== undefined && ( setEmojiBoardTab(undefined)} /> ); - const emojiTriggerButton = ( + const emojiButton = dockEmojiBoard ? ( - dockEmojiBoard - ? setEmojiBoardTab(emojiBoardTab ? undefined : EmojiBoardTab.Emoji) - : setEmojiBoardTab(EmojiBoardTab.Emoji) - } + onClick={() => setEmojiBoardTab(emojiBoardTab ? undefined : EmojiBoardTab.Emoji)} variant="SurfaceVariant" fill="None" size="300" @@ -641,27 +637,54 @@ export const RoomInput = forwardRef( > - ); - - // Native docks the board inline (rendered in the composer's top slot); the - // desktop trigger keeps the floating pop-out anchored to the button. - const emojiButton = dockEmojiBoard ? ( - emojiTriggerButton ) : ( - - {emojiTriggerButton} - + + {(emojiTab: EmojiBoardTab | undefined, setEmojiTab) => ( + { + setEmojiTab((tab) => { + if (tab) { + if (!mobileOrTablet()) ReactEditor.focus(editor); + return undefined; + } + return tab; + }); + }} + /> + } + > + setEmojiTab(EmojiBoardTab.Emoji)} + variant="SurfaceVariant" + fill="None" + size="300" + radii="300" + > + + + + )} + ); const sendButton = ( @@ -799,7 +822,7 @@ export const RoomInput = forwardRef( onPaste={handlePaste} top={ <> - {dockEmojiBoard && emojiBoardTab !== undefined && emojiBoard} + {dockedEmojiBoard} {replyDraft && (