@atlaskit/reactions 31.12.0 → 31.13.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/reactions
2
2
 
3
+ ## 31.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#156164](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/156164)
8
+ [`f0d8ffc2480b7`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f0d8ffc2480b7) -
9
+ [ux] Changes the behavior for the hoverable summary button and empty reactions trigger
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 31.12.0
4
16
 
5
17
  ### Minor Changes
@@ -11,7 +11,7 @@ var _analyticsGasTypes = require("@atlaskit/analytics-gas-types");
11
11
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
12
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
13
  var packageName = "@atlaskit/reactions";
14
- var packageVersion = "31.12.0";
14
+ var packageVersion = "31.13.0";
15
15
  /**
16
16
  * TODO: move to utility package?
17
17
  * A random sampling function
@@ -106,6 +106,10 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
106
106
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
107
107
  isHoveringPopup = _useState8[0],
108
108
  setIsHoveringPopup = _useState8[1];
109
+ var _useState9 = (0, _react.useState)(false),
110
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
111
+ isTriggerClicked = _useState10[0],
112
+ setIsTriggerClicked = _useState10[1];
109
113
  var _useDelayedState = (0, _useDelayedState3.useDelayedState)(false, hoverableReactionPickerDelay),
110
114
  _useDelayedState2 = (0, _slicedToArray2.default)(_useDelayedState, 2),
111
115
  isPopupTrayOpen = _useDelayedState2[0],
@@ -146,7 +150,7 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
146
150
  }, reactionsPickerPreventOverflowOptions && {
147
151
  options: reactionsPickerPreventOverflowOptions
148
152
  })];
149
- var _useState9 = (0, _react.useState)({
153
+ var _useState11 = (0, _react.useState)({
150
154
  /**
151
155
  * Show the full custom emoji list picker or the default list of emojis
152
156
  */
@@ -156,16 +160,16 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
156
160
  */
157
161
  popperPlacement: popperPlacement
158
162
  }),
159
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
160
- settings = _useState10[0],
161
- setSettings = _useState10[1];
163
+ _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
164
+ settings = _useState12[0],
165
+ setSettings = _useState12[1];
162
166
 
163
167
  /**
164
168
  * Event callback when the picker is closed
165
169
  * @param _id Optional id if an emoji button was selected or undefineed if was clicked outside the picker
166
170
  */
167
171
  var close = (0, _react.useCallback)(function (_id) {
168
- setIsPopupTrayOpen(false);
172
+ setIsPopupTrayOpen(false, true);
169
173
  // ufo abort reaction experience
170
174
  _ufo.PickerRender.abort({
171
175
  metadata: {
@@ -176,8 +180,11 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
176
180
  });
177
181
  if (hoverableReactionPicker) {
178
182
  setIsHoverableReactionPickerEmojiPickerOpen(false);
183
+ setIsTriggerClicked(false);
184
+ setIsHoveringTrigger(false);
185
+ setIsHoveringPopup(false);
179
186
  }
180
- }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker]);
187
+ }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker, setIsTriggerClicked, setIsHoveringTrigger, setIsHoveringPopup]);
181
188
 
182
189
  /**
183
190
  * Event handle rwhen selecting to show the custom emoji icons picker
@@ -192,6 +199,7 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
192
199
  setIsPopupTrayOpen(true);
193
200
  if (hoverableReactionPicker) {
194
201
  setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
202
+ setIsTriggerClicked(false);
195
203
  }
196
204
  onShowMore();
197
205
  }, [settings.showFullPicker, setIsPopupTrayOpen, onShowMore, popperPlacement, hoverableReactionPicker, setIsHoverableReactionPickerEmojiPickerOpen, isHoverableReactionPickerEmojiPickerOpen]);
@@ -219,15 +227,30 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
219
227
  popperPlacement: popperPlacement
220
228
  }));
221
229
  if (hoverableReactionPicker) {
222
- setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
223
- setIsPopupTrayOpen(!isHoverableReactionPickerEmojiPickerOpen || !isPopupTrayOpen);
230
+ if (isTriggerClicked) {
231
+ // if the button was previously clicked, close the popup and reset the state
232
+ setIsTriggerClicked(false);
233
+ setIsPopupTrayOpen(false, true);
234
+ } else {
235
+ if (isHoverableReactionPickerEmojiPickerOpen) {
236
+ // if the emoji picker is open, close the popup and reset the state
237
+ setIsTriggerClicked(false);
238
+ setIsPopupTrayOpen(false, true);
239
+ } else {
240
+ // if the button was not previously clicked, open the popup and set the state
241
+ setIsTriggerClicked(true);
242
+ setIsPopupTrayOpen(true, true);
243
+ }
244
+ }
245
+ // close the emoji picker
246
+ setIsHoverableReactionPickerEmojiPickerOpen(false);
224
247
  } else {
225
248
  setIsPopupTrayOpen(!isPopupTrayOpen);
226
249
  }
227
250
  onOpen();
228
251
  // ufo reactions picker opened success
229
252
  _ufo.PickerRender.success();
230
- }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
253
+ }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
231
254
  var handleTriggerMouseEnter = (0, _react.useCallback)(function () {
232
255
  if (hoverableReactionPicker) {
233
256
  setIsHoveringTrigger(true);
@@ -239,11 +262,11 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
239
262
  var handleTriggerMouseLeave = (0, _react.useCallback)(function () {
240
263
  if (hoverableReactionPicker) {
241
264
  setIsHoveringTrigger(false);
242
- if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen) {
265
+ if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
243
266
  setIsPopupTrayOpen(false);
244
267
  }
245
268
  }
246
- }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
269
+ }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
247
270
  var handlePopupMouseEnter = (0, _react.useCallback)(function () {
248
271
  if (hoverableReactionPicker) {
249
272
  setIsHoveringPopup(true);
@@ -255,11 +278,11 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
255
278
  var handlePopupMouseLeave = (0, _react.useCallback)(function () {
256
279
  if (hoverableReactionPicker) {
257
280
  setIsHoveringPopup(false);
258
- if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen) {
281
+ if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
259
282
  setIsPopupTrayOpen(false);
260
283
  }
261
284
  }
262
- }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
285
+ }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
263
286
  var wrapperClassName = " ".concat(isPopupTrayOpen ? 'isOpen' : '', " ").concat(miniMode ? 'miniMode' : '', " ").concat(className);
264
287
  (0, _react.useLayoutEffect)(function () {
265
288
  var _updatePopper$current;
@@ -343,10 +366,10 @@ var PopperWrapper = exports.PopperWrapper = function PopperWrapper(props) {
343
366
  onClose = props.onClose,
344
367
  children = props.children,
345
368
  popperModifiers = props.popperModifiers;
346
- var _useState11 = (0, _react.useState)(null),
347
- _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
348
- popupRef = _useState12[0],
349
- setPopupRef = _useState12[1];
369
+ var _useState13 = (0, _react.useState)(null),
370
+ _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
371
+ popupRef = _useState14[0],
372
+ setPopupRef = _useState14[1];
350
373
  var _useIntl = (0, _reactIntlNext.useIntl)(),
351
374
  formatMessage = _useIntl.formatMessage;
352
375
  /**
@@ -80,8 +80,12 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
80
80
  setIsSummaryViewButtonHovered = _useState4[1];
81
81
  var _useState5 = (0, _react.useState)(false),
82
82
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
83
- isEmojiPickerOpen = _useState6[0],
84
- setIsEmojiPickerOpen = _useState6[1];
83
+ isSummaryViewButtonClicked = _useState6[0],
84
+ setIsSummaryViewButtonClicked = _useState6[1];
85
+ var _useState7 = (0, _react.useState)(false),
86
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
87
+ isEmojiPickerOpen = _useState8[0],
88
+ setIsEmojiPickerOpen = _useState8[1];
85
89
 
86
90
  /**
87
91
  * Event callback when the picker is closed
@@ -111,9 +115,12 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
111
115
  close(item.id);
112
116
  }, [onSelection, close]);
113
117
  var handlePopupClose = (0, _react.useCallback)(function () {
114
- setSummaryPopupOpen(false);
118
+ setSummaryPopupOpen(false, true);
115
119
  setIsEmojiPickerOpen(false);
116
- }, [setSummaryPopupOpen]);
120
+ setIsSummaryViewButtonClicked(false);
121
+ setIsSummaryViewButtonHovered(false);
122
+ setIsHoveringSummaryView(false);
123
+ }, [setSummaryPopupOpen, setIsEmojiPickerOpen, setIsSummaryViewButtonClicked, setIsSummaryViewButtonHovered, setIsHoveringSummaryView]);
117
124
  var openEmojiPicker = (0, _react.useCallback)(function () {
118
125
  // ufo start reactions picker open experience
119
126
  _ufo.PickerRender.start();
@@ -125,15 +132,31 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
125
132
  var handleEmojiPickerTriggerClick = (0, _react.useCallback)(function () {
126
133
  openEmojiPicker();
127
134
  setSummaryPopupOpen(false, true);
135
+ setIsSummaryViewButtonClicked(false);
136
+ setIsSummaryViewButtonHovered(false);
137
+ setIsHoveringSummaryView(false);
128
138
  }, [openEmojiPicker, setSummaryPopupOpen]);
129
139
  var handleSummaryClick = (0, _react.useCallback)(function () {
130
140
  if (hoverableSummaryView) {
131
- if (isEmojiPickerOpen) {
132
- setIsEmojiPickerOpen(false);
141
+ setIsHoveringSummaryView(false);
142
+ setIsSummaryViewButtonHovered(false);
143
+ if (isSummaryViewButtonClicked) {
144
+ // if the button was previously clicked, close the popup and reset the state
145
+ setSummaryPopupOpen(false, true);
146
+ setIsSummaryViewButtonClicked(false);
133
147
  } else {
134
- openEmojiPicker();
148
+ if (isEmojiPickerOpen) {
149
+ // if the emoji picker is open, close the popup and reset the state
150
+ setSummaryPopupOpen(false, true);
151
+ setIsSummaryViewButtonClicked(false);
152
+ } else {
153
+ // if the button was not previously clicked, open the popup and set the state
154
+ setSummaryPopupOpen(true, true);
155
+ setIsSummaryViewButtonClicked(true);
156
+ }
135
157
  }
136
- setSummaryPopupOpen(false);
158
+ // close the emoji picker
159
+ setIsEmojiPickerOpen(false);
137
160
  } else {
138
161
  if (isSummaryPopupOpen) {
139
162
  handlePopupClose();
@@ -141,7 +164,7 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
141
164
  setSummaryPopupOpen(true);
142
165
  }
143
166
  }
144
- }, [hoverableSummaryView, isEmojiPickerOpen, openEmojiPicker, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose]);
167
+ }, [hoverableSummaryView, isEmojiPickerOpen, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose, isSummaryViewButtonClicked, setIsSummaryViewButtonClicked]);
145
168
  var handleButtonMouseEnter = (0, _react.useCallback)(function () {
146
169
  setIsSummaryViewButtonHovered(true);
147
170
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -150,10 +173,10 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
150
173
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isEmojiPickerOpen]);
151
174
  var handleButtonMouseLeave = (0, _react.useCallback)(function () {
152
175
  setIsSummaryViewButtonHovered(false);
153
- if (hoverableSummaryView && !isHoveringSummaryView) {
176
+ if (hoverableSummaryView && !isHoveringSummaryView && !isSummaryViewButtonClicked) {
154
177
  setSummaryPopupOpen(false);
155
178
  }
156
- }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered]);
179
+ }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isSummaryViewButtonClicked]);
157
180
  var handleSummaryViewTrayMouseEnter = (0, _react.useCallback)(function () {
158
181
  setIsHoveringSummaryView(true);
159
182
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -162,10 +185,10 @@ var ReactionSummaryView = exports.ReactionSummaryView = function ReactionSummary
162
185
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsHoveringSummaryView, isEmojiPickerOpen]);
163
186
  var handleSummaryViewTrayMouseLeave = (0, _react.useCallback)(function () {
164
187
  setIsHoveringSummaryView(false);
165
- if (hoverableSummaryView && !isSummaryViewButtonHovered) {
188
+ if (hoverableSummaryView && !isSummaryViewButtonHovered && !isSummaryViewButtonClicked) {
166
189
  setSummaryPopupOpen(false);
167
190
  }
168
- }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen]);
191
+ }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen, isSummaryViewButtonClicked]);
169
192
  return /*#__PURE__*/React.createElement(_popup.default, {
170
193
  placement: placement,
171
194
  content: function content() {
@@ -1,7 +1,7 @@
1
1
  import { createAndFireEvent } from '@atlaskit/analytics-next';
2
2
  import { UI_EVENT_TYPE, OPERATIONAL_EVENT_TYPE } from '@atlaskit/analytics-gas-types';
3
3
  const packageName = "@atlaskit/reactions";
4
- const packageVersion = "31.12.0";
4
+ const packageVersion = "31.13.0";
5
5
  /**
6
6
  * TODO: move to utility package?
7
7
  * A random sampling function
@@ -71,6 +71,7 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
71
71
  const [isHoverableReactionPickerEmojiPickerOpen, setIsHoverableReactionPickerEmojiPickerOpen] = useState(false);
72
72
  const [isHoveringTrigger, setIsHoveringTrigger] = useState(false);
73
73
  const [isHoveringPopup, setIsHoveringPopup] = useState(false);
74
+ const [isTriggerClicked, setIsTriggerClicked] = useState(false);
74
75
  const [isPopupTrayOpen, setIsPopupTrayOpen] = useDelayedState(false, hoverableReactionPickerDelay);
75
76
 
76
77
  /**
@@ -125,7 +126,7 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
125
126
  * @param _id Optional id if an emoji button was selected or undefineed if was clicked outside the picker
126
127
  */
127
128
  const close = useCallback(_id => {
128
- setIsPopupTrayOpen(false);
129
+ setIsPopupTrayOpen(false, true);
129
130
  // ufo abort reaction experience
130
131
  PickerRender.abort({
131
132
  metadata: {
@@ -136,8 +137,11 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
136
137
  });
137
138
  if (hoverableReactionPicker) {
138
139
  setIsHoverableReactionPickerEmojiPickerOpen(false);
140
+ setIsTriggerClicked(false);
141
+ setIsHoveringTrigger(false);
142
+ setIsHoveringPopup(false);
139
143
  }
140
- }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker]);
144
+ }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker, setIsTriggerClicked, setIsHoveringTrigger, setIsHoveringPopup]);
141
145
 
142
146
  /**
143
147
  * Event handle rwhen selecting to show the custom emoji icons picker
@@ -152,6 +156,7 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
152
156
  setIsPopupTrayOpen(true);
153
157
  if (hoverableReactionPicker) {
154
158
  setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
159
+ setIsTriggerClicked(false);
155
160
  }
156
161
  onShowMore();
157
162
  }, [settings.showFullPicker, setIsPopupTrayOpen, onShowMore, popperPlacement, hoverableReactionPicker, setIsHoverableReactionPickerEmojiPickerOpen, isHoverableReactionPickerEmojiPickerOpen]);
@@ -180,15 +185,30 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
180
185
  popperPlacement
181
186
  });
182
187
  if (hoverableReactionPicker) {
183
- setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
184
- setIsPopupTrayOpen(!isHoverableReactionPickerEmojiPickerOpen || !isPopupTrayOpen);
188
+ if (isTriggerClicked) {
189
+ // if the button was previously clicked, close the popup and reset the state
190
+ setIsTriggerClicked(false);
191
+ setIsPopupTrayOpen(false, true);
192
+ } else {
193
+ if (isHoverableReactionPickerEmojiPickerOpen) {
194
+ // if the emoji picker is open, close the popup and reset the state
195
+ setIsTriggerClicked(false);
196
+ setIsPopupTrayOpen(false, true);
197
+ } else {
198
+ // if the button was not previously clicked, open the popup and set the state
199
+ setIsTriggerClicked(true);
200
+ setIsPopupTrayOpen(true, true);
201
+ }
202
+ }
203
+ // close the emoji picker
204
+ setIsHoverableReactionPickerEmojiPickerOpen(false);
185
205
  } else {
186
206
  setIsPopupTrayOpen(!isPopupTrayOpen);
187
207
  }
188
208
  onOpen();
189
209
  // ufo reactions picker opened success
190
210
  PickerRender.success();
191
- }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
211
+ }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
192
212
  const handleTriggerMouseEnter = useCallback(() => {
193
213
  if (hoverableReactionPicker) {
194
214
  setIsHoveringTrigger(true);
@@ -200,11 +220,11 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
200
220
  const handleTriggerMouseLeave = useCallback(() => {
201
221
  if (hoverableReactionPicker) {
202
222
  setIsHoveringTrigger(false);
203
- if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen) {
223
+ if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
204
224
  setIsPopupTrayOpen(false);
205
225
  }
206
226
  }
207
- }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
227
+ }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
208
228
  const handlePopupMouseEnter = useCallback(() => {
209
229
  if (hoverableReactionPicker) {
210
230
  setIsHoveringPopup(true);
@@ -216,11 +236,11 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
216
236
  const handlePopupMouseLeave = useCallback(() => {
217
237
  if (hoverableReactionPicker) {
218
238
  setIsHoveringPopup(false);
219
- if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen) {
239
+ if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
220
240
  setIsPopupTrayOpen(false);
221
241
  }
222
242
  }
223
- }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
243
+ }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
224
244
  const wrapperClassName = ` ${isPopupTrayOpen ? 'isOpen' : ''} ${miniMode ? 'miniMode' : ''} ${className}`;
225
245
  useLayoutEffect(() => {
226
246
  var _updatePopper$current;
@@ -50,6 +50,7 @@ export const ReactionSummaryView = ({
50
50
  const [isSummaryPopupOpen, setSummaryPopupOpen] = useDelayedState(false, hoverableSummaryViewDelay);
51
51
  const [isHoveringSummaryView, setIsHoveringSummaryView] = useState(false);
52
52
  const [isSummaryViewButtonHovered, setIsSummaryViewButtonHovered] = useState(false);
53
+ const [isSummaryViewButtonClicked, setIsSummaryViewButtonClicked] = useState(false);
53
54
  const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState(false);
54
55
 
55
56
  /**
@@ -80,9 +81,12 @@ export const ReactionSummaryView = ({
80
81
  close(item.id);
81
82
  }, [onSelection, close]);
82
83
  const handlePopupClose = useCallback(() => {
83
- setSummaryPopupOpen(false);
84
+ setSummaryPopupOpen(false, true);
84
85
  setIsEmojiPickerOpen(false);
85
- }, [setSummaryPopupOpen]);
86
+ setIsSummaryViewButtonClicked(false);
87
+ setIsSummaryViewButtonHovered(false);
88
+ setIsHoveringSummaryView(false);
89
+ }, [setSummaryPopupOpen, setIsEmojiPickerOpen, setIsSummaryViewButtonClicked, setIsSummaryViewButtonHovered, setIsHoveringSummaryView]);
86
90
  const openEmojiPicker = useCallback(() => {
87
91
  // ufo start reactions picker open experience
88
92
  PickerRender.start();
@@ -94,15 +98,31 @@ export const ReactionSummaryView = ({
94
98
  const handleEmojiPickerTriggerClick = useCallback(() => {
95
99
  openEmojiPicker();
96
100
  setSummaryPopupOpen(false, true);
101
+ setIsSummaryViewButtonClicked(false);
102
+ setIsSummaryViewButtonHovered(false);
103
+ setIsHoveringSummaryView(false);
97
104
  }, [openEmojiPicker, setSummaryPopupOpen]);
98
105
  const handleSummaryClick = useCallback(() => {
99
106
  if (hoverableSummaryView) {
100
- if (isEmojiPickerOpen) {
101
- setIsEmojiPickerOpen(false);
107
+ setIsHoveringSummaryView(false);
108
+ setIsSummaryViewButtonHovered(false);
109
+ if (isSummaryViewButtonClicked) {
110
+ // if the button was previously clicked, close the popup and reset the state
111
+ setSummaryPopupOpen(false, true);
112
+ setIsSummaryViewButtonClicked(false);
102
113
  } else {
103
- openEmojiPicker();
114
+ if (isEmojiPickerOpen) {
115
+ // if the emoji picker is open, close the popup and reset the state
116
+ setSummaryPopupOpen(false, true);
117
+ setIsSummaryViewButtonClicked(false);
118
+ } else {
119
+ // if the button was not previously clicked, open the popup and set the state
120
+ setSummaryPopupOpen(true, true);
121
+ setIsSummaryViewButtonClicked(true);
122
+ }
104
123
  }
105
- setSummaryPopupOpen(false);
124
+ // close the emoji picker
125
+ setIsEmojiPickerOpen(false);
106
126
  } else {
107
127
  if (isSummaryPopupOpen) {
108
128
  handlePopupClose();
@@ -110,7 +130,7 @@ export const ReactionSummaryView = ({
110
130
  setSummaryPopupOpen(true);
111
131
  }
112
132
  }
113
- }, [hoverableSummaryView, isEmojiPickerOpen, openEmojiPicker, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose]);
133
+ }, [hoverableSummaryView, isEmojiPickerOpen, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose, isSummaryViewButtonClicked, setIsSummaryViewButtonClicked]);
114
134
  const handleButtonMouseEnter = useCallback(() => {
115
135
  setIsSummaryViewButtonHovered(true);
116
136
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -119,10 +139,10 @@ export const ReactionSummaryView = ({
119
139
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isEmojiPickerOpen]);
120
140
  const handleButtonMouseLeave = useCallback(() => {
121
141
  setIsSummaryViewButtonHovered(false);
122
- if (hoverableSummaryView && !isHoveringSummaryView) {
142
+ if (hoverableSummaryView && !isHoveringSummaryView && !isSummaryViewButtonClicked) {
123
143
  setSummaryPopupOpen(false);
124
144
  }
125
- }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered]);
145
+ }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isSummaryViewButtonClicked]);
126
146
  const handleSummaryViewTrayMouseEnter = useCallback(() => {
127
147
  setIsHoveringSummaryView(true);
128
148
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -131,10 +151,10 @@ export const ReactionSummaryView = ({
131
151
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsHoveringSummaryView, isEmojiPickerOpen]);
132
152
  const handleSummaryViewTrayMouseLeave = useCallback(() => {
133
153
  setIsHoveringSummaryView(false);
134
- if (hoverableSummaryView && !isSummaryViewButtonHovered) {
154
+ if (hoverableSummaryView && !isSummaryViewButtonHovered && !isSummaryViewButtonClicked) {
135
155
  setSummaryPopupOpen(false);
136
156
  }
137
- }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen]);
157
+ }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen, isSummaryViewButtonClicked]);
138
158
  return /*#__PURE__*/React.createElement(Popup, {
139
159
  placement: placement,
140
160
  content: () => isEmojiPickerOpen ? /*#__PURE__*/React.createElement(EmojiPicker, {
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  import { createAndFireEvent } from '@atlaskit/analytics-next';
5
5
  import { UI_EVENT_TYPE, OPERATIONAL_EVENT_TYPE } from '@atlaskit/analytics-gas-types';
6
6
  var packageName = "@atlaskit/reactions";
7
- var packageVersion = "31.12.0";
7
+ var packageVersion = "31.13.0";
8
8
  /**
9
9
  * TODO: move to utility package?
10
10
  * A random sampling function
@@ -96,6 +96,10 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
96
96
  _useState8 = _slicedToArray(_useState7, 2),
97
97
  isHoveringPopup = _useState8[0],
98
98
  setIsHoveringPopup = _useState8[1];
99
+ var _useState9 = useState(false),
100
+ _useState10 = _slicedToArray(_useState9, 2),
101
+ isTriggerClicked = _useState10[0],
102
+ setIsTriggerClicked = _useState10[1];
99
103
  var _useDelayedState = useDelayedState(false, hoverableReactionPickerDelay),
100
104
  _useDelayedState2 = _slicedToArray(_useDelayedState, 2),
101
105
  isPopupTrayOpen = _useDelayedState2[0],
@@ -136,7 +140,7 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
136
140
  }, reactionsPickerPreventOverflowOptions && {
137
141
  options: reactionsPickerPreventOverflowOptions
138
142
  })];
139
- var _useState9 = useState({
143
+ var _useState11 = useState({
140
144
  /**
141
145
  * Show the full custom emoji list picker or the default list of emojis
142
146
  */
@@ -146,16 +150,16 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
146
150
  */
147
151
  popperPlacement: popperPlacement
148
152
  }),
149
- _useState10 = _slicedToArray(_useState9, 2),
150
- settings = _useState10[0],
151
- setSettings = _useState10[1];
153
+ _useState12 = _slicedToArray(_useState11, 2),
154
+ settings = _useState12[0],
155
+ setSettings = _useState12[1];
152
156
 
153
157
  /**
154
158
  * Event callback when the picker is closed
155
159
  * @param _id Optional id if an emoji button was selected or undefineed if was clicked outside the picker
156
160
  */
157
161
  var close = useCallback(function (_id) {
158
- setIsPopupTrayOpen(false);
162
+ setIsPopupTrayOpen(false, true);
159
163
  // ufo abort reaction experience
160
164
  PickerRender.abort({
161
165
  metadata: {
@@ -166,8 +170,11 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
166
170
  });
167
171
  if (hoverableReactionPicker) {
168
172
  setIsHoverableReactionPickerEmojiPickerOpen(false);
173
+ setIsTriggerClicked(false);
174
+ setIsHoveringTrigger(false);
175
+ setIsHoveringPopup(false);
169
176
  }
170
- }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker]);
177
+ }, [setIsPopupTrayOpen, setIsHoverableReactionPickerEmojiPickerOpen, hoverableReactionPicker, setIsTriggerClicked, setIsHoveringTrigger, setIsHoveringPopup]);
171
178
 
172
179
  /**
173
180
  * Event handle rwhen selecting to show the custom emoji icons picker
@@ -182,6 +189,7 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
182
189
  setIsPopupTrayOpen(true);
183
190
  if (hoverableReactionPicker) {
184
191
  setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
192
+ setIsTriggerClicked(false);
185
193
  }
186
194
  onShowMore();
187
195
  }, [settings.showFullPicker, setIsPopupTrayOpen, onShowMore, popperPlacement, hoverableReactionPicker, setIsHoverableReactionPickerEmojiPickerOpen, isHoverableReactionPickerEmojiPickerOpen]);
@@ -209,15 +217,30 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
209
217
  popperPlacement: popperPlacement
210
218
  }));
211
219
  if (hoverableReactionPicker) {
212
- setIsHoverableReactionPickerEmojiPickerOpen(!isHoverableReactionPickerEmojiPickerOpen);
213
- setIsPopupTrayOpen(!isHoverableReactionPickerEmojiPickerOpen || !isPopupTrayOpen);
220
+ if (isTriggerClicked) {
221
+ // if the button was previously clicked, close the popup and reset the state
222
+ setIsTriggerClicked(false);
223
+ setIsPopupTrayOpen(false, true);
224
+ } else {
225
+ if (isHoverableReactionPickerEmojiPickerOpen) {
226
+ // if the emoji picker is open, close the popup and reset the state
227
+ setIsTriggerClicked(false);
228
+ setIsPopupTrayOpen(false, true);
229
+ } else {
230
+ // if the button was not previously clicked, open the popup and set the state
231
+ setIsTriggerClicked(true);
232
+ setIsPopupTrayOpen(true, true);
233
+ }
234
+ }
235
+ // close the emoji picker
236
+ setIsHoverableReactionPickerEmojiPickerOpen(false);
214
237
  } else {
215
238
  setIsPopupTrayOpen(!isPopupTrayOpen);
216
239
  }
217
240
  onOpen();
218
241
  // ufo reactions picker opened success
219
242
  PickerRender.success();
220
- }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
243
+ }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
221
244
  var handleTriggerMouseEnter = useCallback(function () {
222
245
  if (hoverableReactionPicker) {
223
246
  setIsHoveringTrigger(true);
@@ -229,11 +252,11 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
229
252
  var handleTriggerMouseLeave = useCallback(function () {
230
253
  if (hoverableReactionPicker) {
231
254
  setIsHoveringTrigger(false);
232
- if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen) {
255
+ if (!isHoveringPopup && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
233
256
  setIsPopupTrayOpen(false);
234
257
  }
235
258
  }
236
- }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
259
+ }, [hoverableReactionPicker, isHoveringPopup, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
237
260
  var handlePopupMouseEnter = useCallback(function () {
238
261
  if (hoverableReactionPicker) {
239
262
  setIsHoveringPopup(true);
@@ -245,11 +268,11 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
245
268
  var handlePopupMouseLeave = useCallback(function () {
246
269
  if (hoverableReactionPicker) {
247
270
  setIsHoveringPopup(false);
248
- if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen) {
271
+ if (!isHoveringTrigger && !isHoverableReactionPickerEmojiPickerOpen && !isTriggerClicked) {
249
272
  setIsPopupTrayOpen(false);
250
273
  }
251
274
  }
252
- }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen]);
275
+ }, [hoverableReactionPicker, isHoveringTrigger, isHoverableReactionPickerEmojiPickerOpen, setIsPopupTrayOpen, isTriggerClicked]);
253
276
  var wrapperClassName = " ".concat(isPopupTrayOpen ? 'isOpen' : '', " ").concat(miniMode ? 'miniMode' : '', " ").concat(className);
254
277
  useLayoutEffect(function () {
255
278
  var _updatePopper$current;
@@ -333,10 +356,10 @@ export var PopperWrapper = function PopperWrapper(props) {
333
356
  onClose = props.onClose,
334
357
  children = props.children,
335
358
  popperModifiers = props.popperModifiers;
336
- var _useState11 = useState(null),
337
- _useState12 = _slicedToArray(_useState11, 2),
338
- popupRef = _useState12[0],
339
- setPopupRef = _useState12[1];
359
+ var _useState13 = useState(null),
360
+ _useState14 = _slicedToArray(_useState13, 2),
361
+ popupRef = _useState14[0],
362
+ setPopupRef = _useState14[1];
340
363
  var _useIntl = useIntl(),
341
364
  formatMessage = _useIntl.formatMessage;
342
365
  /**
@@ -70,8 +70,12 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
70
70
  setIsSummaryViewButtonHovered = _useState4[1];
71
71
  var _useState5 = useState(false),
72
72
  _useState6 = _slicedToArray(_useState5, 2),
73
- isEmojiPickerOpen = _useState6[0],
74
- setIsEmojiPickerOpen = _useState6[1];
73
+ isSummaryViewButtonClicked = _useState6[0],
74
+ setIsSummaryViewButtonClicked = _useState6[1];
75
+ var _useState7 = useState(false),
76
+ _useState8 = _slicedToArray(_useState7, 2),
77
+ isEmojiPickerOpen = _useState8[0],
78
+ setIsEmojiPickerOpen = _useState8[1];
75
79
 
76
80
  /**
77
81
  * Event callback when the picker is closed
@@ -101,9 +105,12 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
101
105
  close(item.id);
102
106
  }, [onSelection, close]);
103
107
  var handlePopupClose = useCallback(function () {
104
- setSummaryPopupOpen(false);
108
+ setSummaryPopupOpen(false, true);
105
109
  setIsEmojiPickerOpen(false);
106
- }, [setSummaryPopupOpen]);
110
+ setIsSummaryViewButtonClicked(false);
111
+ setIsSummaryViewButtonHovered(false);
112
+ setIsHoveringSummaryView(false);
113
+ }, [setSummaryPopupOpen, setIsEmojiPickerOpen, setIsSummaryViewButtonClicked, setIsSummaryViewButtonHovered, setIsHoveringSummaryView]);
107
114
  var openEmojiPicker = useCallback(function () {
108
115
  // ufo start reactions picker open experience
109
116
  PickerRender.start();
@@ -115,15 +122,31 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
115
122
  var handleEmojiPickerTriggerClick = useCallback(function () {
116
123
  openEmojiPicker();
117
124
  setSummaryPopupOpen(false, true);
125
+ setIsSummaryViewButtonClicked(false);
126
+ setIsSummaryViewButtonHovered(false);
127
+ setIsHoveringSummaryView(false);
118
128
  }, [openEmojiPicker, setSummaryPopupOpen]);
119
129
  var handleSummaryClick = useCallback(function () {
120
130
  if (hoverableSummaryView) {
121
- if (isEmojiPickerOpen) {
122
- setIsEmojiPickerOpen(false);
131
+ setIsHoveringSummaryView(false);
132
+ setIsSummaryViewButtonHovered(false);
133
+ if (isSummaryViewButtonClicked) {
134
+ // if the button was previously clicked, close the popup and reset the state
135
+ setSummaryPopupOpen(false, true);
136
+ setIsSummaryViewButtonClicked(false);
123
137
  } else {
124
- openEmojiPicker();
138
+ if (isEmojiPickerOpen) {
139
+ // if the emoji picker is open, close the popup and reset the state
140
+ setSummaryPopupOpen(false, true);
141
+ setIsSummaryViewButtonClicked(false);
142
+ } else {
143
+ // if the button was not previously clicked, open the popup and set the state
144
+ setSummaryPopupOpen(true, true);
145
+ setIsSummaryViewButtonClicked(true);
146
+ }
125
147
  }
126
- setSummaryPopupOpen(false);
148
+ // close the emoji picker
149
+ setIsEmojiPickerOpen(false);
127
150
  } else {
128
151
  if (isSummaryPopupOpen) {
129
152
  handlePopupClose();
@@ -131,7 +154,7 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
131
154
  setSummaryPopupOpen(true);
132
155
  }
133
156
  }
134
- }, [hoverableSummaryView, isEmojiPickerOpen, openEmojiPicker, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose]);
157
+ }, [hoverableSummaryView, isEmojiPickerOpen, setSummaryPopupOpen, isSummaryPopupOpen, handlePopupClose, isSummaryViewButtonClicked, setIsSummaryViewButtonClicked]);
135
158
  var handleButtonMouseEnter = useCallback(function () {
136
159
  setIsSummaryViewButtonHovered(true);
137
160
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -140,10 +163,10 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
140
163
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isEmojiPickerOpen]);
141
164
  var handleButtonMouseLeave = useCallback(function () {
142
165
  setIsSummaryViewButtonHovered(false);
143
- if (hoverableSummaryView && !isHoveringSummaryView) {
166
+ if (hoverableSummaryView && !isHoveringSummaryView && !isSummaryViewButtonClicked) {
144
167
  setSummaryPopupOpen(false);
145
168
  }
146
- }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered]);
169
+ }, [hoverableSummaryView, isHoveringSummaryView, setSummaryPopupOpen, setIsSummaryViewButtonHovered, isSummaryViewButtonClicked]);
147
170
  var handleSummaryViewTrayMouseEnter = useCallback(function () {
148
171
  setIsHoveringSummaryView(true);
149
172
  if (hoverableSummaryView && !isEmojiPickerOpen) {
@@ -152,10 +175,10 @@ export var ReactionSummaryView = function ReactionSummaryView(_ref) {
152
175
  }, [hoverableSummaryView, setSummaryPopupOpen, setIsHoveringSummaryView, isEmojiPickerOpen]);
153
176
  var handleSummaryViewTrayMouseLeave = useCallback(function () {
154
177
  setIsHoveringSummaryView(false);
155
- if (hoverableSummaryView && !isSummaryViewButtonHovered) {
178
+ if (hoverableSummaryView && !isSummaryViewButtonHovered && !isSummaryViewButtonClicked) {
156
179
  setSummaryPopupOpen(false);
157
180
  }
158
- }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen]);
181
+ }, [hoverableSummaryView, isSummaryViewButtonHovered, setIsHoveringSummaryView, setSummaryPopupOpen, isSummaryViewButtonClicked]);
159
182
  return /*#__PURE__*/React.createElement(Popup, {
160
183
  placement: placement,
161
184
  content: function content() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/reactions",
3
- "version": "31.12.0",
3
+ "version": "31.13.0",
4
4
  "description": "Reactions component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -49,7 +49,7 @@
49
49
  "@atlaskit/popup": "^4.2.0",
50
50
  "@atlaskit/portal": "^5.1.0",
51
51
  "@atlaskit/primitives": "^14.7.0",
52
- "@atlaskit/react-ufo": "^3.11.0",
52
+ "@atlaskit/react-ufo": "^3.12.0",
53
53
  "@atlaskit/spinner": "^18.0.0",
54
54
  "@atlaskit/tabs": "^18.0.0",
55
55
  "@atlaskit/theme": "^18.0.0",