11/* eslint-disable typescript-sort-keys/interface */
22import React , { useEffect , useState } from 'react' ;
33import { usePopper } from 'react-popper' ;
4-
54import Picker from '@emoji-mart/react' ;
65
6+ import type { Options } from '@popperjs/core' ;
7+
78import {
89 ThemeVersion ,
910 useChatContext ,
@@ -16,19 +17,29 @@ import { Tooltip } from '../Tooltip';
1617export type EmojiPickerProps = {
1718 ButtonIconComponent ?: React . ComponentType ;
1819 buttonClassName ?: string ;
19- emojiPickerContainerClassName ?: string ;
20+ pickerContainerClassName ?: string ;
2021 wrapperClassName ?: string ;
22+ /**
23+ * Untyped [properties](https://github.com/missive/emoji-mart/tree/v5.5.2#options--props) to be
24+ * passed to the [emoji-mart `Picker`](https://github.com/missive/emoji-mart/tree/v5.5.2#-picker) component
25+ */
26+ pickerProps ?: { theme : 'auto' | 'light' | 'dark' } & Record < string , unknown > ;
27+ /**
28+ * [React Popper options](https://popper.js.org/docs/v2/constructors/#options) to be
29+ * passed to the [react-popper `usePopper`](https://popper.js.org/react-popper/v2/hook/) hook
30+ */
31+ popperOptions ?: Options ;
2132} ;
2233
2334const classNames : Record < ThemeVersion , EmojiPickerProps > = {
2435 1 : {
2536 buttonClassName : 'str-chat__input-flat-emojiselect' ,
26- emojiPickerContainerClassName : undefined ,
37+ pickerContainerClassName : undefined ,
2738 wrapperClassName : 'str-chat__emojiselect-wrapper' ,
2839 } ,
2940 2 : {
3041 buttonClassName : 'str-chat__emoji-picker-button' ,
31- emojiPickerContainerClassName : 'str-chat__message-textarea-emoji-picker-container' ,
42+ pickerContainerClassName : 'str-chat__message-textarea-emoji-picker-container' ,
3243 wrapperClassName : 'str-chat__message-textarea-emoji-picker' ,
3344 } ,
3445} ;
@@ -42,11 +53,10 @@ export const EmojiPicker = (props: EmojiPickerProps) => {
4253 const [ popperElement , setPopperElement ] = useState < HTMLDivElement | null > ( null ) ;
4354 const { attributes, styles } = usePopper ( referenceElement , popperElement , {
4455 placement : themeVersion === '2' ? 'top-end' : 'top-start' ,
56+ ...props . popperOptions ,
4557 } ) ;
4658
47- const { buttonClassName, emojiPickerContainerClassName, wrapperClassName } = classNames [
48- themeVersion
49- ] ;
59+ const { buttonClassName, pickerContainerClassName, wrapperClassName } = classNames [ themeVersion ] ;
5060
5161 const { ButtonIconComponent = themeVersion === '2' ? EmojiPickerIcon : EmojiIconLarge } = props ;
5262
@@ -69,18 +79,18 @@ export const EmojiPicker = (props: EmojiPickerProps) => {
6979 < div className = { props . wrapperClassName ?? wrapperClassName } >
7080 { displayPicker && (
7181 < div
72- className = { props . emojiPickerContainerClassName ?? emojiPickerContainerClassName }
82+ className = { props . pickerContainerClassName ?? pickerContainerClassName }
7383 style = { styles . popper }
7484 { ...attributes . popper }
7585 ref = { setPopperElement }
7686 >
7787 < Picker
7888 data = { async ( ) => ( await import ( '@emoji-mart/data' ) ) . default }
79- onEmojiSelect = { ( e : unknown ) => {
80- // @ts -ignore emoji-mart is missing types
89+ onEmojiSelect = { ( e : { native : string } ) => {
8190 insertText ( e . native ) ;
8291 textareaRef . current ?. focus ( ) ;
8392 } }
93+ { ...props . pickerProps }
8494 />
8595 </ div >
8696 ) }
0 commit comments