emoji-picker-react 4.22.1 → 4.22.2

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.
@@ -172,27 +172,54 @@ function compareConfig(prev, next) {
172
172
  var _prev$customEmojis, _next$customEmojis;
173
173
  var prevCustomEmojis = (_prev$customEmojis = prev.customEmojis) != null ? _prev$customEmojis : [];
174
174
  var nextCustomEmojis = (_next$customEmojis = next.customEmojis) != null ? _next$customEmojis : [];
175
- return prev.open === next.open && prev.emojiVersion === next.emojiVersion && prev.reactionsDefaultOpen === next.reactionsDefaultOpen && prev.searchPlaceHolder === next.searchPlaceHolder && prev.searchPlaceholder === next.searchPlaceholder && prev.searchClearButtonLabel === next.searchClearButtonLabel && 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 && customEmojisKey(prevCustomEmojis) === customEmojisKey(nextCustomEmojis) && categoriesKey(prev.categories) === categoriesKey(next.categories) && prev.emojiData === next.emojiData;
175
+ return prev.open === next.open && prev.emojiVersion === next.emojiVersion && prev.reactionsDefaultOpen === next.reactionsDefaultOpen && prev.searchPlaceHolder === next.searchPlaceHolder && prev.searchPlaceholder === next.searchPlaceholder && prev.searchClearButtonLabel === next.searchClearButtonLabel && 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 && customEmojisEqual(prevCustomEmojis, nextCustomEmojis) && categoriesEqual(prev.categories, next.categories) && prev.emojiData === next.emojiData;
176
176
  }
177
177
  /**
178
- * Content identity for custom emojis. Length alone misses regroups and
179
- * swaps, which would leave merged categories, search, and sections stale.
178
+ * Structural content equality for custom emojis. Length alone misses
179
+ * regroups and swaps, which would leave merged categories, search, and
180
+ * sections stale. Fields are compared element-wise (never serialized
181
+ * with delimiters) so user-controlled values cannot collide.
180
182
  */
181
- function customEmojisKey(customEmojis) {
182
- return customEmojis.map(function (emoji) {
183
- var _emoji$group;
184
- return emoji.id + ":" + ((_emoji$group = emoji.group) != null ? _emoji$group : '') + ":" + emoji.names.join(',') + ":" + emoji.imgUrl;
185
- }).join('|');
183
+ function customEmojisEqual(prev, next) {
184
+ if (prev.length !== next.length) {
185
+ return false;
186
+ }
187
+ return prev.every(function (emoji, index) {
188
+ var _emoji$group, _other$group;
189
+ var other = next[index];
190
+ return emoji.id === other.id && ((_emoji$group = emoji.group) != null ? _emoji$group : '') === ((_other$group = other.group) != null ? _other$group : '') && emoji.imgUrl === other.imgUrl && emoji.names.length === other.names.length && emoji.names.every(function (name, nameIndex) {
191
+ return name === other.names[nameIndex];
192
+ });
193
+ });
186
194
  }
187
195
  /**
188
- * Content identity for the categories input. Order, labels, icons, and
189
- * group selection all flow into the merged configuration.
196
+ * Structural content equality for the categories input. Order, labels,
197
+ * group selection, and icon identity all flow into the merged
198
+ * configuration. Icons compare by reference: swapping one icon element
199
+ * for another must rebuild, while a stable reference stays cheap.
190
200
  */
191
- function categoriesKey(categories) {
192
- return (categories != null ? categories : []).map(function (entry) {
193
- var _entry$group;
194
- return typeof entry === 'string' ? entry : entry.category + ":" + entry.name + ":" + ((_entry$group = entry.group) != null ? _entry$group : '') + ":" + (entry.icon ? '1' : '');
195
- }).join('|');
201
+ function categoriesEqual(prev, next) {
202
+ var prevEntries = prev != null ? prev : [];
203
+ var nextEntries = next != null ? next : [];
204
+ if (prevEntries.length !== nextEntries.length) {
205
+ return false;
206
+ }
207
+ return prevEntries.every(function (entry, index) {
208
+ return categoryEntriesEqual(entry, nextEntries[index]);
209
+ });
210
+ }
211
+ /**
212
+ * One categories entry compared structurally. Icons compare by reference:
213
+ * swapping one icon element for another rebuilds, a stable reference stays
214
+ * cheap. Delimited serialization is avoided so user-controlled values
215
+ * cannot collide.
216
+ */
217
+ function categoryEntriesEqual(entry, other) {
218
+ var _entry$group, _other$group2;
219
+ if (typeof entry === 'string' || typeof other === 'string') {
220
+ return entry === other;
221
+ }
222
+ return entry.category === other.category && entry.name === other.name && ((_entry$group = entry.group) != null ? _entry$group : '') === ((_other$group2 = other.group) != null ? _other$group2 : '') && entry.icon === other.icon;
196
223
  }
197
224
 
198
225
  var DEFAULT_REACTIONS = ['1f44d', '2764-fe0f', '1f603', '1f622', '1f64f', '1f44e', '1f621'];
@@ -30533,7 +30560,7 @@ function categoryNameFromDom($category) {
30533
30560
  function useActiveCategoryScrollDetection(_ref) {
30534
30561
  var setActiveCategory = _ref.setActiveCategory,
30535
30562
  setVisibleCategories = _ref.setVisibleCategories,
30536
- categoryIdentitiesKey = _ref.categoryIdentitiesKey;
30563
+ categories = _ref.categories;
30537
30564
  var BodyRef = useBodyRef();
30538
30565
  useEffect(function () {
30539
30566
  var visibleCategories = new Map();
@@ -30585,7 +30612,7 @@ function useActiveCategoryScrollDetection(_ref) {
30585
30612
  return function () {
30586
30613
  observer.disconnect();
30587
30614
  };
30588
- }, [BodyRef, categoryIdentitiesKey, setActiveCategory, setVisibleCategories]);
30615
+ }, [BodyRef, categories, setActiveCategory, setVisibleCategories]);
30589
30616
  }
30590
30617
 
30591
30618
  function useScrollCategoryIntoView() {
@@ -30979,16 +31006,12 @@ function CategoryNavigation() {
30979
31006
  var _usePickerDataContext = usePickerDataContext(),
30980
31007
  customGroups = _usePickerDataContext.customGroups,
30981
31008
  emojiData = _usePickerDataContext.emojiData;
30982
- // Rendered section identities. Passed to the scroll-detection hook so
30983
- // added/removed sections are (re-)subscribed; stable across renders
30984
- // unless the effective category list changes.
30985
- var categoryIdentitiesKey = categoriesConfig.map(function (entry) {
30986
- return categoryIdFromCategoryConfig(entry);
30987
- }).join('|');
31009
+ // The observer re-subscribes when the merged categories reference
31010
+ // changes (sections added/removed); the reference is stable otherwise.
30988
31011
  useActiveCategoryScrollDetection({
30989
31012
  setActiveCategory: setActiveCategory,
30990
31013
  setVisibleCategories: setVisibleCategories,
30991
- categoryIdentitiesKey: categoryIdentitiesKey
31014
+ categories: categoriesConfig
30992
31015
  });
30993
31016
  var visibleCategories = categoriesConfig.filter(function (categoryConfig) {
30994
31017
  if (isCustomCategory(categoryConfig) && hideCustomCategory) {