44import React , { memo , useCallback , useEffect , useRef , useState } from 'react' ;
55import classNames from 'classnames' ;
66import type { ReadonlyDeep } from 'type-fest' ;
7-
8- import { Button } from 'react-aria-components' ;
9- import { VisuallyHidden } from 'react-aria' ;
107import type {
118 DraftBodyRanges ,
129 HydratedBodyRangesType ,
@@ -80,13 +77,16 @@ import type { ForwardMessagesPayload } from '../state/ducks/globalModals';
8077import { ForwardMessagesModalType } from './ForwardMessagesModal' ;
8178import { SignalConversationMuteToggle } from './conversation/SignalConversationMuteToggle' ;
8279import { FunPicker } from './fun/FunPicker' ;
83- import * as RemoteConfig from '../RemoteConfig' ;
8480import type { FunEmojiSelection } from './fun/panels/FunPanelEmojis' ;
8581import type { FunStickerSelection } from './fun/panels/FunPanelStickers' ;
8682import type { FunGifSelection } from './fun/panels/FunPanelGifs' ;
8783import type { SmartDraftGifMessageSendModalProps } from '../state/smart/DraftGifMessageSendModal' ;
8884import { strictAssert } from '../util/assert' ;
8985import { ConfirmationDialog } from './ConfirmationDialog' ;
86+ import type { EmojiSkinTone } from './fun/data/emojis' ;
87+ import type { StickerPackType , StickerType } from '../state/ducks/stickers' ;
88+ import { FunPickerButton } from './fun/FunButton' ;
89+ import { isFunPickerEnabled } from './fun/isFunPickerEnabled' ;
9090
9191export type OwnProps = Readonly < {
9292 acceptedMessageRequest : boolean | null ;
@@ -207,6 +207,12 @@ export type OwnProps = Readonly<{
207207 toggleDraftGifMessageSendModal : (
208208 props : SmartDraftGifMessageSendModalProps | null
209209 ) => void ;
210+
211+ onPickEmoji : ( e : EmojiPickDataType ) => void ;
212+ emojiSkinToneDefault : EmojiSkinTone ;
213+ // StickerButton
214+ installedPacks : ReadonlyArray < StickerPackType > ;
215+ recentStickers : ReadonlyArray < StickerType > ;
210216} > ;
211217
212218export type Props = Pick <
@@ -597,11 +603,12 @@ export const CompositionArea = memo(function CompositionArea({
597603
598604 const showMediaQualitySelector = draftAttachments . some ( isImageAttachment ) ;
599605
600- const isFunPickerEnabled = RemoteConfig . isEnabled ( 'desktop.funPicker' ) ;
606+ const [ funPickerOpen , setFunPickerOpen ] = useState ( false ) ;
601607
602608 const handleFunPickerOpenChange = useCallback (
603- ( isOpen : boolean ) => {
604- if ( ! isOpen ) {
609+ ( open : boolean ) => {
610+ setFunPickerOpen ( open ) ;
611+ if ( ! open ) {
605612 setComposerFocus ( conversationId ) ;
606613 }
607614 } ,
@@ -703,25 +710,22 @@ export const CompositionArea = memo(function CompositionArea({
703710 { i18n ( 'icu:CompositionArea__ConfirmGifSelection__Body' ) }
704711 </ ConfirmationDialog >
705712 ) }
706- { isFunPickerEnabled && (
713+ { isFunPickerEnabled ( ) && (
707714 < div className = "CompositionArea__button-cell" >
708715 < FunPicker
709716 placement = "top start"
717+ open = { funPickerOpen }
710718 onOpenChange = { handleFunPickerOpenChange }
711719 onSelectEmoji = { handleFunPickerSelectEmoji }
712720 onSelectSticker = { handleFunPickerSelectSticker }
713721 onSelectGif = { handleFunPickerSelectGif }
714722 onAddStickerPack = { handleFunPickerAddStickerPack }
715723 >
716- < Button className = "CompositionArea__FunButton" >
717- < VisuallyHidden >
718- { i18n ( 'icu:CompositionArea__FunButtonLabel' ) }
719- </ VisuallyHidden >
720- </ Button >
724+ < FunPickerButton i18n = { i18n } />
721725 </ FunPicker >
722726 </ div >
723727 ) }
724- { ! isFunPickerEnabled && (
728+ { ! isFunPickerEnabled ( ) && (
725729 < div className = "CompositionArea__button-cell" >
726730 < EmojiButton
727731 emojiButtonApi = { emojiButtonRef }
@@ -731,6 +735,7 @@ export const CompositionArea = memo(function CompositionArea({
731735 recentEmojis = { recentEmojis }
732736 emojiSkinToneDefault = { emojiSkinToneDefault }
733737 onEmojiSkinToneDefaultChange = { onEmojiSkinToneDefaultChange }
738+ closeOnPick
734739 />
735740 </ div >
736741 ) }
@@ -809,7 +814,7 @@ export const CompositionArea = memo(function CompositionArea({
809814
810815 const stickerButtonPlacement = large ? 'top-start' : 'top-end' ;
811816 const stickerButtonFragment =
812- ! isFunPickerEnabled && ! draftEditMessage && withStickers ? (
817+ ! isFunPickerEnabled ( ) && ! draftEditMessage && withStickers ? (
813818 < div className = "CompositionArea__button-cell" >
814819 < StickerButton
815820 i18n = { i18n }
0 commit comments