emoji-picker-react 4.7.11 → 4.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,8 +6,7 @@
6
6
 
7
7
  ![image](https://github.com/ealush/emoji-picker-react/assets/11255103/48901306-e7fd-49cd-8f1e-9b214083a61d)
8
8
 
9
- ![reactions](https://github.com/ealush/emoji-picker-react/assets/11255103/c28cc954-dc1d-4d82-91a8-64a74cf1d598)
10
- ---
9
+ ## ![reactions](https://github.com/ealush/emoji-picker-react/assets/11255103/c28cc954-dc1d-4d82-91a8-64a74cf1d598)
11
10
 
12
11
  _If you enjoy using emoji-picker-react<br/>
13
12
  You should also consider trying:<br/>
@@ -65,6 +64,7 @@ The following props are accepted by them picker:
65
64
 
66
65
  | Prop | Type | Default | Description |
67
66
  | ---------------------- | ------------------------------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
67
+ | open | boolean | `true` | Controls whether the picker is open or not. |
68
68
  | onEmojiClick | function | | Callback function that is called when an emoji is clicked. The function receives the emoji object as a parameter. |
69
69
  | autoFocusSearch | boolean | `true` | Controls the auto focus of the search input. |
70
70
  | Theme | string | `light` | Controls the theme of the picker. Possible values are `light`, `dark` and `auto`. |
@@ -0,0 +1,2 @@
1
+ import { NullableElement } from './selectors';
2
+ export declare function detectEmojyPartiallyBelowFold(button: HTMLButtonElement, bodyRef: NullableElement): number;
@@ -0,0 +1,2 @@
1
+ import { PickerConfig } from './config';
2
+ export declare function compareConfig(prev: PickerConfig, next: PickerConfig): boolean;
@@ -34,6 +34,7 @@ export declare type PickerConfigInternal = {
34
34
  customEmojis: CustomEmoji[];
35
35
  reactionsDefaultOpen: boolean;
36
36
  reactions: string[];
37
+ open: boolean;
37
38
  };
38
39
  export declare type PreviewConfig = {
39
40
  defaultEmoji: string;
@@ -14,6 +14,7 @@ export declare function useEmojiStyleConfig(): EmojiStyle;
14
14
  export declare function useAutoFocusSearchConfig(): boolean;
15
15
  export declare function useCategoriesConfig(): CategoriesConfig;
16
16
  export declare function useCustomEmojisConfig(): CustomEmoji[];
17
+ export declare function useOpenConfig(): boolean;
17
18
  export declare function useOnEmojiClickConfig(mouseEventSource: MOUSE_EVENT_SOURCE): (emoji: EmojiClickData, event: MouseEvent) => void;
18
19
  export declare function usePreviewConfig(): PreviewConfig;
19
20
  export declare function useThemeConfig(): Theme;
@@ -187,6 +187,14 @@ function darkMode(key, value) {
187
187
  };
188
188
  }
189
189
 
190
+ // eslint-disable-next-line complexity
191
+ function compareConfig(prev, next) {
192
+ var _prev$customEmojis, _next$customEmojis;
193
+ var prevCustomEmojis = (_prev$customEmojis = prev.customEmojis) != null ? _prev$customEmojis : [];
194
+ var nextCustomEmojis = (_next$customEmojis = next.customEmojis) != null ? _next$customEmojis : [];
195
+ return prev.open === next.open && prev.emojiVersion === next.emojiVersion && prev.reactionsDefaultOpen === next.reactionsDefaultOpen && prev.searchPlaceHolder === next.searchPlaceHolder && prev.searchPlaceholder === next.searchPlaceholder && prev.defaultSkinTone === next.defaultSkinTone && prev.skinTonesDisabled === next.skinTonesDisabled && prev.autoFocusSearch === next.autoFocusSearch && prev.emojiStyle === next.emojiStyle && prev.theme === next.theme && prev.suggestedEmojisMode === next.suggestedEmojisMode && prev.lazyLoadEmojis === next.lazyLoadEmojis && prev.className === next.className && prev.height === next.height && prev.width === next.width && prev.style === next.style && prev.searchDisabled === next.searchDisabled && prev.skinTonePickerLocation === next.skinTonePickerLocation && prevCustomEmojis.length === nextCustomEmojis.length;
196
+ }
197
+
190
198
  var DEFAULT_REACTIONS = ['1f44d', '2764-fe0f', '1f603', '1f622', '1f64f', '1f44e', '1f621' // 😡
191
199
  ];
192
200
 
@@ -16835,7 +16843,8 @@ function basePickerConfig() {
16835
16843
  unicodeToHide: new Set(KNOWN_FAILING_EMOJIS),
16836
16844
  width: 350,
16837
16845
  reactionsDefaultOpen: false,
16838
- reactions: DEFAULT_REACTIONS
16846
+ reactions: DEFAULT_REACTIONS,
16847
+ open: true
16839
16848
  };
16840
16849
  }
16841
16850
  var basePreviewConfig = {
@@ -16855,20 +16864,20 @@ function PickerConfigProvider(_ref) {
16855
16864
  }, children);
16856
16865
  }
16857
16866
  function useSetConfig(config) {
16858
- var _config$customEmojis2;
16867
+ var _config$customEmojis;
16859
16868
  var _React$useState = React.useState(function () {
16860
16869
  return mergeConfig(config);
16861
16870
  }),
16862
16871
  mergedConfig = _React$useState[0],
16863
16872
  setMergedConfig = _React$useState[1];
16864
16873
  React.useEffect(function () {
16865
- var _config$customEmojis, _mergedConfig$customE;
16866
- if (((_config$customEmojis = config.customEmojis) == null ? void 0 : _config$customEmojis.length) !== ((_mergedConfig$customE = mergedConfig.customEmojis) == null ? void 0 : _mergedConfig$customE.length)) {
16867
- setMergedConfig(mergeConfig(config));
16874
+ if (compareConfig(mergedConfig, config)) {
16875
+ return;
16868
16876
  }
16877
+ setMergedConfig(mergeConfig(config));
16869
16878
  // not gonna...
16870
16879
  // eslint-disable-next-line react-hooks/exhaustive-deps
16871
- }, [(_config$customEmojis2 = config.customEmojis) == null ? void 0 : _config$customEmojis2.length]);
16880
+ }, [(_config$customEmojis = config.customEmojis) == null ? void 0 : _config$customEmojis.length, config.open, config.emojiVersion, config.reactionsDefaultOpen, config.searchPlaceHolder, config.searchPlaceholder, config.defaultSkinTone, config.skinTonesDisabled, config.autoFocusSearch, config.emojiStyle, config.theme, config.suggestedEmojisMode, config.lazyLoadEmojis, config.className, config.height, config.width, config.searchDisabled, config.skinTonePickerLocation]);
16872
16881
  return mergedConfig;
16873
16882
  }
16874
16883
  function usePickerConfig() {
@@ -16887,7 +16896,8 @@ function useDefineMutableConfig(config) {
16887
16896
  });
16888
16897
  React__default.useEffect(function () {
16889
16898
  MutableConfigRef.current.onEmojiClick = config.onEmojiClick || emptyFunc;
16890
- }, [config.onEmojiClick]);
16899
+ MutableConfigRef.current.onReactionClick = config.onReactionClick || config.onEmojiClick;
16900
+ }, [config.onEmojiClick, config.onReactionClick]);
16891
16901
  return MutableConfigRef;
16892
16902
  }
16893
16903
  function emptyFunc() {}
@@ -16936,6 +16946,11 @@ function useCustomEmojisConfig() {
16936
16946
  customEmojis = _usePickerConfig7.customEmojis;
16937
16947
  return customEmojis;
16938
16948
  }
16949
+ function useOpenConfig() {
16950
+ var _usePickerConfig8 = usePickerConfig(),
16951
+ open = _usePickerConfig8.open;
16952
+ return open;
16953
+ }
16939
16954
  function useOnEmojiClickConfig(mouseEventSource) {
16940
16955
  var _ref;
16941
16956
  var _useMutableConfig = useMutableConfig(),
@@ -16944,73 +16959,73 @@ function useOnEmojiClickConfig(mouseEventSource) {
16944
16959
  return handler || function () {};
16945
16960
  }
16946
16961
  function usePreviewConfig() {
16947
- var _usePickerConfig8 = usePickerConfig(),
16948
- previewConfig = _usePickerConfig8.previewConfig;
16962
+ var _usePickerConfig9 = usePickerConfig(),
16963
+ previewConfig = _usePickerConfig9.previewConfig;
16949
16964
  return previewConfig;
16950
16965
  }
16951
16966
  function useThemeConfig() {
16952
- var _usePickerConfig9 = usePickerConfig(),
16953
- theme = _usePickerConfig9.theme;
16967
+ var _usePickerConfig10 = usePickerConfig(),
16968
+ theme = _usePickerConfig10.theme;
16954
16969
  return theme;
16955
16970
  }
16956
16971
  function useSuggestedEmojisModeConfig() {
16957
- var _usePickerConfig10 = usePickerConfig(),
16958
- suggestedEmojisMode = _usePickerConfig10.suggestedEmojisMode;
16972
+ var _usePickerConfig11 = usePickerConfig(),
16973
+ suggestedEmojisMode = _usePickerConfig11.suggestedEmojisMode;
16959
16974
  return suggestedEmojisMode;
16960
16975
  }
16961
16976
  function useLazyLoadEmojisConfig() {
16962
- var _usePickerConfig11 = usePickerConfig(),
16963
- lazyLoadEmojis = _usePickerConfig11.lazyLoadEmojis;
16977
+ var _usePickerConfig12 = usePickerConfig(),
16978
+ lazyLoadEmojis = _usePickerConfig12.lazyLoadEmojis;
16964
16979
  return lazyLoadEmojis;
16965
16980
  }
16966
16981
  function useClassNameConfig() {
16967
- var _usePickerConfig12 = usePickerConfig(),
16968
- className = _usePickerConfig12.className;
16982
+ var _usePickerConfig13 = usePickerConfig(),
16983
+ className = _usePickerConfig13.className;
16969
16984
  return className;
16970
16985
  }
16971
16986
  function useStyleConfig() {
16972
- var _usePickerConfig13 = usePickerConfig(),
16973
- height = _usePickerConfig13.height,
16974
- width = _usePickerConfig13.width,
16975
- style = _usePickerConfig13.style;
16987
+ var _usePickerConfig14 = usePickerConfig(),
16988
+ height = _usePickerConfig14.height,
16989
+ width = _usePickerConfig14.width,
16990
+ style = _usePickerConfig14.style;
16976
16991
  return _extends({
16977
16992
  height: getDimension(height),
16978
16993
  width: getDimension(width)
16979
16994
  }, style);
16980
16995
  }
16981
16996
  function useReactionsOpenConfig() {
16982
- var _usePickerConfig14 = usePickerConfig(),
16983
- reactionsDefaultOpen = _usePickerConfig14.reactionsDefaultOpen;
16997
+ var _usePickerConfig15 = usePickerConfig(),
16998
+ reactionsDefaultOpen = _usePickerConfig15.reactionsDefaultOpen;
16984
16999
  return reactionsDefaultOpen;
16985
17000
  }
16986
17001
  function useEmojiVersionConfig() {
16987
- var _usePickerConfig15 = usePickerConfig(),
16988
- emojiVersion = _usePickerConfig15.emojiVersion;
17002
+ var _usePickerConfig16 = usePickerConfig(),
17003
+ emojiVersion = _usePickerConfig16.emojiVersion;
16989
17004
  return emojiVersion;
16990
17005
  }
16991
17006
  function useSearchDisabledConfig() {
16992
- var _usePickerConfig16 = usePickerConfig(),
16993
- searchDisabled = _usePickerConfig16.searchDisabled;
17007
+ var _usePickerConfig17 = usePickerConfig(),
17008
+ searchDisabled = _usePickerConfig17.searchDisabled;
16994
17009
  return searchDisabled;
16995
17010
  }
16996
17011
  function useSkinTonePickerLocationConfig() {
16997
- var _usePickerConfig17 = usePickerConfig(),
16998
- skinTonePickerLocation = _usePickerConfig17.skinTonePickerLocation;
17012
+ var _usePickerConfig18 = usePickerConfig(),
17013
+ skinTonePickerLocation = _usePickerConfig18.skinTonePickerLocation;
16999
17014
  return skinTonePickerLocation;
17000
17015
  }
17001
17016
  function useUnicodeToHide() {
17002
- var _usePickerConfig18 = usePickerConfig(),
17003
- unicodeToHide = _usePickerConfig18.unicodeToHide;
17017
+ var _usePickerConfig19 = usePickerConfig(),
17018
+ unicodeToHide = _usePickerConfig19.unicodeToHide;
17004
17019
  return unicodeToHide;
17005
17020
  }
17006
17021
  function useReactionsConfig() {
17007
- var _usePickerConfig19 = usePickerConfig(),
17008
- reactions = _usePickerConfig19.reactions;
17022
+ var _usePickerConfig20 = usePickerConfig(),
17023
+ reactions = _usePickerConfig20.reactions;
17009
17024
  return reactions;
17010
17025
  }
17011
17026
  function useGetEmojiUrlConfig() {
17012
- var _usePickerConfig20 = usePickerConfig(),
17013
- getEmojiUrl = _usePickerConfig20.getEmojiUrl;
17027
+ var _usePickerConfig21 = usePickerConfig(),
17028
+ getEmojiUrl = _usePickerConfig21.getEmojiUrl;
17014
17029
  return getEmojiUrl;
17015
17030
  }
17016
17031
  function getDimension(dimensionConfig) {
@@ -18917,6 +18932,16 @@ var styles$9 = /*#__PURE__*/stylesheet.create({
18917
18932
  }
18918
18933
  });
18919
18934
 
18935
+ function detectEmojyPartiallyBelowFold(button, bodyRef) {
18936
+ if (!button || !bodyRef) {
18937
+ return 0;
18938
+ }
18939
+ var buttonRect = button.getBoundingClientRect();
18940
+ var bodyRect = bodyRef.getBoundingClientRect();
18941
+ // If the element is obscured by at least half of its size
18942
+ return bodyRect.height - (buttonRect.y - bodyRect.y);
18943
+ }
18944
+
18920
18945
  function useEmojiPreviewEvents(allow, setPreviewEmoji) {
18921
18946
  var BodyRef = useBodyRef();
18922
18947
  var isMouseDisallowed = useIsMouseDisallowed();
@@ -18970,6 +18995,18 @@ function useEmojiPreviewEvents(allow, setPreviewEmoji) {
18970
18995
  }
18971
18996
  var button = buttonFromTarget(e.target);
18972
18997
  if (button) {
18998
+ var belowFoldByPx = detectEmojyPartiallyBelowFold(button, bodyRef);
18999
+ var buttonHeight = button.getBoundingClientRect().height;
19000
+ if (belowFoldByPx < buttonHeight / 2) {
19001
+ return;
19002
+ }
19003
+ if (belowFoldByPx < buttonHeight) {
19004
+ button.scrollIntoView({
19005
+ behavior: 'smooth',
19006
+ block: 'end'
19007
+ });
19008
+ return;
19009
+ }
18973
19010
  focusElement(button);
18974
19011
  }
18975
19012
  }
@@ -20183,7 +20220,7 @@ function useOnFocus() {
20183
20220
  var _excluded$1 = ["width", "height"];
20184
20221
  function PickerMain(_ref) {
20185
20222
  var children = _ref.children;
20186
- return React.createElement(PickerContextProvider, null, React.createElement(PickerStyleTag, null), React.createElement(PickerRootElement, null, children));
20223
+ return React.createElement(PickerContextProvider, null, React.createElement(PickerRootElement, null, children));
20187
20224
  }
20188
20225
  function PickerRootElement(_ref2) {
20189
20226
  var _cx;
@@ -20349,7 +20386,7 @@ var styles$j = /*#__PURE__*/stylesheet.create({
20349
20386
  });
20350
20387
 
20351
20388
  function EmojiPicker(props) {
20352
- return React.createElement(ElementRefContextProvider, null, React.createElement(PickerConfigProvider, Object.assign({}, props), React.createElement(ContentControl, null)));
20389
+ return React.createElement(ElementRefContextProvider, null, React.createElement(PickerStyleTag, null), React.createElement(PickerConfigProvider, Object.assign({}, props), React.createElement(ContentControl, null)));
20353
20390
  }
20354
20391
  function ContentControl() {
20355
20392
  var _useReactionsModeStat = useReactionsModeState(),
@@ -20357,20 +20394,19 @@ function ContentControl() {
20357
20394
  var _React$useState = React.useState(!reactionsDefaultOpen),
20358
20395
  renderAll = _React$useState[0],
20359
20396
  setRenderAll = _React$useState[1];
20397
+ var isOpen = useOpenConfig();
20360
20398
  React.useEffect(function () {
20361
20399
  if (!renderAll) {
20362
20400
  setRenderAll(true);
20363
20401
  }
20364
20402
  }, [renderAll]);
20403
+ if (!isOpen) {
20404
+ return null;
20405
+ }
20365
20406
  return React.createElement(PickerMain, null, React.createElement(Reactions, null), renderAll ? React.createElement(React.Fragment, null, React.createElement(Header, null), React.createElement(Body, null), React.createElement(Preview, null)) : null);
20366
20407
  }
20367
20408
  // eslint-disable-next-line complexity
20368
- var EmojiPickerReact = /*#__PURE__*/React.memo(EmojiPicker, function (prev, next) {
20369
- var _prev$customEmojis, _next$customEmojis;
20370
- var prevCustomEmojis = (_prev$customEmojis = prev.customEmojis) != null ? _prev$customEmojis : [];
20371
- var nextCustomEmojis = (_next$customEmojis = next.customEmojis) != null ? _next$customEmojis : [];
20372
- return prev.emojiVersion === next.emojiVersion && prev.reactionsDefaultOpen === next.reactionsDefaultOpen && prev.searchPlaceHolder === next.searchPlaceHolder && prev.searchPlaceholder === next.searchPlaceholder && prev.defaultSkinTone === next.defaultSkinTone && prev.skinTonesDisabled === next.skinTonesDisabled && prev.autoFocusSearch === next.autoFocusSearch && prev.emojiStyle === next.emojiStyle && prev.theme === next.theme && prev.suggestedEmojisMode === next.suggestedEmojisMode && prev.lazyLoadEmojis === next.lazyLoadEmojis && prev.className === next.className && prev.height === next.height && prev.width === next.width && prev.style === next.style && prev.searchDisabled === next.searchDisabled && prev.skinTonePickerLocation === next.skinTonePickerLocation && prevCustomEmojis.length === nextCustomEmojis.length;
20373
- });
20409
+ var EmojiPickerReact = /*#__PURE__*/React.memo(EmojiPicker, compareConfig);
20374
20410
 
20375
20411
  var ErrorBoundary = /*#__PURE__*/function (_React$Component) {
20376
20412
  _inheritsLoose(ErrorBoundary, _React$Component);