Skip to content

Commit 06a139a

Browse files
feat: add pickerProps & popperOptions to EmojiPicker
1 parent 5c427b7 commit 06a139a

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/components/Emojis/EmojiPicker.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
/* eslint-disable typescript-sort-keys/interface */
22
import React, { useEffect, useState } from 'react';
33
import { usePopper } from 'react-popper';
4-
54
import Picker from '@emoji-mart/react';
65

6+
import type { Options } from '@popperjs/core';
7+
78
import {
89
ThemeVersion,
910
useChatContext,
@@ -16,19 +17,29 @@ import { Tooltip } from '../Tooltip';
1617
export 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

2334
const 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

Comments
 (0)