@atlaskit/reactions 21.1.0 → 21.2.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/analytics/index.js +11 -1
  3. package/dist/cjs/analytics/ufo.js +73 -0
  4. package/dist/cjs/components/ReactionPicker.js +17 -4
  5. package/dist/cjs/components/UfoErrorBoundary.js +68 -0
  6. package/dist/cjs/components/index.js +9 -1
  7. package/dist/cjs/containers/ConnectedReactionPicker.js +44 -0
  8. package/dist/cjs/containers/ConnectedReactionsView.js +131 -0
  9. package/dist/cjs/containers/index.js +4 -6
  10. package/dist/cjs/index.js +11 -3
  11. package/dist/cjs/{reaction-store → store}/ReactionConsumer.js +0 -0
  12. package/dist/cjs/{reaction-store → store}/ReactionsStore.js +63 -14
  13. package/dist/cjs/{reaction-store → store}/batched.js +0 -0
  14. package/dist/cjs/{reaction-store → store}/index.js +0 -0
  15. package/dist/cjs/{reaction-store → store}/utils.js +0 -0
  16. package/dist/cjs/version.json +1 -1
  17. package/dist/es2019/analytics/index.js +2 -0
  18. package/dist/es2019/analytics/ufo.js +62 -0
  19. package/dist/es2019/components/ReactionPicker.js +13 -3
  20. package/dist/es2019/components/UfoErrorBoundary.js +13 -0
  21. package/dist/es2019/components/index.js +2 -1
  22. package/dist/es2019/containers/ConnectedReactionPicker.js +27 -0
  23. package/dist/es2019/containers/ConnectedReactionsView.js +112 -0
  24. package/dist/es2019/containers/index.js +2 -2
  25. package/dist/es2019/index.js +2 -1
  26. package/dist/es2019/{reaction-store → store}/ReactionConsumer.js +0 -0
  27. package/dist/es2019/{reaction-store → store}/ReactionsStore.js +59 -13
  28. package/dist/es2019/{reaction-store → store}/batched.js +0 -0
  29. package/dist/es2019/{reaction-store → store}/index.js +0 -0
  30. package/dist/es2019/{reaction-store → store}/utils.js +0 -0
  31. package/dist/es2019/version.json +1 -1
  32. package/dist/esm/analytics/index.js +2 -0
  33. package/dist/esm/analytics/ufo.js +62 -0
  34. package/dist/esm/components/ReactionPicker.js +13 -3
  35. package/dist/esm/components/UfoErrorBoundary.js +54 -0
  36. package/dist/esm/components/index.js +2 -1
  37. package/dist/esm/containers/ConnectedReactionPicker.js +29 -0
  38. package/dist/esm/containers/ConnectedReactionsView.js +108 -0
  39. package/dist/esm/containers/index.js +2 -2
  40. package/dist/esm/index.js +2 -1
  41. package/dist/esm/{reaction-store → store}/ReactionConsumer.js +0 -0
  42. package/dist/esm/{reaction-store → store}/ReactionsStore.js +61 -13
  43. package/dist/esm/{reaction-store → store}/batched.js +0 -0
  44. package/dist/esm/{reaction-store → store}/index.js +0 -0
  45. package/dist/esm/{reaction-store → store}/utils.js +0 -0
  46. package/dist/esm/version.json +1 -1
  47. package/dist/types/analytics/index.d.ts +1 -0
  48. package/dist/types/analytics/ufo.d.ts +33 -0
  49. package/dist/types/components/ReactionPicker.d.ts +2 -1
  50. package/dist/types/components/Reactions.d.ts +7 -5
  51. package/dist/types/components/UfoErrorBoundary.d.ts +8 -0
  52. package/dist/types/components/index.d.ts +2 -0
  53. package/dist/types/containers/ConnectedReactionPicker.d.ts +10 -0
  54. package/dist/types/containers/ConnectedReactionsView.d.ts +19 -0
  55. package/dist/types/containers/index.d.ts +2 -2
  56. package/dist/types/index.d.ts +3 -2
  57. package/dist/types/store/ReactionConsumer.d.ts +29 -0
  58. package/dist/types/{reaction-store → store}/ReactionsStore.d.ts +11 -7
  59. package/dist/types/{reaction-store → store}/batched.d.ts +0 -0
  60. package/dist/types/{reaction-store → store}/index.d.ts +0 -0
  61. package/dist/types/{reaction-store → store}/utils.d.ts +0 -0
  62. package/dist/types/types/Actions.d.ts +6 -0
  63. package/dist/types/types/index.d.ts +1 -1
  64. package/docs/0-intro.tsx +1 -1
  65. package/package.json +5 -3
  66. package/dist/cjs/containers/ReactionsContainer.js +0 -142
  67. package/dist/cjs/containers/ReactionsPickerContainer.js +0 -76
  68. package/dist/es2019/containers/ReactionsContainer.js +0 -96
  69. package/dist/es2019/containers/ReactionsPickerContainer.js +0 -26
  70. package/dist/esm/containers/ReactionsContainer.js +0 -125
  71. package/dist/esm/containers/ReactionsPickerContainer.js +0 -62
  72. package/dist/types/containers/ReactionsContainer.d.ts +0 -22
  73. package/dist/types/containers/ReactionsPickerContainer.d.ts +0 -18
  74. package/dist/types/reaction-store/ReactionConsumer.d.ts +0 -32
@@ -0,0 +1,62 @@
1
+ import { ConcurrentExperience, UFOExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
+ /**
3
+ * Initial experience config object (deferred from @atlaskit/ufo inner types)
4
+ * TODO: Check if possible to add this to exported types from @atlaskit/ufo
5
+ */
6
+
7
+ /**
8
+ * Helper method for create the config type for an individual/Concurrent experience
9
+ * @param componentName
10
+ */
11
+ var createExperienceConfig = function createExperienceConfig(componentName, type, performanceType) {
12
+ return {
13
+ platform: {
14
+ component: componentName
15
+ },
16
+ type: type,
17
+ performanceType: performanceType
18
+ };
19
+ };
20
+ /**
21
+ * Types of experiences
22
+ */
23
+
24
+
25
+ export var ExperienceName;
26
+ /**
27
+ * UFO types of components been instrumented
28
+ */
29
+
30
+ (function (ExperienceName) {
31
+ ExperienceName["REACTIONS_RENDERED"] = "reactions-rendered";
32
+ ExperienceName["PICKER_OPENED"] = "reactions-picker-opened";
33
+ ExperienceName["REACTION_ADDED"] = "reaction-added";
34
+ ExperienceName["REACTION_REMOVED"] = "reaction-removed";
35
+ })(ExperienceName || (ExperienceName = {}));
36
+
37
+ export var ComponentName;
38
+ /**
39
+ * Experience when the emoji picker is opened
40
+ */
41
+
42
+ (function (ComponentName) {
43
+ ComponentName["PICKER_RENDERED"] = "reactions-picker";
44
+ ComponentName["REACTIONS"] = "reactions-list";
45
+ })(ComponentName || (ComponentName = {}));
46
+
47
+ export var PickerRender = new UFOExperience(ExperienceName.PICKER_OPENED, createExperienceConfig(ComponentName.PICKER_RENDERED, ExperienceTypes.Experience, ExperiencePerformanceTypes.InlineResult));
48
+ /**
49
+ * Experience when the list of reactions gets rendered
50
+ */
51
+
52
+ export var ReactionsRendered = new ConcurrentExperience(ExperienceName.REACTIONS_RENDERED, createExperienceConfig(ComponentName.REACTIONS, ExperienceTypes.Load, ExperiencePerformanceTypes.PageSegmentLoad));
53
+ /**
54
+ * Experience when a reaction emoji gets added
55
+ */
56
+
57
+ export var ReactionsAdd = new ConcurrentExperience(ExperienceName.REACTION_ADDED, createExperienceConfig(ComponentName.REACTIONS, ExperienceTypes.Experience, ExperiencePerformanceTypes.InlineResult));
58
+ /**
59
+ * Experience when a reaction emoji gets removed/decrement
60
+ */
61
+
62
+ export var ReactionsRemove = new ConcurrentExperience(ExperienceName.REACTION_REMOVED, createExperienceConfig(ComponentName.REACTIONS, ExperienceTypes.Experience, ExperiencePerformanceTypes.InlineResult));
@@ -15,17 +15,17 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
15
15
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
16
16
 
17
17
  /** @jsx jsx */
18
+ import React, { Fragment, PureComponent } from 'react';
19
+ import ReactDOM from 'react-dom';
18
20
  import { jsx, css } from '@emotion/core';
19
21
  import { EmojiPicker } from '@atlaskit/emoji/picker';
20
22
  import { Manager, Popper, Reference } from '@atlaskit/popper';
21
23
  import { borderRadius } from '@atlaskit/theme/constants';
22
24
  import { N0, N50A, N60A } from '@atlaskit/theme/colors';
23
25
  import { token } from '@atlaskit/tokens';
24
- import React, { Fragment } from 'react';
25
- import { PureComponent } from 'react';
26
- import ReactDOM from 'react-dom';
27
26
  import { Selector } from './Selector';
28
27
  import { Trigger } from './Trigger';
28
+ import { UFO } from '../analytics';
29
29
  import { layers } from '@atlaskit/theme/constants';
30
30
  var pickerStyle = css({
31
31
  verticalAlign: 'middle',
@@ -110,6 +110,9 @@ export var ReactionPicker = /*#__PURE__*/function (_PureComponent) {
110
110
  });
111
111
 
112
112
  _defineProperty(_assertThisInitialized(_this), "onTriggerClick", function () {
113
+ // ufo start reaction experience
114
+ UFO.PickerRender.start();
115
+
113
116
  if (_this.props.onOpen) {
114
117
  _this.props.onOpen();
115
118
  }
@@ -117,6 +120,9 @@ export var ReactionPicker = /*#__PURE__*/function (_PureComponent) {
117
120
  _this.setState({
118
121
  isOpen: !_this.state.isOpen,
119
122
  showFullPicker: false
123
+ }, function () {
124
+ // ufo add reaction success
125
+ UFO.PickerRender.success();
120
126
  });
121
127
  });
122
128
 
@@ -160,6 +166,7 @@ export var ReactionPicker = /*#__PURE__*/function (_PureComponent) {
160
166
  key: "componentWillUnmount",
161
167
  value: function componentWillUnmount() {
162
168
  document.removeEventListener('click', this.handleClickOutside);
169
+ UFO.PickerRender.abort();
163
170
  }
164
171
  }, {
165
172
  key: "close",
@@ -167,6 +174,9 @@ export var ReactionPicker = /*#__PURE__*/function (_PureComponent) {
167
174
  this.setState({
168
175
  isOpen: false,
169
176
  showFullPicker: false
177
+ }, function () {
178
+ // ufo abort reaction experience
179
+ UFO.PickerRender.abort();
170
180
  });
171
181
  }
172
182
  }, {
@@ -0,0 +1,54 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/createClass";
3
+ import _inherits from "@babel/runtime/helpers/inherits";
4
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
5
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
6
+
7
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
8
+
9
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
+
11
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
12
+
13
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
14
+
15
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
16
+
17
+ import React from 'react';
18
+ export var UfoErrorBoundary = /*#__PURE__*/function (_React$Component) {
19
+ _inherits(UfoErrorBoundary, _React$Component);
20
+
21
+ var _super = _createSuper(UfoErrorBoundary);
22
+
23
+ function UfoErrorBoundary() {
24
+ _classCallCheck(this, UfoErrorBoundary);
25
+
26
+ return _super.apply(this, arguments);
27
+ }
28
+
29
+ _createClass(UfoErrorBoundary, [{
30
+ key: "componentDidCatch",
31
+ value: function componentDidCatch() {
32
+ var _iterator = _createForOfIteratorHelper(this.props.experiences),
33
+ _step;
34
+
35
+ try {
36
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
37
+ var e = _step.value;
38
+ e.failure();
39
+ }
40
+ } catch (err) {
41
+ _iterator.e(err);
42
+ } finally {
43
+ _iterator.f();
44
+ }
45
+ }
46
+ }, {
47
+ key: "render",
48
+ value: function render() {
49
+ return this.props.children;
50
+ }
51
+ }]);
52
+
53
+ return UfoErrorBoundary;
54
+ }(React.Component);
@@ -1,3 +1,4 @@
1
1
  export { Reaction } from './Reaction';
2
2
  export { ReactionPicker } from './ReactionPicker';
3
- export { Reactions } from './Reactions';
3
+ export { Reactions } from './Reactions';
4
+ export { UfoErrorBoundary } from './UfoErrorBoundary';
@@ -0,0 +1,29 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React from 'react';
3
+ import { ReactionPicker, UfoErrorBoundary } from '../components';
4
+ import { ReactionConsumer } from '../store/ReactionConsumer';
5
+ import { UFO } from '../analytics';
6
+
7
+ /**
8
+ * UFO Instance for picker
9
+ */
10
+ export var ConnectedReactionPicker = function ConnectedReactionPicker(props) {
11
+ var renderChild = function renderChild(innerProps) {
12
+ return /*#__PURE__*/React.createElement(ReactionPicker, _extends({}, props, innerProps));
13
+ };
14
+
15
+ var actionsMapper = function actionsMapper(actions) {
16
+ return {
17
+ onSelection: function onSelection(emojiId) {
18
+ actions.addReaction(props.containerAri, props.ari, emojiId);
19
+ }
20
+ };
21
+ };
22
+
23
+ return /*#__PURE__*/React.createElement(UfoErrorBoundary, {
24
+ experiences: [UFO.PickerRender]
25
+ }, /*#__PURE__*/React.createElement(ReactionConsumer, {
26
+ store: props.store,
27
+ actionsMapper: actionsMapper
28
+ }, renderChild));
29
+ };
@@ -0,0 +1,108 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useEffect, useRef } from 'react';
3
+ import { FabricElementsAnalyticsContext } from '@atlaskit/analytics-namespaced-context';
4
+ import { withAnalyticsEvents } from '@atlaskit/analytics-next';
5
+ import { Reactions, UfoErrorBoundary } from '../components';
6
+ import { ReactionConsumer } from '../store/ReactionConsumer';
7
+ import { ReactionStatus } from '../types/ReactionStatus';
8
+ import { ufoExperiences } from '../store/ReactionsStore';
9
+
10
+ var ReactionsView = function ReactionsView(props) {
11
+ // // compose a UFO experience object
12
+ var experienceInstance = useRef();
13
+ var ari = props.ari,
14
+ createAnalyticsEvent = props.createAnalyticsEvent,
15
+ store = props.store;
16
+ useEffect(function () {
17
+ experienceInstance.current = ufoExperiences.render.getInstance(ari);
18
+ }, [ari]);
19
+ useEffect(function () {
20
+ Promise.resolve(store).then(function (_store) {
21
+ if (_store.setCreateAnalyticsEvent && createAnalyticsEvent) {
22
+ _store.setCreateAnalyticsEvent(createAnalyticsEvent);
23
+ }
24
+ });
25
+ }, [createAnalyticsEvent, store]); // abort when component gets unmounted
26
+
27
+ useEffect(function () {
28
+ return function () {
29
+ var _experienceInstance$c;
30
+
31
+ (_experienceInstance$c = experienceInstance.current) === null || _experienceInstance$c === void 0 ? void 0 : _experienceInstance$c.abort();
32
+ };
33
+ }, [experienceInstance]);
34
+
35
+ var renderChildren = function renderChildren(innerProps) {
36
+ var containerAri = props.containerAri,
37
+ ari = props.ari;
38
+ return /*#__PURE__*/React.createElement(FabricElementsAnalyticsContext, {
39
+ data: {
40
+ containerAri: containerAri,
41
+ ari: ari
42
+ }
43
+ }, /*#__PURE__*/React.createElement(Reactions, _extends({
44
+ key: "".concat(props.containerAri, "|").concat(props.ari)
45
+ }, props, innerProps)));
46
+ };
47
+
48
+ var stateMapper = function stateMapper(state) {
49
+ var containerAri = props.containerAri,
50
+ ari = props.ari;
51
+ var reactionsState = state && state.reactions["".concat(containerAri, "|").concat(ari)];
52
+
53
+ if (!state || !reactionsState) {
54
+ return {
55
+ status: ReactionStatus.notLoaded,
56
+ reactions: []
57
+ };
58
+ }
59
+
60
+ switch (reactionsState.status) {
61
+ case ReactionStatus.ready:
62
+ return {
63
+ reactions: reactionsState.reactions,
64
+ status: reactionsState.status,
65
+ flash: state.flash["".concat(containerAri, "|").concat(ari)]
66
+ };
67
+
68
+ case ReactionStatus.error:
69
+ return {
70
+ status: ReactionStatus.error,
71
+ reactions: []
72
+ };
73
+
74
+ default:
75
+ return {
76
+ status: ReactionStatus.loading,
77
+ reactions: []
78
+ };
79
+ }
80
+ };
81
+
82
+ var actionsMapper = function actionsMapper(actions) {
83
+ return {
84
+ loadReaction: function loadReaction() {
85
+ actions.getReactions(props.containerAri, props.ari);
86
+ },
87
+ onReactionClick: function onReactionClick(emojiId) {
88
+ actions.toggleReaction(props.containerAri, props.ari, emojiId);
89
+ },
90
+ onReactionHover: function onReactionHover(emojiId) {
91
+ actions.getDetailedReaction(props.containerAri, props.ari, emojiId);
92
+ },
93
+ onSelection: function onSelection(emojiId) {
94
+ actions.addReaction(props.containerAri, props.ari, emojiId);
95
+ }
96
+ };
97
+ };
98
+
99
+ return /*#__PURE__*/React.createElement(UfoErrorBoundary, {
100
+ experiences: experienceInstance.current ? [experienceInstance.current] : []
101
+ }, /*#__PURE__*/React.createElement(ReactionConsumer, {
102
+ store: props.store,
103
+ actionsMapper: actionsMapper,
104
+ stateMapper: stateMapper
105
+ }, renderChildren));
106
+ };
107
+
108
+ export var ConnectedReactionsView = withAnalyticsEvents()(ReactionsView);
@@ -1,2 +1,2 @@
1
- export { default as ConnectedReactionPicker } from './ReactionsPickerContainer';
2
- export { default as ConnectedReactionsView } from './ReactionsContainer';
1
+ export { ConnectedReactionPicker } from './ConnectedReactionPicker';
2
+ export { ConnectedReactionsView } from './ConnectedReactionsView';
package/dist/esm/index.js CHANGED
@@ -1,4 +1,5 @@
1
+ export { UFO } from './analytics';
1
2
  export { ReactionServiceClient } from './client';
2
3
  export { Reaction, ReactionPicker, Reactions } from './components';
3
4
  export { ConnectedReactionPicker, ConnectedReactionsView } from './containers';
4
- export { MemoryReactionsStore, ReactionConsumer } from './reaction-store';
5
+ export { MemoryReactionsStore, ReactionConsumer } from './store';
@@ -6,11 +6,20 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
6
6
 
7
7
  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) { _defineProperty(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; }
8
8
 
9
- import { createRestSucceededEvent, createRestFailedEvent, createAndFireSafe } from '../analytics';
10
- import { ReactionStatus } from '../types';
9
+ import * as Analytics from '../analytics';
10
+ import * as Types from '../types';
11
11
  import { batch, batchByKey } from './batched';
12
12
  import * as utils from './utils';
13
13
  import { isRealErrorFromService } from './utils';
14
+
15
+ /**
16
+ * Set of all available UFO experiences relating to reaction element
17
+ */
18
+ export var ufoExperiences = {
19
+ add: Analytics.UFO.ReactionsAdd,
20
+ remove: Analytics.UFO.ReactionsRemove,
21
+ render: Analytics.UFO.ReactionsRendered
22
+ };
14
23
  export var MemoryReactionsStore = /*#__PURE__*/function () {
15
24
  function MemoryReactionsStore(client) {
16
25
  var _this = this;
@@ -112,13 +121,26 @@ export var MemoryReactionsStore = /*#__PURE__*/function () {
112
121
 
113
122
  _this.flash(reaction);
114
123
 
124
+ var exp = ufoExperiences.add.getInstance("".concat(ari, "|").concat(emojiId)); // ufo start reaction experience
125
+
126
+ exp.start();
127
+
115
128
  _this.client.addReaction(containerAri, ari, emojiId, _this.metadata).then(function (_) {
116
129
  if (_this.createAnalyticsEvent) {
117
- createAndFireSafe(_this.createAnalyticsEvent, createRestSucceededEvent, 'addReaction');
118
- }
130
+ Analytics.createAndFireSafe(_this.createAnalyticsEvent, Analytics.createRestSucceededEvent, 'addReaction');
131
+ } // ufo add reaction success
132
+
133
+
134
+ exp.success();
119
135
  }).catch(function (error) {
120
136
  if (_this.createAnalyticsEvent && isRealErrorFromService(error.code)) {
121
- createAndFireSafe(_this.createAnalyticsEvent, createRestFailedEvent, 'addReaction', error.code);
137
+ _this.createAnalyticsEvent && Analytics.createAndFireSafe(_this.createAnalyticsEvent, Analytics.createRestFailedEvent, 'addReaction', error.code); // ufo add reaction failure
138
+
139
+ exp.failure({
140
+ metadata: {
141
+ error: error
142
+ }
143
+ });
122
144
  }
123
145
 
124
146
  return Promise.reject(error);
@@ -129,10 +151,23 @@ export var MemoryReactionsStore = /*#__PURE__*/function () {
129
151
  var containerAri = reaction.containerAri,
130
152
  ari = reaction.ari,
131
153
  emojiId = reaction.emojiId;
154
+ var exp = ufoExperiences.remove.getInstance("".concat(ari, "|").concat(emojiId)); // ufo start reaction experience
155
+
156
+ exp.start();
132
157
 
133
158
  _this.optmisticUpdate(containerAri, ari, emojiId)(utils.removeOne);
134
159
 
135
- _this.client.deleteReaction(containerAri, ari, emojiId, _this.metadata);
160
+ _this.client.deleteReaction(containerAri, ari, emojiId, _this.metadata).then(function (_) {
161
+ // ufo add reaction success
162
+ exp.success();
163
+ }).catch(function (error) {
164
+ // ufo add reaction failure
165
+ exp.failure({
166
+ metadata: {
167
+ error: error
168
+ }
169
+ });
170
+ });
136
171
  });
137
172
 
138
173
  _defineProperty(this, "setCreateAnalyticsEvent", function (createAnalyticsEvent) {
@@ -140,24 +175,37 @@ export var MemoryReactionsStore = /*#__PURE__*/function () {
140
175
  });
141
176
 
142
177
  _defineProperty(this, "getReactions", batchByKey(function (containerAri, aris) {
178
+ /**
179
+ * TODO:
180
+ * All reactions are usually fetched in a single call to reactions-service. Need to check why "getReactions" gets called randomly 1-2 times everytime on each fetch request despite using same containerAri.
181
+ */
182
+ var exp = ufoExperiences.render.getInstance(containerAri); // ufo start reaction experience
183
+
184
+ exp.start();
185
+
143
186
  _this.client.getReactions(containerAri, aris.reduce(utils.flattenAris)).then(function (value) {
144
187
  Object.keys(value).map(function (ari) {
145
188
  var reactionsState = _this.getReactionsState(containerAri, ari);
146
189
 
147
- var reactions = reactionsState && reactionsState.status === ReactionStatus.ready ? reactionsState.reactions : undefined;
190
+ var reactions = reactionsState && reactionsState.status === Types.ReactionStatus.ready ? reactionsState.reactions : undefined;
148
191
 
149
192
  _this.setReactions(containerAri, ari, utils.readyState(value[ari].sort(utils.getReactionsSortFunction(reactions))));
150
193
  });
151
194
  }).then(function () {
152
195
  if (_this.createAnalyticsEvent) {
153
- createAndFireSafe(_this.createAnalyticsEvent, createRestSucceededEvent, 'getReactions');
196
+ Analytics.createAndFireSafe(_this.createAnalyticsEvent, Analytics.createRestSucceededEvent, 'getReactions');
154
197
  }
198
+
199
+ exp.success();
155
200
  }).catch(function (error) {
156
- if (_this.createAnalyticsEvent && isRealErrorFromService(error.code)) {
157
- createAndFireSafe(_this.createAnalyticsEvent, createRestFailedEvent, 'getReactions', error.code);
158
- }
201
+ if (isRealErrorFromService(error.code)) {
202
+ if (_this.createAnalyticsEvent) {
203
+ Analytics.createAndFireSafe(_this.createAnalyticsEvent, Analytics.createRestFailedEvent, 'getReactions', error.code);
204
+ }
159
205
 
160
- return Promise.reject(error);
206
+ exp.failure();
207
+ return Promise.reject(error);
208
+ }
161
209
  });
162
210
  }));
163
211
 
@@ -220,7 +268,7 @@ export var MemoryReactionsStore = /*#__PURE__*/function () {
220
268
  return function (updater) {
221
269
  var reactionsState = _this2.getReactionsState(containerAri, ari);
222
270
 
223
- if (reactionsState.status === ReactionStatus.ready) {
271
+ if (reactionsState.status === Types.ReactionStatus.ready) {
224
272
  var updated = updater(reactionsState);
225
273
 
226
274
  if (updated) {
File without changes
File without changes
File without changes
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "@atlaskit/reactions",
3
- "version": "21.1.0"
3
+ "version": "21.2.2"
4
4
  }
@@ -1,6 +1,7 @@
1
1
  import { AnalyticsEventPayload, CreateUIAnalyticsEvent } from '@atlaskit/analytics-next';
2
2
  import { EventType } from '@atlaskit/analytics-gas-types';
3
3
  import { ReactionSummary, ReactionSource } from '../types';
4
+ export * as UFO from './ufo';
4
5
  export declare type PreviousState = 'new' | 'existingNotReacted' | 'existingReacted';
5
6
  export declare const createAndFireEventInElementsChannel: (payload: Record<string, any>) => (createAnalyticsEvent: CreateUIAnalyticsEvent) => import("@atlaskit/analytics-next").UIAnalyticsEvent;
6
7
  export declare const createAndFireSafe: <U extends any[], T extends (...args: U) => AnalyticsEventPayload>(createAnalyticsEvent: CreateUIAnalyticsEvent | void, creator: T, ...args: U) => void;
@@ -0,0 +1,33 @@
1
+ import { ConcurrentExperience, UFOExperience } from '@atlaskit/ufo';
2
+ /**
3
+ * Types of experiences
4
+ */
5
+ export declare enum ExperienceName {
6
+ REACTIONS_RENDERED = "reactions-rendered",
7
+ PICKER_OPENED = "reactions-picker-opened",
8
+ REACTION_ADDED = "reaction-added",
9
+ REACTION_REMOVED = "reaction-removed"
10
+ }
11
+ /**
12
+ * UFO types of components been instrumented
13
+ */
14
+ export declare enum ComponentName {
15
+ PICKER_RENDERED = "reactions-picker",
16
+ REACTIONS = "reactions-list"
17
+ }
18
+ /**
19
+ * Experience when the emoji picker is opened
20
+ */
21
+ export declare const PickerRender: UFOExperience;
22
+ /**
23
+ * Experience when the list of reactions gets rendered
24
+ */
25
+ export declare const ReactionsRendered: ConcurrentExperience;
26
+ /**
27
+ * Experience when a reaction emoji gets added
28
+ */
29
+ export declare const ReactionsAdd: ConcurrentExperience;
30
+ /**
31
+ * Experience when a reaction emoji gets removed/decrement
32
+ */
33
+ export declare const ReactionsRemove: ConcurrentExperience;
@@ -1,5 +1,6 @@
1
- import { EmojiProvider } from '@atlaskit/emoji/resource';
1
+ /** @jsx jsx */
2
2
  import { PureComponent } from 'react';
3
+ import { EmojiProvider } from '@atlaskit/emoji/resource';
3
4
  import { ReactionSource } from '../types';
4
5
  export interface Props {
5
6
  emojiProvider: Promise<EmojiProvider>;
@@ -4,17 +4,19 @@ import React from 'react';
4
4
  import { OnEmoji, OnReaction } from '../types';
5
5
  import { ReactionStatus } from '../types/ReactionStatus';
6
6
  import { ReactionSummary } from '../types/ReactionSummary';
7
- export interface Props {
7
+ export interface StateMapperProps {
8
8
  reactions: ReactionSummary[];
9
9
  status: ReactionStatus;
10
+ flash?: {
11
+ [emojiId: string]: boolean;
12
+ };
13
+ }
14
+ export interface Props extends StateMapperProps {
10
15
  loadReaction: () => void;
11
16
  onSelection: OnEmoji;
12
17
  onReactionClick: OnEmoji;
13
18
  onReactionHover?: OnReaction;
14
19
  allowAllEmojis?: boolean;
15
- flash?: {
16
- [emojiId: string]: boolean;
17
- };
18
20
  boundariesElement?: string;
19
21
  errorMessage?: string;
20
22
  emojiProvider: Promise<EmojiProvider>;
@@ -41,7 +43,7 @@ export declare class ReactionsWithoutAnalytics extends React.PureComponent<Props
41
43
  private renderReaction;
42
44
  render(): JSX.Element;
43
45
  }
44
- export declare const Reactions: React.ForwardRefExoticComponent<Pick<Pick<Props & WithAnalyticsEventsProps, "reactions" | "emojiProvider" | "flash" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "status" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage">, "emojiProvider" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "status" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage"> & Partial<Pick<Pick<Props & WithAnalyticsEventsProps, "reactions" | "emojiProvider" | "flash" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "status" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage">, "reactions" | "flash">> & Partial<Pick<{
46
+ export declare const Reactions: React.ForwardRefExoticComponent<Pick<Pick<Props & WithAnalyticsEventsProps, "reactions" | "emojiProvider" | "flash" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage" | "status">, "emojiProvider" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage" | "status"> & Partial<Pick<Pick<Props & WithAnalyticsEventsProps, "reactions" | "emojiProvider" | "flash" | "onSelection" | "boundariesElement" | "allowAllEmojis" | "loadReaction" | "onReactionClick" | "onReactionHover" | "errorMessage" | "status">, "reactions" | "flash">> & Partial<Pick<{
45
47
  flash: {};
46
48
  reactions: never[];
47
49
  }, never>> & React.RefAttributes<any>>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { UFOExperience } from '@atlaskit/ufo';
3
+ export declare class UfoErrorBoundary extends React.Component<{
4
+ experiences: UFOExperience[];
5
+ }> {
6
+ componentDidCatch(): void;
7
+ render(): React.ReactNode;
8
+ }
@@ -1,3 +1,5 @@
1
1
  export { Reaction } from './Reaction';
2
2
  export { ReactionPicker } from './ReactionPicker';
3
3
  export { Reactions } from './Reactions';
4
+ export type { StateMapperProps } from './Reactions';
5
+ export { UfoErrorBoundary } from './UfoErrorBoundary';
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { Props as ReactionsViewProps } from './ConnectedReactionsView';
3
+ export declare type Props = ReactionsViewProps & {
4
+ miniMode?: boolean;
5
+ className?: string;
6
+ };
7
+ /**
8
+ * UFO Instance for picker
9
+ */
10
+ export declare const ConnectedReactionPicker: React.FC<Props>;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
3
+ import { EmojiProvider } from '@atlaskit/emoji/resource';
4
+ import { ReactionStoreProp } from '../store/ReactionConsumer';
5
+ export declare type Props = {
6
+ /**
7
+ * Wrapper id for reactions list
8
+ */
9
+ containerAri: string;
10
+ /**
11
+ * Individual id for a reaction
12
+ */
13
+ ari: string;
14
+ allowAllEmojis?: boolean;
15
+ boundariesElement?: string;
16
+ emojiProvider: Promise<EmojiProvider>;
17
+ store: ReactionStoreProp;
18
+ };
19
+ export declare const ConnectedReactionsView: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<Props & WithAnalyticsEventsProps>, "children" | "emojiProvider" | "boundariesElement" | "allowAllEmojis" | "containerAri" | "ari" | "store"> & React.RefAttributes<any>>;
@@ -1,2 +1,2 @@
1
- export { default as ConnectedReactionPicker } from './ReactionsPickerContainer';
2
- export { default as ConnectedReactionsView } from './ReactionsContainer';
1
+ export { ConnectedReactionPicker } from './ConnectedReactionPicker';
2
+ export { ConnectedReactionsView } from './ConnectedReactionsView';
@@ -1,6 +1,7 @@
1
+ export { UFO } from './analytics';
1
2
  export { ReactionServiceClient } from './client';
2
3
  export type { ReactionClient, ReactionRequest } from './client';
3
4
  export { Reaction, ReactionPicker, Reactions } from './components';
4
5
  export { ConnectedReactionPicker, ConnectedReactionsView } from './containers';
5
- export { MemoryReactionsStore, ReactionConsumer } from './reaction-store';
6
- export type { ReactionsStore } from './reaction-store';
6
+ export { MemoryReactionsStore, ReactionConsumer } from './store';
7
+ export type { ReactionsStore } from './store';