@atlaskit/reactions 22.2.4 → 22.2.6

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 (158) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/analytics/analytics.js +20 -1
  3. package/dist/cjs/components/ReactionPicker/ReactionPicker.js +76 -38
  4. package/dist/cjs/components/ReactionPicker/styles.js +7 -1
  5. package/dist/cjs/components/Reactions/Reactions.js +7 -3
  6. package/dist/cjs/components/ShowMore/ShowMore.js +1 -1
  7. package/dist/cjs/components/Trigger/Trigger.js +4 -1
  8. package/dist/cjs/components/Trigger/styles.js +5 -0
  9. package/dist/cjs/hooks/index.js +3 -3
  10. package/dist/cjs/hooks/useCloseManager.js +47 -0
  11. package/dist/cjs/hooks/useFocusTrap.js +46 -0
  12. package/dist/cjs/i18n/cs.js +14 -13
  13. package/dist/cjs/i18n/da.js +14 -13
  14. package/dist/cjs/i18n/de.js +14 -13
  15. package/dist/cjs/i18n/en.js +15 -14
  16. package/dist/cjs/i18n/en_GB.js +15 -14
  17. package/dist/cjs/i18n/en_ZZ.js +15 -14
  18. package/dist/cjs/i18n/es.js +14 -13
  19. package/dist/cjs/i18n/fi.js +14 -13
  20. package/dist/cjs/i18n/fr.js +14 -13
  21. package/dist/cjs/i18n/hu.js +14 -13
  22. package/dist/cjs/i18n/it.js +14 -13
  23. package/dist/cjs/i18n/ja.js +14 -13
  24. package/dist/cjs/i18n/ko.js +14 -13
  25. package/dist/cjs/i18n/nb.js +14 -13
  26. package/dist/cjs/i18n/nl.js +14 -13
  27. package/dist/cjs/i18n/pl.js +14 -13
  28. package/dist/cjs/i18n/pt_BR.js +14 -13
  29. package/dist/cjs/i18n/ru.js +14 -13
  30. package/dist/cjs/i18n/sv.js +14 -13
  31. package/dist/cjs/i18n/th.js +14 -13
  32. package/dist/cjs/i18n/tr.js +14 -13
  33. package/dist/cjs/i18n/uk.js +14 -13
  34. package/dist/cjs/i18n/vi.js +14 -13
  35. package/dist/cjs/i18n/zh.js +14 -13
  36. package/dist/cjs/i18n/zh_TW.js +14 -13
  37. package/dist/cjs/shared/constants.js +6 -2
  38. package/dist/cjs/store/MemoryReactionsStore.js +1 -1
  39. package/dist/cjs/version.json +1 -1
  40. package/dist/es2019/analytics/analytics.js +18 -0
  41. package/dist/es2019/components/ReactionPicker/ReactionPicker.js +58 -28
  42. package/dist/es2019/components/ReactionPicker/styles.js +5 -0
  43. package/dist/es2019/components/Reactions/Reactions.js +7 -3
  44. package/dist/es2019/components/ShowMore/ShowMore.js +1 -1
  45. package/dist/es2019/components/Trigger/Trigger.js +2 -0
  46. package/dist/es2019/components/Trigger/styles.js +6 -1
  47. package/dist/es2019/hooks/index.js +1 -1
  48. package/dist/es2019/hooks/useCloseManager.js +41 -0
  49. package/dist/es2019/hooks/useFocusTrap.js +38 -0
  50. package/dist/es2019/i18n/cs.js +14 -13
  51. package/dist/es2019/i18n/da.js +14 -13
  52. package/dist/es2019/i18n/de.js +14 -13
  53. package/dist/es2019/i18n/en.js +15 -14
  54. package/dist/es2019/i18n/en_GB.js +15 -14
  55. package/dist/es2019/i18n/en_ZZ.js +15 -14
  56. package/dist/es2019/i18n/es.js +14 -13
  57. package/dist/es2019/i18n/fi.js +14 -13
  58. package/dist/es2019/i18n/fr.js +14 -13
  59. package/dist/es2019/i18n/hu.js +14 -13
  60. package/dist/es2019/i18n/it.js +14 -13
  61. package/dist/es2019/i18n/ja.js +14 -13
  62. package/dist/es2019/i18n/ko.js +14 -13
  63. package/dist/es2019/i18n/nb.js +14 -13
  64. package/dist/es2019/i18n/nl.js +14 -13
  65. package/dist/es2019/i18n/pl.js +14 -13
  66. package/dist/es2019/i18n/pt_BR.js +14 -13
  67. package/dist/es2019/i18n/ru.js +14 -13
  68. package/dist/es2019/i18n/sv.js +14 -13
  69. package/dist/es2019/i18n/th.js +14 -13
  70. package/dist/es2019/i18n/tr.js +14 -13
  71. package/dist/es2019/i18n/uk.js +14 -13
  72. package/dist/es2019/i18n/vi.js +14 -13
  73. package/dist/es2019/i18n/zh.js +14 -13
  74. package/dist/es2019/i18n/zh_TW.js +14 -13
  75. package/dist/es2019/shared/constants.js +4 -1
  76. package/dist/es2019/store/MemoryReactionsStore.js +1 -1
  77. package/dist/es2019/version.json +1 -1
  78. package/dist/esm/analytics/analytics.js +18 -0
  79. package/dist/esm/components/ReactionPicker/ReactionPicker.js +75 -38
  80. package/dist/esm/components/ReactionPicker/styles.js +5 -0
  81. package/dist/esm/components/Reactions/Reactions.js +7 -3
  82. package/dist/esm/components/ShowMore/ShowMore.js +1 -1
  83. package/dist/esm/components/Trigger/Trigger.js +2 -0
  84. package/dist/esm/components/Trigger/styles.js +6 -1
  85. package/dist/esm/hooks/index.js +1 -1
  86. package/dist/esm/hooks/useCloseManager.js +41 -0
  87. package/dist/esm/hooks/useFocusTrap.js +37 -0
  88. package/dist/esm/i18n/cs.js +14 -13
  89. package/dist/esm/i18n/da.js +14 -13
  90. package/dist/esm/i18n/de.js +14 -13
  91. package/dist/esm/i18n/en.js +15 -14
  92. package/dist/esm/i18n/en_GB.js +15 -14
  93. package/dist/esm/i18n/en_ZZ.js +15 -14
  94. package/dist/esm/i18n/es.js +14 -13
  95. package/dist/esm/i18n/fi.js +14 -13
  96. package/dist/esm/i18n/fr.js +14 -13
  97. package/dist/esm/i18n/hu.js +14 -13
  98. package/dist/esm/i18n/it.js +14 -13
  99. package/dist/esm/i18n/ja.js +14 -13
  100. package/dist/esm/i18n/ko.js +14 -13
  101. package/dist/esm/i18n/nb.js +14 -13
  102. package/dist/esm/i18n/nl.js +14 -13
  103. package/dist/esm/i18n/pl.js +14 -13
  104. package/dist/esm/i18n/pt_BR.js +14 -13
  105. package/dist/esm/i18n/ru.js +14 -13
  106. package/dist/esm/i18n/sv.js +14 -13
  107. package/dist/esm/i18n/th.js +14 -13
  108. package/dist/esm/i18n/tr.js +14 -13
  109. package/dist/esm/i18n/uk.js +14 -13
  110. package/dist/esm/i18n/vi.js +14 -13
  111. package/dist/esm/i18n/zh.js +14 -13
  112. package/dist/esm/i18n/zh_TW.js +14 -13
  113. package/dist/esm/shared/constants.js +4 -1
  114. package/dist/esm/store/MemoryReactionsStore.js +1 -1
  115. package/dist/esm/version.json +1 -1
  116. package/dist/types/analytics/analytics.d.ts +9 -0
  117. package/dist/types/components/ReactionPicker/ReactionPicker.d.ts +4 -0
  118. package/dist/types/components/ReactionPicker/styles.d.ts +1 -0
  119. package/dist/types/components/Trigger/Trigger.d.ts +1 -0
  120. package/dist/types/hooks/index.d.ts +1 -1
  121. package/dist/types/hooks/useCloseManager.d.ts +11 -0
  122. package/dist/types/hooks/useFocusTrap.d.ts +5 -0
  123. package/dist/types/i18n/cs.d.ts +13 -13
  124. package/dist/types/i18n/da.d.ts +13 -13
  125. package/dist/types/i18n/de.d.ts +13 -13
  126. package/dist/types/i18n/en.d.ts +14 -14
  127. package/dist/types/i18n/en_GB.d.ts +14 -14
  128. package/dist/types/i18n/en_ZZ.d.ts +14 -14
  129. package/dist/types/i18n/es.d.ts +13 -13
  130. package/dist/types/i18n/fi.d.ts +13 -13
  131. package/dist/types/i18n/fr.d.ts +13 -13
  132. package/dist/types/i18n/hu.d.ts +13 -13
  133. package/dist/types/i18n/it.d.ts +13 -13
  134. package/dist/types/i18n/ja.d.ts +13 -13
  135. package/dist/types/i18n/ko.d.ts +13 -13
  136. package/dist/types/i18n/nb.d.ts +13 -13
  137. package/dist/types/i18n/nl.d.ts +13 -13
  138. package/dist/types/i18n/pl.d.ts +13 -13
  139. package/dist/types/i18n/pt_BR.d.ts +13 -13
  140. package/dist/types/i18n/ru.d.ts +13 -13
  141. package/dist/types/i18n/sv.d.ts +13 -13
  142. package/dist/types/i18n/th.d.ts +13 -13
  143. package/dist/types/i18n/tr.d.ts +13 -13
  144. package/dist/types/i18n/uk.d.ts +13 -13
  145. package/dist/types/i18n/vi.d.ts +13 -13
  146. package/dist/types/i18n/zh.d.ts +13 -13
  147. package/dist/types/i18n/zh_TW.d.ts +13 -13
  148. package/dist/types/shared/constants.d.ts +1 -0
  149. package/package.json +13 -11
  150. package/README.md +0 -3
  151. package/dist/cjs/analytics/constants.js +0 -9
  152. package/dist/cjs/hooks/useClickAway.js +0 -36
  153. package/dist/es2019/analytics/constants.js +0 -2
  154. package/dist/es2019/hooks/useClickAway.js +0 -28
  155. package/dist/esm/analytics/constants.js +0 -2
  156. package/dist/esm/hooks/useClickAway.js +0 -31
  157. package/dist/types/analytics/constants.d.ts +0 -1
  158. package/dist/types/hooks/useClickAway.d.ts +0 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atlaskit/reactions
2
2
 
3
+ ## 22.2.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`6b5bf5505b6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6b5bf5505b6) - revert atlaskit popup refactor in reaction picker
8
+ - [`db658265a45`](https://bitbucket.org/atlassian/atlassian-frontend/commits/db658265a45) - add sampling for reaction view analytics
9
+ - [`c84afc8fbd8`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c84afc8fbd8) - [ux] add focus trap to reaction picker
10
+ - [`ed219dee1bd`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ed219dee1bd) - refactor reactions picker with @atlaskit/popup
11
+ - Updated dependencies
12
+
13
+ ## 22.2.5
14
+
15
+ ### Patch Changes
16
+
17
+ - [`dfbecb4aa7c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/dfbecb4aa7c) - [ux] [COLLAB-2263] allow `Enter` to open Show more to show emoji picker, allow `ESC` to close emoji picker / reaction selector.
18
+ - Updated dependencies
19
+
3
20
  ## 22.2.4
4
21
 
5
22
  ### Patch Changes
@@ -4,13 +4,32 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.extractErrorInfo = exports.createRestSucceededEvent = exports.createRestFailedEvent = exports.createReactionsRenderedEvent = exports.createReactionSelectionEvent = exports.createReactionHoveredEvent = exports.createReactionFocusedEvent = exports.createReactionClickedEvent = exports.createPickerMoreClickedEvent = exports.createPickerCancelledEvent = exports.createPickerButtonClickedEvent = exports.createAndFireSafe = exports.createAndFireEventInElementsChannel = void 0;
7
+ exports.isSampled = exports.extractErrorInfo = exports.createRestSucceededEvent = exports.createRestFailedEvent = exports.createReactionsRenderedEvent = exports.createReactionSelectionEvent = exports.createReactionHoveredEvent = exports.createReactionFocusedEvent = exports.createReactionClickedEvent = exports.createPickerMoreClickedEvent = exports.createPickerCancelledEvent = exports.createPickerButtonClickedEvent = exports.createAndFireSafe = exports.createAndFireEventInElementsChannel = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _analyticsNext = require("@atlaskit/analytics-next");
10
10
  var _analyticsGasTypes = require("@atlaskit/analytics-gas-types");
11
11
  var _version = require("../version.json");
12
12
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
13
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ /**
15
+ * TODO: move to utility package?
16
+ * A random sampling function
17
+ * sampling algorithm is from @atlassian/jira-coinflip at https://stash.atlassian.com/projects/JIRACLOUD/repos/jira-frontend/browse/src/packages/platform/app-framework/coinflip/src/index.tsx
18
+ * E.g. isSampled(2) will pass 50% of the time
19
+ * @param rate The chance that it will pass (1 in <rate> times)
20
+ * @returns bool, if it passes or not
21
+ */
22
+ // default sampling function to determine which one to be sampled
23
+ var isSampled = function isSampled(rate) {
24
+ if (rate === 1) {
25
+ return true;
26
+ }
27
+ if (rate === 0) {
28
+ return false;
29
+ }
30
+ return Math.random() * rate <= 1;
31
+ };
32
+ exports.isSampled = isSampled;
14
33
  var createAndFireEventInElementsChannel = (0, _analyticsNext.createAndFireEvent)('fabric-elements');
15
34
  exports.createAndFireEventInElementsChannel = createAndFireEventInElementsChannel;
16
35
  var createAndFireSafe = function createAndFireSafe(createAnalyticsEvent, creator) {
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.ReactionPicker = exports.RENDER_REACTIONPICKER_TESTID = void 0;
8
+ exports.ReactionPicker = exports.RENDER_REACTIONPICKER_TESTID = exports.RENDER_REACTIONPICKERPANEL_TESTID = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
11
  var _react = _interopRequireWildcard(require("react"));
@@ -20,6 +20,7 @@ var _analytics = require("../../analytics");
20
20
  var _shared = require("../../shared");
21
21
  var _hooks = require("../../hooks");
22
22
  var styles = _interopRequireWildcard(require("./styles"));
23
+ var _useFocusTrap = require("../../hooks/useFocusTrap");
23
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
25
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
26
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -30,9 +31,15 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
30
31
  var RENDER_REACTIONPICKER_TESTID = 'reactionPicker-testid';
31
32
 
32
33
  /**
33
- * Emoji Picker Controller Id for Accessibility Labels
34
+ * Test id for ReactionPicker panel div
34
35
  */
35
36
  exports.RENDER_REACTIONPICKER_TESTID = RENDER_REACTIONPICKER_TESTID;
37
+ var RENDER_REACTIONPICKERPANEL_TESTID = 'reactionPickerPanel-testid';
38
+
39
+ /**
40
+ * Emoji Picker Controller Id for Accessibility Labels
41
+ */
42
+ exports.RENDER_REACTIONPICKERPANEL_TESTID = RENDER_REACTIONPICKERPANEL_TESTID;
36
43
  var PICKER_CONTROL_ID = 'emoji-picker';
37
44
  var popperModifiers = [
38
45
  /**
@@ -81,15 +88,20 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
81
88
  _props$tooltipContent = props.tooltipContent,
82
89
  tooltipContent = _props$tooltipContent === void 0 ? (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _shared.i18n.messages.addReaction) : _props$tooltipContent,
83
90
  emojiPickerSize = props.emojiPickerSize;
91
+ var _useState = (0, _react.useState)(null),
92
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
93
+ triggerRef = _useState2[0],
94
+ setTriggerRef = _useState2[1];
95
+ var _useState3 = (0, _react.useState)(null),
96
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
97
+ popupRef = _useState4[0],
98
+ setPopupRef = _useState4[1];
84
99
  /**
85
100
  * Container <div /> reference (used by custom hook to detect click outside)
86
101
  */
87
102
  var wrapperRef = (0, _react.useRef)(null);
88
- /**
89
- * a function you can ask Popper to recompute your tooltip's position. It will directly call the Popper#update method
90
- */
91
103
  var updatePopper = (0, _react.useRef)();
92
- var _useState = (0, _react.useState)({
104
+ var _useState5 = (0, _react.useState)({
93
105
  /**
94
106
  * Show the picker floating panel
95
107
  */
@@ -99,27 +111,39 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
99
111
  */
100
112
  showFullPicker: !!allowAllEmojis && Array.isArray(pickerQuickReactionEmojiIds) && pickerQuickReactionEmojiIds.length === 0
101
113
  }),
102
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
103
- settings = _useState2[0],
104
- setSettings = _useState2[1];
114
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
115
+ settings = _useState6[0],
116
+ setSettings = _useState6[1];
105
117
 
106
118
  /**
107
119
  * Custom hook triggers when user clicks outside the reactions picker
108
120
  */
109
- (0, _hooks.useClickAway)(wrapperRef, function () {
110
- onCancel();
121
+ (0, _hooks.useCloseManager)(wrapperRef, function (callbackType) {
111
122
  close();
112
- }, 'click', true, settings.isOpen);
123
+ onCancel();
124
+ if (triggerRef && callbackType === 'ESCAPE') {
125
+ requestAnimationFrame(function () {
126
+ return triggerRef.focus();
127
+ });
128
+ }
129
+ }, true, settings.isOpen);
130
+
131
+ /**
132
+ * add focus lock to popup
133
+ */
134
+ (0, _useFocusTrap.useFocusTrap)({
135
+ initialFocusRef: null,
136
+ targetRef: popupRef
137
+ });
113
138
 
114
139
  /**
115
140
  * Event callback when the picker is closed
116
141
  * @param _id Optional id if an emoji button was selected or undefineed if was clicked outside the picker
117
142
  */
118
143
  var close = (0, _react.useCallback)(function (_id) {
119
- setSettings({
120
- isOpen: false,
121
- showFullPicker: !!allowAllEmojis && Array.isArray(pickerQuickReactionEmojiIds) && pickerQuickReactionEmojiIds.length === 0
122
- });
144
+ setSettings(_objectSpread(_objectSpread({}, settings), {}, {
145
+ isOpen: false
146
+ }));
123
147
  // ufo abort reaction experience
124
148
  _analytics.UFO.PickerRender.abort({
125
149
  metadata: {
@@ -128,7 +152,7 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
128
152
  reason: 'close dialog'
129
153
  }
130
154
  });
131
- }, [allowAllEmojis, pickerQuickReactionEmojiIds]);
155
+ }, [settings]);
132
156
 
133
157
  /**
134
158
  * Event handle rwhen selecting to show the custom emoji icons picker
@@ -170,25 +194,18 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
170
194
  // ufo reactions picker opened success
171
195
  _analytics.UFO.PickerRender.success();
172
196
  };
173
-
174
- /**
175
- * When picker is opened, re-calculate the picker position
176
- */
177
- (0, _react.useEffect)(function () {
178
- if (settings.isOpen) {
179
- if (updatePopper.current) {
180
- updatePopper.current();
181
- }
182
- }
183
- }, [settings]);
184
197
  var wrapperClassName = " ".concat(settings.isOpen ? 'isOpen' : '', " ").concat(miniMode ? 'miniMode' : '', " ").concat(className);
198
+ (0, _react.useLayoutEffect)(function () {
199
+ var _updatePopper$current;
200
+ (_updatePopper$current = updatePopper.current) === null || _updatePopper$current === void 0 ? void 0 : _updatePopper$current.call(updatePopper);
201
+ }, [settings]);
185
202
  return (0, _react2.jsx)("div", {
186
203
  className: wrapperClassName,
187
204
  css: styles.pickerStyle,
188
205
  "data-testid": RENDER_REACTIONPICKER_TESTID,
189
206
  ref: wrapperRef
190
207
  }, (0, _react2.jsx)(_popper.Manager, null, (0, _react2.jsx)(_popper.Reference, null, function (_ref) {
191
- var popperRef = _ref.ref;
208
+ var _ref2 = _ref.ref;
192
209
  return (
193
210
  // Render a button to open the <Selector /> panel
194
211
  (0, _react2.jsx)(_Trigger.Trigger, {
@@ -196,27 +213,48 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
196
213
  'aria-expanded': settings.isOpen,
197
214
  'aria-controls': PICKER_CONTROL_ID
198
215
  },
199
- ref: popperRef,
216
+ ref: function ref(node) {
217
+ if (node && settings.isOpen) {
218
+ if (typeof _ref2 === 'function') {
219
+ _ref2(node);
220
+ } else {
221
+ _ref2.current = node;
222
+ }
223
+ setTriggerRef(node);
224
+ }
225
+ },
200
226
  onClick: onTriggerClick,
201
227
  miniMode: miniMode,
202
228
  disabled: disabled,
203
229
  tooltipContent: settings.isOpen ? null : tooltipContent
204
230
  })
205
231
  );
206
- }), (0, _react2.jsx)(_popper.Popper, {
232
+ }), settings.isOpen && (0, _react2.jsx)(_popper.Popper, {
207
233
  placement: "bottom-start",
208
234
  modifiers: popperModifiers
209
- }, function (_ref2) {
210
- var ref = _ref2.ref,
211
- style = _ref2.style,
212
- update = _ref2.update;
235
+ }, function (_ref3) {
236
+ var _ref4 = _ref3.ref,
237
+ style = _ref3.style,
238
+ update = _ref3.update;
213
239
  updatePopper.current = update;
214
- return (0, _react2.jsx)(_react.Fragment, null, settings.isOpen && (0, _react2.jsx)("div", {
240
+ return (0, _react2.jsx)("div", {
215
241
  id: PICKER_CONTROL_ID,
242
+ "data-testid": RENDER_REACTIONPICKERPANEL_TESTID,
216
243
  style: _objectSpread({
217
244
  zIndex: _constants.layers.layer()
218
245
  }, style),
219
- ref: ref
246
+ ref: function ref(node) {
247
+ if (node) {
248
+ if (typeof _ref4 === 'function') {
249
+ _ref4(node);
250
+ } else {
251
+ _ref4.current = node;
252
+ }
253
+ setPopupRef(node);
254
+ }
255
+ },
256
+ css: styles.popupWrapperStyle,
257
+ tabIndex: 0
220
258
  }, (0, _react2.jsx)("div", {
221
259
  css: styles.popupStyle
222
260
  }, settings.showFullPicker ? (0, _react2.jsx)(_picker.EmojiPicker, {
@@ -231,7 +269,7 @@ var ReactionPicker = /*#__PURE__*/_react.default.memo(function (props) {
231
269
  showMore: allowAllEmojis,
232
270
  onMoreClick: onSelectMoreClick,
233
271
  pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds
234
- })))));
272
+ }))));
235
273
  })));
236
274
  });
237
275
  exports.ReactionPicker = ReactionPicker;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.popupStyle = exports.pickerStyle = exports.contentStyle = void 0;
6
+ exports.popupWrapperStyle = exports.popupStyle = exports.pickerStyle = exports.contentStyle = void 0;
7
7
  var _react = require("@emotion/react");
8
8
  var _constants = require("@atlaskit/theme/constants");
9
9
  var _colors = require("@atlaskit/theme/colors");
@@ -20,6 +20,12 @@ var contentStyle = (0, _react.css)({
20
20
  display: 'flex'
21
21
  });
22
22
  exports.contentStyle = contentStyle;
23
+ var popupWrapperStyle = (0, _react.css)({
24
+ ':focus': {
25
+ outline: 'none'
26
+ }
27
+ });
28
+ exports.popupWrapperStyle = popupWrapperStyle;
23
29
  var popupStyle = (0, _react.css)({
24
30
  background: "var(--ds-surface-overlay, ".concat(_colors.N0, ")"),
25
31
  borderRadius: "".concat((0, _constants.borderRadius)(), "px"),
@@ -23,6 +23,8 @@ var _Reaction = require("../Reaction");
23
23
  var _ReactionDialog = require("../ReactionDialog");
24
24
  var _ReactionPicker = require("../ReactionPicker");
25
25
  var styles = _interopRequireWildcard(require("./styles"));
26
+ var _analytics2 = require("../../analytics/analytics");
27
+ var _constants = require("../../shared/constants");
26
28
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
29
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
30
  /** @jsx jsx */
@@ -123,9 +125,11 @@ var Reactions = /*#__PURE__*/_react.default.memo(function (_ref) {
123
125
  if (status !== _types.ReactionStatus.ready) {
124
126
  renderTime.current = Date.now();
125
127
  } else {
126
- var _renderTime$current;
127
- _analytics.Analytics.createAndFireSafe(createAnalyticsEvent, _analytics.Analytics.createReactionsRenderedEvent, (_renderTime$current = renderTime.current) !== null && _renderTime$current !== void 0 ? _renderTime$current : Date.now() //renderTime.current can be null during unit test cases
128
- );
128
+ if ((0, _analytics2.isSampled)(_constants.SAMPLING_RATE_REACTIONS_RENDERED_EXP)) {
129
+ var _renderTime$current;
130
+ _analytics.Analytics.createAndFireSafe(createAnalyticsEvent, _analytics.Analytics.createReactionsRenderedEvent, (_renderTime$current = renderTime.current) !== null && _renderTime$current !== void 0 ? _renderTime$current : Date.now() //renderTime.current can be null during unit test cases
131
+ );
132
+ }
129
133
  renderTime.current = undefined;
130
134
  }
131
135
  }, [createAnalyticsEvent, status]);
@@ -50,7 +50,7 @@ var ShowMore = function ShowMore(_ref) {
50
50
  "aria-label": _shared.i18n.messages.moreEmoji.defaultMessage,
51
51
  type: "button",
52
52
  style: style.button,
53
- onMouseDown: onClick,
53
+ onClick: onClick,
54
54
  "data-testid": RENDER_SHOWMORE_TESTID
55
55
  }, (0, _react2.jsx)(_more.default, {
56
56
  label: "More"
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.Trigger = exports.RENDER_TOOLTIP_TRIGGER_TESTID = void 0;
8
+ exports.Trigger = exports.RENDER_TRIGGER_BUTTON_TESTID = exports.RENDER_TOOLTIP_TRIGGER_TESTID = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _react = _interopRequireDefault(require("react"));
11
11
  var _react2 = require("@emotion/react");
@@ -22,6 +22,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
22
22
  */
23
23
  var RENDER_TOOLTIP_TRIGGER_TESTID = 'render-tooltip-trigger';
24
24
  exports.RENDER_TOOLTIP_TRIGGER_TESTID = RENDER_TOOLTIP_TRIGGER_TESTID;
25
+ var RENDER_TRIGGER_BUTTON_TESTID = 'render-trigger-button';
26
+ exports.RENDER_TRIGGER_BUTTON_TESTID = RENDER_TRIGGER_BUTTON_TESTID;
25
27
  /**
26
28
  * Render an emoji button to open the reactions select picker
27
29
  */
@@ -42,6 +44,7 @@ var Trigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
42
44
  testId: RENDER_TOOLTIP_TRIGGER_TESTID,
43
45
  content: tooltipContent
44
46
  }, (0, _react2.jsx)(_standardButton.default, (0, _extends2.default)({
47
+ testId: RENDER_TRIGGER_BUTTON_TESTID,
45
48
  css: styles.triggerStyle({
46
49
  miniMode: miniMode,
47
50
  disabled: disabled
@@ -39,6 +39,11 @@ var triggerStyle = function triggerStyle(_ref) {
39
39
  }), {}, {
40
40
  '&:hover': {
41
41
  background: "".concat("var(--ds-background-neutral-subtle-hovered, ".concat(_colors.N20, ")"))
42
+ },
43
+ '&:focus': {
44
+ boxShadow: "0 0 0 2px ".concat("var(--ds-border-focused, ".concat(_colors.B100, ")")),
45
+ transitionDuration: '0s, 0.2s',
46
+ outline: 'none'
42
47
  }
43
48
  }));
44
49
  };
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "useClickAway", {
6
+ Object.defineProperty(exports, "useCloseManager", {
7
7
  enumerable: true,
8
8
  get: function get() {
9
- return _useClickAway.useClickAway;
9
+ return _useCloseManager.useCloseManager;
10
10
  }
11
11
  });
12
- var _useClickAway = require("./useClickAway");
12
+ var _useCloseManager = require("./useCloseManager");
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useCloseManager = useCloseManager;
7
+ var _react = require("react");
8
+ /**
9
+ * Custom hook to detect when user action is outside given container ref or press escape key
10
+ * @param ref ref object to an html element
11
+ * @param callback event callback when detected a click outside the ref object or escape key is pressed
12
+ * @param useCapture (Optional) use capture phase of event. @default false
13
+ * @param enabled (Optional) enable/disable the outside click or escape key press handler. @default true
14
+ */
15
+ function useCloseManager(ref, callback) {
16
+ var useCapture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
17
+ var enabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
18
+ (0, _react.useEffect)(function () {
19
+ if (!enabled) {
20
+ return;
21
+ }
22
+
23
+ /**
24
+ * Alert if clicked on outside of element
25
+ */
26
+ function handleClickOutside(event) {
27
+ if (ref.current && event.target instanceof Node && !ref.current.contains(event.target)) {
28
+ callback('CLICK_OUTSIDE');
29
+ }
30
+ }
31
+ function handleKeydown(event) {
32
+ var key = event.key;
33
+ if (key === 'Escape' || key === 'Esc') {
34
+ callback('ESCAPE');
35
+ }
36
+ }
37
+
38
+ // Bind the event listener
39
+ document.addEventListener('click', handleClickOutside, useCapture);
40
+ document.addEventListener('keydown', handleKeydown);
41
+ return function () {
42
+ // Unbind the event listener on clean up
43
+ document.removeEventListener('click', handleClickOutside, useCapture);
44
+ document.removeEventListener('keydown', handleKeydown);
45
+ };
46
+ }, [ref, callback, useCapture, enabled]);
47
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useFocusTrap = void 0;
8
+ var _react = require("react");
9
+ var _focusTrap = _interopRequireDefault(require("focus-trap"));
10
+ /**
11
+ * Custom hook to add focus trap
12
+ * used for focus trap in ReactionPicker
13
+ * copied from useFocusManager in @atlaskit/popup
14
+ */
15
+
16
+ var useFocusTrap = function useFocusTrap(_ref) {
17
+ var targetRef = _ref.targetRef,
18
+ initialFocusRef = _ref.initialFocusRef;
19
+ (0, _react.useEffect)(function () {
20
+ if (!targetRef) {
21
+ return;
22
+ }
23
+ var trapConfig = {
24
+ clickOutsideDeactivates: true,
25
+ escapeDeactivates: true,
26
+ initialFocus: initialFocusRef || targetRef,
27
+ fallbackFocus: targetRef,
28
+ returnFocusOnDeactivate: false
29
+ };
30
+ var focusTrap = (0, _focusTrap.default)(targetRef, trapConfig);
31
+
32
+ // wait for the popup to reposition itself before we focus
33
+ var frameId = requestAnimationFrame(function () {
34
+ frameId = null;
35
+ focusTrap.activate();
36
+ });
37
+ return function () {
38
+ if (frameId != null) {
39
+ cancelAnimationFrame(frameId);
40
+ frameId = null;
41
+ }
42
+ focusTrap.deactivate();
43
+ };
44
+ }, [targetRef, initialFocusRef]);
45
+ };
46
+ exports.useFocusTrap = useFocusTrap;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ /* prettier-ignore */
7
8
  /**
8
9
  * NOTE:
9
10
  *
@@ -12,18 +13,18 @@ exports.default = void 0;
12
13
  */
13
14
  //Czech
14
15
  var _default = {
15
- 'fabric.reactions.add': 'Přidat reakci',
16
- 'fabric.reactions.error.unexpected': 'Reakce jsou dočasně nedostupné.',
17
- 'fabric.reactions.loading': 'Načítání...',
18
- 'fabric.reactions.more.emojis': 'Více smajlíků',
19
- 'fabric.reactions.more.info': 'Další informace',
20
- 'fabric.reactions.other.reacted.users': '{count, plural, one {a jeden další} few {a {count} další} many {a {count} dalšího} other {a {count} dalších}}',
21
- 'fabric.reactions.reactwithemoji': 'Reagovat pomocí smajlíku {emoji}',
22
- 'reactions.dialog.close': 'Zavřít',
23
- 'reactions.dialog.left.navigate': 'Navigace doleva',
24
- 'reactions.dialog.reactions.count': '{count, plural, one {{count,number} reakce} few {{count,number} reakce} many {{count,number} reakce} other {{count,number} reakcí}}',
25
- 'reactions.dialog.right.navigate': 'Navigace doprava',
26
- 'reactions.dialog.viewall': 'Podívejte se, kdo reagoval',
27
- 'reactions.dialog.viewall.tooltip': 'Zobrazit všechny reakce uživatelů'
16
+ "fabric.reactions.add": "Přidat reakci",
17
+ "fabric.reactions.error.unexpected": "Reakce jsou dočasně nedostupné.",
18
+ "fabric.reactions.loading": "Načítání...",
19
+ "fabric.reactions.more.emojis": "Více smajlíků",
20
+ "fabric.reactions.more.info": "Další informace",
21
+ "fabric.reactions.other.reacted.users": "{count, plural, one {a jeden další} few {a {count} další} many {a {count} dalšího} other {a {count} dalších}}",
22
+ "fabric.reactions.reactwithemoji": "Reagovat pomocí smajlíku {emoji}",
23
+ "reactions.dialog.close": "Zavřít",
24
+ "reactions.dialog.left.navigate": "Navigace doleva",
25
+ "reactions.dialog.reactions.count": "{count, plural, one {{count,number} reakce} few {{count,number} reakce} many {{count,number} reakce} other {{count,number} reakcí}}",
26
+ "reactions.dialog.right.navigate": "Navigace doprava",
27
+ "reactions.dialog.viewall": "Podívejte se, kdo reagoval",
28
+ "reactions.dialog.viewall.tooltip": "Zobrazit všechny reakce uživatelů"
28
29
  };
29
30
  exports.default = _default;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ /* prettier-ignore */
7
8
  /**
8
9
  * NOTE:
9
10
  *
@@ -12,18 +13,18 @@ exports.default = void 0;
12
13
  */
13
14
  //Danish (Denmark)
14
15
  var _default = {
15
- 'fabric.reactions.add': 'Tilføj reaktion',
16
- 'fabric.reactions.error.unexpected': 'Reaktioner er midlertidigt utilgængelige',
17
- 'fabric.reactions.loading': 'Indlæser ...',
18
- 'fabric.reactions.more.emojis': 'Flere emojis',
19
- 'fabric.reactions.more.info': 'Flere oplysninger',
20
- 'fabric.reactions.other.reacted.users': '{count, plural, one {og én anden} other {og {count} andre}}',
21
- 'fabric.reactions.reactwithemoji': 'Reager med emojien {emoji}',
22
- 'reactions.dialog.close': 'Luk',
23
- 'reactions.dialog.left.navigate': 'Navigation til venstre',
24
- 'reactions.dialog.reactions.count': '{count, plural, one {{count,number} reaktion} other {{count,number} reaktioner}}',
25
- 'reactions.dialog.right.navigate': 'Navigation til højre',
26
- 'reactions.dialog.viewall': 'Se, hvem der har reageret',
27
- 'reactions.dialog.viewall.tooltip': 'Se alle brugerreaktioner'
16
+ "fabric.reactions.add": "Tilføj reaktion",
17
+ "fabric.reactions.error.unexpected": "Reaktioner er midlertidigt utilgængelige",
18
+ "fabric.reactions.loading": "Indlæser ...",
19
+ "fabric.reactions.more.emojis": "Flere emojis",
20
+ "fabric.reactions.more.info": "Flere oplysninger",
21
+ "fabric.reactions.other.reacted.users": "{count, plural, one {og én anden} other {og {count} andre}}",
22
+ "fabric.reactions.reactwithemoji": "Reager med emojien {emoji}",
23
+ "reactions.dialog.close": "Luk",
24
+ "reactions.dialog.left.navigate": "Navigation til venstre",
25
+ "reactions.dialog.reactions.count": "{count, plural, one {{count,number} reaktion} other {{count,number} reaktioner}}",
26
+ "reactions.dialog.right.navigate": "Navigation til højre",
27
+ "reactions.dialog.viewall": "Se, hvem der har reageret",
28
+ "reactions.dialog.viewall.tooltip": "Se alle brugerreaktioner"
28
29
  };
29
30
  exports.default = _default;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ /* prettier-ignore */
7
8
  /**
8
9
  * NOTE:
9
10
  *
@@ -12,18 +13,18 @@ exports.default = void 0;
12
13
  */
13
14
  //German (Germany)
14
15
  var _default = {
15
- 'fabric.reactions.add': 'Reaktion hinzufügen',
16
- 'fabric.reactions.error.unexpected': 'Reaktionen sind vorübergehend nicht verfügbar.',
17
- 'fabric.reactions.loading': 'Wird geladen...',
18
- 'fabric.reactions.more.emojis': 'Mehr Emojis',
19
- 'fabric.reactions.more.info': 'Weitere Informationen',
20
- 'fabric.reactions.other.reacted.users': '{count, plural, one {und ein weiterer} other {und {count} weitere}}',
21
- 'fabric.reactions.reactwithemoji': 'Mit {emoji}-Emoji reagieren',
22
- 'reactions.dialog.close': 'Schließen',
23
- 'reactions.dialog.left.navigate': 'Nach links navigieren',
24
- 'reactions.dialog.reactions.count': '{count, plural, one {{count,number} Reaktion} other {{count,number} Reaktionen}}',
25
- 'reactions.dialog.right.navigate': 'Nach rechts navigieren',
26
- 'reactions.dialog.viewall': 'Reaktionen ansehen',
27
- 'reactions.dialog.viewall.tooltip': 'Alle Benutzerreaktionen anzeigen'
16
+ "fabric.reactions.add": "Reaktion hinzufügen",
17
+ "fabric.reactions.error.unexpected": "Reaktionen sind vorübergehend nicht verfügbar.",
18
+ "fabric.reactions.loading": "Wird geladen...",
19
+ "fabric.reactions.more.emojis": "Mehr Emojis",
20
+ "fabric.reactions.more.info": "Weitere Informationen",
21
+ "fabric.reactions.other.reacted.users": "{count, plural, one {und ein weiterer} other {und {count} weitere}}",
22
+ "fabric.reactions.reactwithemoji": "Mit {emoji}-Emoji reagieren",
23
+ "reactions.dialog.close": "Schließen",
24
+ "reactions.dialog.left.navigate": "Nach links navigieren",
25
+ "reactions.dialog.reactions.count": "{count, plural, one {{count,number} Reaktion} other {{count,number} Reaktionen}}",
26
+ "reactions.dialog.right.navigate": "Nach rechts navigieren",
27
+ "reactions.dialog.viewall": "Reaktionen ansehen",
28
+ "reactions.dialog.viewall.tooltip": "Alle Benutzerreaktionen anzeigen"
28
29
  };
29
30
  exports.default = _default;