emoji-picker-react 4.4.12 → 4.5.0

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.
Files changed (55) hide show
  1. package/README.md +64 -26
  2. package/dist/components/emoji/BaseEmojiProps.d.ts +12 -0
  3. package/dist/components/emoji/ClickableEmojiButton.d.ts +13 -0
  4. package/dist/components/emoji/Emoji.d.ts +3 -13
  5. package/dist/components/emoji/EmojiImg.d.ts +10 -0
  6. package/dist/components/emoji/ExportedEmoji.d.ts +2 -2
  7. package/dist/components/emoji/NativeEmoji.d.ts +5 -0
  8. package/dist/components/emoji/ViewOnlyEmoji.d.ts +3 -0
  9. package/dist/config/categoryConfig.d.ts +4 -0
  10. package/dist/config/config.d.ts +3 -1
  11. package/dist/config/customEmojiConfig.d.ts +6 -0
  12. package/dist/config/useConfig.d.ts +2 -0
  13. package/dist/data/emojis.d.ts +1 -0
  14. package/dist/dataUtils/DataTypes.d.ts +16 -6
  15. package/dist/dataUtils/alphaNumericEmojiIndex.d.ts +1 -0
  16. package/dist/dataUtils/emojiSelectors.d.ts +5 -3
  17. package/dist/emoji-picker-react.cjs.development.css +2 -2
  18. package/dist/emoji-picker-react.cjs.development.js +284 -184
  19. package/dist/emoji-picker-react.cjs.development.js.map +1 -1
  20. package/dist/emoji-picker-react.cjs.production.min.js +1 -1
  21. package/dist/emoji-picker-react.cjs.production.min.js.map +1 -1
  22. package/dist/emoji-picker-react.esm.js +294 -194
  23. package/dist/emoji-picker-react.esm.js.map +1 -1
  24. package/dist/hooks/preloadEmoji.d.ts +1 -1
  25. package/dist/hooks/useShouldHideCustomEmojis.d.ts +1 -0
  26. package/dist/typeRefinements/typeRefinements.d.ts +5 -0
  27. package/dist/types/exposedTypes.d.ts +1 -0
  28. package/package.json +5 -5
  29. package/src/components/context/PickerConfigContext.tsx +2 -1
  30. package/src/components/emoji/BaseEmojiProps.ts +13 -0
  31. package/src/components/emoji/ClickableEmojiButton.tsx +42 -0
  32. package/src/components/emoji/Emoji.css +2 -0
  33. package/src/components/emoji/Emoji.tsx +15 -125
  34. package/src/components/emoji/EmojiImg.tsx +31 -0
  35. package/src/components/emoji/ExportedEmoji.tsx +3 -2
  36. package/src/components/emoji/NativeEmoji.tsx +23 -0
  37. package/src/components/emoji/ViewOnlyEmoji.tsx +70 -0
  38. package/src/components/footer/Preview.tsx +1 -1
  39. package/src/components/navigation/CategoryNavigation.css +3 -0
  40. package/src/components/navigation/CategoryNavigation.tsx +8 -0
  41. package/src/config/categoryConfig.ts +10 -0
  42. package/src/config/config.ts +10 -2
  43. package/src/config/customEmojiConfig.ts +7 -0
  44. package/src/config/useConfig.ts +8 -2
  45. package/src/data/emojis.json +1 -1
  46. package/src/data/emojis.ts +1 -1
  47. package/src/dataUtils/DataTypes.ts +19 -6
  48. package/src/dataUtils/alphaNumericEmojiIndex.ts +16 -11
  49. package/src/dataUtils/emojiSelectors.ts +30 -11
  50. package/src/hooks/preloadEmoji.ts +1 -1
  51. package/src/hooks/useEmojiPreviewEvents.ts +0 -2
  52. package/src/hooks/useMouseDownHandlers.ts +1 -1
  53. package/src/hooks/useShouldHideCustomEmojis.ts +11 -0
  54. package/src/typeRefinements/typeRefinements.ts +17 -0
  55. package/src/types/exposedTypes.ts +1 -0
@@ -1,11 +1,24 @@
1
1
  import emojis from '../data/emojis';
2
2
 
3
- export type DataEmoji = {
4
- n: string[];
5
- u: string;
6
- v?: string[];
7
- a: string;
8
- };
3
+ export enum EmojiProperties {
4
+ name = 'n',
5
+ unified = 'u',
6
+ variations = 'v',
7
+ added_in = 'a',
8
+ imgUrl = 'imgUrl'
9
+ }
10
+
11
+ export interface DataEmoji extends WithName {
12
+ [EmojiProperties.unified]: string;
13
+ [EmojiProperties.variations]?: string[];
14
+ [EmojiProperties.added_in]: string;
15
+ [EmojiProperties.imgUrl]?: string;
16
+ }
17
+
9
18
  export type DataEmojis = DataEmoji[];
10
19
 
11
20
  export type DataGroups = keyof typeof emojis;
21
+
22
+ export type WithName = {
23
+ [EmojiProperties.name]: string[];
24
+ };
@@ -5,19 +5,24 @@ export const alphaNumericEmojiIndex: BaseIndex = {};
5
5
 
6
6
  setTimeout(() => {
7
7
  allEmojis.reduce((searchIndex, emoji) => {
8
- const joinedNameString = emojiNames(emoji)
9
- .flat()
10
- .join('')
11
- .replace(/[^a-zA-Z\d]/g, '')
12
- .split('');
13
-
14
- joinedNameString.forEach(char => {
15
- searchIndex[char] = searchIndex[char] ?? {};
16
-
17
- searchIndex[char][emojiUnified(emoji)] = emoji;
18
- });
8
+ indexEmoji(emoji);
19
9
  return searchIndex;
20
10
  }, alphaNumericEmojiIndex as BaseIndex);
21
11
  });
22
12
 
23
13
  type BaseIndex = Record<string, Record<string, DataEmoji>>;
14
+
15
+ export function indexEmoji(emoji: DataEmoji): void {
16
+ const joinedNameString = emojiNames(emoji)
17
+ .flat()
18
+ .join('')
19
+ .toLowerCase()
20
+ .replace(/[^a-zA-Z\d]/g, '')
21
+ .split('');
22
+
23
+ joinedNameString.forEach(char => {
24
+ alphaNumericEmojiIndex[char] = alphaNumericEmojiIndex[char] ?? {};
25
+
26
+ alphaNumericEmojiIndex[char][emojiUnified(emoji)] = emoji;
27
+ });
28
+ }
@@ -1,21 +1,16 @@
1
1
  import { Categories } from '../config/categoryConfig';
2
2
  import { cdnUrl } from '../config/cdnUrls';
3
+ import { CustomEmoji } from '../config/customEmojiConfig';
3
4
  import emojis from '../data/emojis';
4
5
  import skinToneVariations, {
5
6
  skinTonesMapped
6
7
  } from '../data/skinToneVariations';
7
- import { EmojiStyle, SkinTones } from '../types/exposedTypes';
8
+ import { EmojiStyle, SkinTones } from '../types/exposedTypes';
8
9
 
9
- import { DataEmoji, DataEmojis } from './DataTypes';
10
+ import { DataEmoji, DataEmojis, EmojiProperties, WithName } from './DataTypes';
11
+ import { indexEmoji } from './alphaNumericEmojiIndex';
10
12
 
11
- enum EmojiProperties {
12
- name = 'n',
13
- unified = 'u',
14
- variations = 'v',
15
- added_in = 'a'
16
- }
17
-
18
- export function emojiNames(emoji: DataEmoji): string[] {
13
+ export function emojiNames(emoji: WithName): string[] {
19
14
  return emoji[EmojiProperties.name] ?? [];
20
15
  }
21
16
 
@@ -23,7 +18,7 @@ export function addedIn(emoji: DataEmoji): number {
23
18
  return parseFloat(emoji[EmojiProperties.added_in]);
24
19
  }
25
20
 
26
- export function emojiName(emoji?: DataEmoji): string {
21
+ export function emojiName(emoji?: WithName): string {
27
22
  if (!emoji) {
28
23
  return '';
29
24
  }
@@ -97,6 +92,30 @@ export function emojiByUnified(unified?: string): DataEmoji | undefined {
97
92
 
98
93
  export const allEmojis: DataEmojis = Object.values(emojis).flat();
99
94
 
95
+ export function addCustomEmojis(customEmojis: CustomEmoji[]): void {
96
+ customEmojis.forEach(emoji => {
97
+ const emojiData = customToRegularEmoji(emoji);
98
+
99
+ if (allEmojisByUnified[emojiData[EmojiProperties.unified]]) {
100
+ return;
101
+ }
102
+
103
+ allEmojis.push(emojiData);
104
+ allEmojisByUnified[emojiData[EmojiProperties.unified]] = emojiData;
105
+ emojis[Categories.CUSTOM].push(emojiData as never);
106
+ indexEmoji(emojiData);
107
+ });
108
+ }
109
+
110
+ function customToRegularEmoji(emoji: CustomEmoji): DataEmoji {
111
+ return {
112
+ [EmojiProperties.name]: emoji.names.map(name => name.toLowerCase()),
113
+ [EmojiProperties.unified]: emoji.id.toLowerCase(),
114
+ [EmojiProperties.added_in]: '0',
115
+ [EmojiProperties.imgUrl]: emoji.imgUrl
116
+ };
117
+ }
118
+
100
119
  const allEmojisByUnified: {
101
120
  [unified: string]: DataEmoji;
102
121
  } = {};
@@ -1,4 +1,4 @@
1
- import { GetEmojiUrl } from '../components/emoji/Emoji';
1
+ import { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';
2
2
  import { DataEmoji } from '../dataUtils/DataTypes';
3
3
  import { emojiUnified, emojiVariations } from '../dataUtils/emojiSelectors';
4
4
  import { EmojiStyle } from '../types/exposedTypes';
@@ -42,7 +42,6 @@ export function useEmojiPreviewEvents(
42
42
  });
43
43
  bodyRef?.addEventListener('blur', onLeave, true);
44
44
 
45
-
46
45
  function onEnter(e: FocusEvent) {
47
46
  const button = buttonFromTarget(e.target as HTMLElement);
48
47
 
@@ -91,7 +90,6 @@ export function useEmojiPreviewEvents(
91
90
  }
92
91
  }
93
92
 
94
-
95
93
  return () => {
96
94
  bodyRef?.removeEventListener('mouseover', onMouseOver);
97
95
  bodyRef?.removeEventListener('mouseout', onLeave);
@@ -12,7 +12,6 @@ import {
12
12
  useEmojiVariationPickerState,
13
13
  useUpdateSuggested,
14
14
  } from '../components/context/PickerContext';
15
- import { GetEmojiUrl } from '../components/emoji/Emoji';
16
15
  import {
17
16
  useGetEmojiUrlConfig,
18
17
  useOnEmojiClickConfig,
@@ -30,6 +29,7 @@ import { EmojiClickData, EmojiStyle, SkinTones } from '../types/exposedTypes';
30
29
 
31
30
  import { useCloseAllOpenToggles } from './useCloseAllOpenToggles';
32
31
  import useSetVariationPicker from './useSetVariationPicker';
32
+ import { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';
33
33
 
34
34
  export function useMouseDownHandlers(
35
35
  BodyRef: React.MutableRefObject<NullableElement>
@@ -0,0 +1,11 @@
1
+ import { useCustomEmojisConfig } from '../config/useConfig';
2
+
3
+ export function useShouldHideCustomEmojis() {
4
+ const customCategoryConfig = useCustomEmojisConfig();
5
+
6
+ if (!customCategoryConfig) {
7
+ return false;
8
+ }
9
+
10
+ return customCategoryConfig.length === 0;
11
+ }
@@ -0,0 +1,17 @@
1
+ import {
2
+ Categories,
3
+ CategoryConfig,
4
+ CustomCategoryConfig
5
+ } from '../config/categoryConfig';
6
+ import { CustomEmoji } from '../config/customEmojiConfig';
7
+ import { DataEmoji } from '../dataUtils/DataTypes';
8
+
9
+ export function isCustomCategory(
10
+ category: CategoryConfig | CustomCategoryConfig
11
+ ): category is CustomCategoryConfig {
12
+ return category.category === Categories.CUSTOM;
13
+ }
14
+
15
+ export function isCustomEmoji(emoji: Partial<DataEmoji>): emoji is CustomEmoji {
16
+ return emoji.imgUrl !== undefined;
17
+ }
@@ -37,6 +37,7 @@ export enum SkinTones {
37
37
 
38
38
  export enum Categories {
39
39
  SUGGESTED = 'suggested',
40
+ CUSTOM = 'custom',
40
41
  SMILEYS_PEOPLE = 'smileys_people',
41
42
  ANIMALS_NATURE = 'animals_nature',
42
43
  FOOD_DRINK = 'food_drink',