@atlaskit/emoji 69.0.13 → 69.1.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,13 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 69.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#144384](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/144384)
8
+ [`3a650f8970f01`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3a650f8970f01) -
9
+ Adding emoji load callbacks to Renderer EmojiConfig
10
+
3
11
  ## 69.0.13
4
12
 
5
13
  ### Patch Changes
@@ -7,11 +7,10 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = exports.ResourcedEmojiComponent = void 0;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
- var _interactionMetrics = require("@atlaskit/react-ufo/interaction-metrics");
15
14
  var _constants = require("../../util/constants");
16
15
  var _typeHelpers = require("../../util/type-helpers");
17
16
  var _types = require("../../types");
@@ -43,7 +42,9 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
43
42
  optimistic = _props$optimistic === void 0 ? false : _props$optimistic,
44
43
  _props$optimisticImag = props.optimisticImageURL,
45
44
  optimisticImageURL = _props$optimisticImag === void 0 ? undefined : _props$optimisticImag,
46
- editorEmoji = props.editorEmoji;
45
+ editorEmoji = props.editorEmoji,
46
+ onEmojiLoadSuccess = props.onEmojiLoadSuccess,
47
+ onEmojiLoadFail = props.onEmojiLoadFail;
47
48
  var shortName = emojiId.shortName,
48
49
  id = emojiId.id,
49
50
  fallback = emojiId.fallback;
@@ -63,22 +64,10 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
63
64
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
64
65
  resolvedEmojiProvider = _useState8[0],
65
66
  setResolvedEmojiProvider = _useState8[1];
66
- var getActiveInterationMetadata = function getActiveInterationMetadata() {
67
- var activeInteraction = (0, _interactionMetrics.getActiveInteraction)();
68
- var activeInteractionMetadata = {};
69
- if (activeInteraction) {
70
- activeInteractionMetadata = _objectSpread(_objectSpread({}, activeInteraction.metaData['productInteractionName'] ? {
71
- productInteractionName: activeInteraction.metaData['productInteractionName']
72
- } : {}), activeInteraction.metaData['productInteractionType'] ? {
73
- productInteractionType: activeInteraction.metaData['productInteractionType']
74
- } : {});
75
- }
76
- return activeInteractionMetadata;
77
- };
78
67
  var fetchOrGetEmoji = (0, _react.useCallback)( /*#__PURE__*/function () {
79
68
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_emojiProvider, emojiId) {
80
69
  var optimisticFetch,
81
- activeInteractionMetadata,
70
+ reason,
82
71
  foundEmoji,
83
72
  _args = arguments;
84
73
  return _regenerator.default.wrap(function _callee$(_context) {
@@ -86,13 +75,14 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
86
75
  case 0:
87
76
  optimisticFetch = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
88
77
  if (!_emojiProvider.fetchByEmojiId) {
89
- activeInteractionMetadata = getActiveInterationMetadata();
90
78
  setEmoji(undefined);
79
+ reason = 'missing fetchByEmojiId interface';
80
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
91
81
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
92
- metadata: _objectSpread({
93
- reason: 'missing fetchByEmojiId interface',
82
+ metadata: {
83
+ reason: reason,
94
84
  source: 'ResourcedEmojiComponent'
95
- }, activeInteractionMetadata)
85
+ }
96
86
  });
97
87
  }
98
88
  foundEmoji = _emojiProvider.fetchByEmojiId(emojiId, optimisticFetch);
@@ -102,11 +92,12 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
102
92
  foundEmoji.then(function (emoji) {
103
93
  setEmoji(emoji);
104
94
  if (!emoji) {
95
+ var _reason = 'failed to find';
96
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, _reason);
105
97
  // emoji is undefined
106
- var _activeInteractionMetadata = getActiveInterationMetadata();
107
98
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
108
- metadata: _objectSpread({
109
- reason: 'failed to find',
99
+ metadata: {
100
+ reason: _reason,
110
101
  source: 'ResourcedEmojiComponent',
111
102
  data: {
112
103
  emoji: {
@@ -114,15 +105,16 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
114
105
  shortName: emojiId.shortName
115
106
  }
116
107
  }
117
- }, _activeInteractionMetadata)
108
+ }
118
109
  });
119
110
  }
120
111
  }).catch(function () {
121
112
  setEmoji(undefined);
122
- var activeInteractionMetadata = getActiveInterationMetadata();
113
+ var reason = 'failed to load';
114
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
123
115
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
124
- metadata: _objectSpread({
125
- reason: 'failed to load',
116
+ metadata: {
117
+ reason: reason,
126
118
  source: 'ResourcedEmojiComponent',
127
119
  data: {
128
120
  emoji: {
@@ -130,7 +122,7 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
130
122
  shortName: emojiId.shortName
131
123
  }
132
124
  }
133
- }, activeInteractionMetadata)
125
+ }
134
126
  });
135
127
  }).finally(function () {
136
128
  setLoaded(true);
@@ -150,7 +142,7 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
150
142
  return function (_x, _x2) {
151
143
  return _ref.apply(this, arguments);
152
144
  };
153
- }(), []);
145
+ }(), [onEmojiLoadFail]);
154
146
  (0, _react.useEffect)(function () {
155
147
  if (!emojiId) {
156
148
  return;
@@ -214,16 +206,20 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
214
206
  return emoji;
215
207
  }, [emoji, optimisticImageURL, fallback, fitToHeight, id, shortName]);
216
208
  var handleOnLoadError = (0, _react.useCallback)(function (emojiId) {
217
- var activeInteractionMetadata = getActiveInterationMetadata();
218
209
  setImageLoadError(true);
210
+ var reason = 'load error';
211
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
219
212
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
220
- metadata: _objectSpread({
221
- reason: 'load error',
213
+ metadata: {
214
+ reason: reason,
222
215
  source: 'ResourcedEmojiComponent',
223
216
  emojiId: emojiId.id
224
- }, activeInteractionMetadata)
217
+ }
225
218
  });
226
- }, []);
219
+ }, [onEmojiLoadFail]);
220
+ var handleOnLoadSuccess = (0, _react.useCallback)(function (emojiId) {
221
+ onEmojiLoadSuccess && onEmojiLoadSuccess(emojiId.id);
222
+ }, [onEmojiLoadSuccess]);
227
223
  return /*#__PURE__*/_react.default.createElement(_EmojiCommonProvider.EmojiCommonProvider, {
228
224
  emojiProvider: resolvedEmojiProvider
229
225
  }, /*#__PURE__*/_react.default.createElement("span", {
@@ -238,6 +234,7 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
238
234
  }), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.FALLBACK && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customFallback || fallback || shortName), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.EMOJI && optimisticEmojiDescription && /*#__PURE__*/_react.default.createElement(_Emoji.default, {
239
235
  emoji: optimisticEmojiDescription,
240
236
  onLoadError: handleOnLoadError,
237
+ onLoadSuccess: handleOnLoadSuccess,
241
238
  showTooltip: showTooltip,
242
239
  fitToHeight: fitToHeight,
243
240
  autoWidth: !!emoji ? false : true,
@@ -20,7 +20,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
20
20
  actionSubjectId: actionSubjectId,
21
21
  attributes: _objectSpread({
22
22
  packageName: "@atlaskit/emoji",
23
- packageVersion: "69.0.13"
23
+ packageVersion: "69.1.0"
24
24
  }, attributes)
25
25
  };
26
26
  };
@@ -1,5 +1,4 @@
1
1
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
- import { getActiveInteraction } from '@atlaskit/react-ufo/interaction-metrics';
3
2
  import { defaultEmojiHeight } from '../../util/constants';
4
3
  import { isImageRepresentation, isMediaRepresentation, isPromise } from '../../util/type-helpers';
5
4
  import { UfoEmojiTimings } from '../../types';
@@ -23,7 +22,9 @@ export const ResourcedEmojiComponent = props => {
23
22
  fitToHeight = defaultEmojiHeight,
24
23
  optimistic = false,
25
24
  optimisticImageURL = undefined,
26
- editorEmoji
25
+ editorEmoji,
26
+ onEmojiLoadSuccess,
27
+ onEmojiLoadFail
27
28
  } = props;
28
29
  const {
29
30
  shortName,
@@ -34,30 +35,15 @@ export const ResourcedEmojiComponent = props => {
34
35
  const [loaded, setLoaded] = useState(false);
35
36
  const [imageLoadError, setImageLoadError] = useState(false);
36
37
  const [resolvedEmojiProvider, setResolvedEmojiProvider] = useState();
37
- const getActiveInterationMetadata = () => {
38
- const activeInteraction = getActiveInteraction();
39
- let activeInteractionMetadata = {};
40
- if (activeInteraction) {
41
- activeInteractionMetadata = {
42
- ...(activeInteraction.metaData['productInteractionName'] ? {
43
- productInteractionName: activeInteraction.metaData['productInteractionName']
44
- } : {}),
45
- ...(activeInteraction.metaData['productInteractionType'] ? {
46
- productInteractionType: activeInteraction.metaData['productInteractionType']
47
- } : {})
48
- };
49
- }
50
- return activeInteractionMetadata;
51
- };
52
38
  const fetchOrGetEmoji = useCallback(async (_emojiProvider, emojiId, optimisticFetch = false) => {
53
39
  if (!_emojiProvider.fetchByEmojiId) {
54
- const activeInteractionMetadata = getActiveInterationMetadata();
55
40
  setEmoji(undefined);
41
+ const reason = 'missing fetchByEmojiId interface';
42
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
56
43
  sampledUfoRenderedEmoji(emojiId).failure({
57
44
  metadata: {
58
- reason: 'missing fetchByEmojiId interface',
59
- source: 'ResourcedEmojiComponent',
60
- ...activeInteractionMetadata
45
+ reason,
46
+ source: 'ResourcedEmojiComponent'
61
47
  }
62
48
  });
63
49
  }
@@ -68,36 +54,36 @@ export const ResourcedEmojiComponent = props => {
68
54
  foundEmoji.then(emoji => {
69
55
  setEmoji(emoji);
70
56
  if (!emoji) {
57
+ const reason = 'failed to find';
58
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
71
59
  // emoji is undefined
72
- const activeInteractionMetadata = getActiveInterationMetadata();
73
60
  sampledUfoRenderedEmoji(emojiId).failure({
74
61
  metadata: {
75
- reason: 'failed to find',
62
+ reason,
76
63
  source: 'ResourcedEmojiComponent',
77
64
  data: {
78
65
  emoji: {
79
66
  id: emojiId.id,
80
67
  shortName: emojiId.shortName
81
68
  }
82
- },
83
- ...activeInteractionMetadata
69
+ }
84
70
  }
85
71
  });
86
72
  }
87
73
  }).catch(() => {
88
74
  setEmoji(undefined);
89
- const activeInteractionMetadata = getActiveInterationMetadata();
75
+ const reason = 'failed to load';
76
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
90
77
  sampledUfoRenderedEmoji(emojiId).failure({
91
78
  metadata: {
92
- reason: 'failed to load',
79
+ reason,
93
80
  source: 'ResourcedEmojiComponent',
94
81
  data: {
95
82
  emoji: {
96
83
  id: emojiId.id,
97
84
  shortName: emojiId.shortName
98
85
  }
99
- },
100
- ...activeInteractionMetadata
86
+ }
101
87
  }
102
88
  });
103
89
  }).finally(() => {
@@ -109,7 +95,7 @@ export const ResourcedEmojiComponent = props => {
109
95
  setLoaded(true);
110
96
  sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_END);
111
97
  }
112
- }, []);
98
+ }, [onEmojiLoadFail]);
113
99
  useEffect(() => {
114
100
  if (!emojiId) {
115
101
  return;
@@ -175,17 +161,20 @@ export const ResourcedEmojiComponent = props => {
175
161
  return emoji;
176
162
  }, [emoji, optimisticImageURL, fallback, fitToHeight, id, shortName]);
177
163
  const handleOnLoadError = useCallback(emojiId => {
178
- const activeInteractionMetadata = getActiveInterationMetadata();
179
164
  setImageLoadError(true);
165
+ const reason = 'load error';
166
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
180
167
  sampledUfoRenderedEmoji(emojiId).failure({
181
168
  metadata: {
182
- reason: 'load error',
169
+ reason,
183
170
  source: 'ResourcedEmojiComponent',
184
- emojiId: emojiId.id,
185
- ...activeInteractionMetadata
171
+ emojiId: emojiId.id
186
172
  }
187
173
  });
188
- }, []);
174
+ }, [onEmojiLoadFail]);
175
+ const handleOnLoadSuccess = useCallback(emojiId => {
176
+ onEmojiLoadSuccess && onEmojiLoadSuccess(emojiId.id);
177
+ }, [onEmojiLoadSuccess]);
189
178
  return /*#__PURE__*/React.createElement(EmojiCommonProvider, {
190
179
  emojiProvider: resolvedEmojiProvider
191
180
  }, /*#__PURE__*/React.createElement("span", {
@@ -200,6 +189,7 @@ export const ResourcedEmojiComponent = props => {
200
189
  }), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.FALLBACK && /*#__PURE__*/React.createElement(React.Fragment, null, customFallback || fallback || shortName), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.EMOJI && optimisticEmojiDescription && /*#__PURE__*/React.createElement(Emoji, {
201
190
  emoji: optimisticEmojiDescription,
202
191
  onLoadError: handleOnLoadError,
192
+ onLoadSuccess: handleOnLoadSuccess,
203
193
  showTooltip: showTooltip,
204
194
  fitToHeight: fitToHeight,
205
195
  autoWidth: !!emoji ? false : true,
@@ -8,7 +8,7 @@ const createEvent = (eventType, action, actionSubject, actionSubjectId, attribut
8
8
  actionSubjectId,
9
9
  attributes: {
10
10
  packageName: "@atlaskit/emoji",
11
- packageVersion: "69.0.13",
11
+ packageVersion: "69.1.0",
12
12
  ...attributes
13
13
  }
14
14
  });
@@ -1,11 +1,10 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _regeneratorRuntime from "@babel/runtime/regenerator";
5
4
  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; }
6
5
  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) { _defineProperty(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; }
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
7
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
8
- import { getActiveInteraction } from '@atlaskit/react-ufo/interaction-metrics';
9
8
  import { defaultEmojiHeight } from '../../util/constants';
10
9
  import { isImageRepresentation, isMediaRepresentation, isPromise } from '../../util/type-helpers';
11
10
  import { UfoEmojiTimings } from '../../types';
@@ -33,7 +32,9 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
33
32
  optimistic = _props$optimistic === void 0 ? false : _props$optimistic,
34
33
  _props$optimisticImag = props.optimisticImageURL,
35
34
  optimisticImageURL = _props$optimisticImag === void 0 ? undefined : _props$optimisticImag,
36
- editorEmoji = props.editorEmoji;
35
+ editorEmoji = props.editorEmoji,
36
+ onEmojiLoadSuccess = props.onEmojiLoadSuccess,
37
+ onEmojiLoadFail = props.onEmojiLoadFail;
37
38
  var shortName = emojiId.shortName,
38
39
  id = emojiId.id,
39
40
  fallback = emojiId.fallback;
@@ -53,22 +54,10 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
53
54
  _useState8 = _slicedToArray(_useState7, 2),
54
55
  resolvedEmojiProvider = _useState8[0],
55
56
  setResolvedEmojiProvider = _useState8[1];
56
- var getActiveInterationMetadata = function getActiveInterationMetadata() {
57
- var activeInteraction = getActiveInteraction();
58
- var activeInteractionMetadata = {};
59
- if (activeInteraction) {
60
- activeInteractionMetadata = _objectSpread(_objectSpread({}, activeInteraction.metaData['productInteractionName'] ? {
61
- productInteractionName: activeInteraction.metaData['productInteractionName']
62
- } : {}), activeInteraction.metaData['productInteractionType'] ? {
63
- productInteractionType: activeInteraction.metaData['productInteractionType']
64
- } : {});
65
- }
66
- return activeInteractionMetadata;
67
- };
68
57
  var fetchOrGetEmoji = useCallback( /*#__PURE__*/function () {
69
58
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_emojiProvider, emojiId) {
70
59
  var optimisticFetch,
71
- activeInteractionMetadata,
60
+ reason,
72
61
  foundEmoji,
73
62
  _args = arguments;
74
63
  return _regeneratorRuntime.wrap(function _callee$(_context) {
@@ -76,13 +65,14 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
76
65
  case 0:
77
66
  optimisticFetch = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
78
67
  if (!_emojiProvider.fetchByEmojiId) {
79
- activeInteractionMetadata = getActiveInterationMetadata();
80
68
  setEmoji(undefined);
69
+ reason = 'missing fetchByEmojiId interface';
70
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
81
71
  sampledUfoRenderedEmoji(emojiId).failure({
82
- metadata: _objectSpread({
83
- reason: 'missing fetchByEmojiId interface',
72
+ metadata: {
73
+ reason: reason,
84
74
  source: 'ResourcedEmojiComponent'
85
- }, activeInteractionMetadata)
75
+ }
86
76
  });
87
77
  }
88
78
  foundEmoji = _emojiProvider.fetchByEmojiId(emojiId, optimisticFetch);
@@ -92,11 +82,12 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
92
82
  foundEmoji.then(function (emoji) {
93
83
  setEmoji(emoji);
94
84
  if (!emoji) {
85
+ var _reason = 'failed to find';
86
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, _reason);
95
87
  // emoji is undefined
96
- var _activeInteractionMetadata = getActiveInterationMetadata();
97
88
  sampledUfoRenderedEmoji(emojiId).failure({
98
- metadata: _objectSpread({
99
- reason: 'failed to find',
89
+ metadata: {
90
+ reason: _reason,
100
91
  source: 'ResourcedEmojiComponent',
101
92
  data: {
102
93
  emoji: {
@@ -104,15 +95,16 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
104
95
  shortName: emojiId.shortName
105
96
  }
106
97
  }
107
- }, _activeInteractionMetadata)
98
+ }
108
99
  });
109
100
  }
110
101
  }).catch(function () {
111
102
  setEmoji(undefined);
112
- var activeInteractionMetadata = getActiveInterationMetadata();
103
+ var reason = 'failed to load';
104
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
113
105
  sampledUfoRenderedEmoji(emojiId).failure({
114
- metadata: _objectSpread({
115
- reason: 'failed to load',
106
+ metadata: {
107
+ reason: reason,
116
108
  source: 'ResourcedEmojiComponent',
117
109
  data: {
118
110
  emoji: {
@@ -120,7 +112,7 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
120
112
  shortName: emojiId.shortName
121
113
  }
122
114
  }
123
- }, activeInteractionMetadata)
115
+ }
124
116
  });
125
117
  }).finally(function () {
126
118
  setLoaded(true);
@@ -140,7 +132,7 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
140
132
  return function (_x, _x2) {
141
133
  return _ref.apply(this, arguments);
142
134
  };
143
- }(), []);
135
+ }(), [onEmojiLoadFail]);
144
136
  useEffect(function () {
145
137
  if (!emojiId) {
146
138
  return;
@@ -204,16 +196,20 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
204
196
  return emoji;
205
197
  }, [emoji, optimisticImageURL, fallback, fitToHeight, id, shortName]);
206
198
  var handleOnLoadError = useCallback(function (emojiId) {
207
- var activeInteractionMetadata = getActiveInterationMetadata();
208
199
  setImageLoadError(true);
200
+ var reason = 'load error';
201
+ onEmojiLoadFail && onEmojiLoadFail(emojiId.id, reason);
209
202
  sampledUfoRenderedEmoji(emojiId).failure({
210
- metadata: _objectSpread({
211
- reason: 'load error',
203
+ metadata: {
204
+ reason: reason,
212
205
  source: 'ResourcedEmojiComponent',
213
206
  emojiId: emojiId.id
214
- }, activeInteractionMetadata)
207
+ }
215
208
  });
216
- }, []);
209
+ }, [onEmojiLoadFail]);
210
+ var handleOnLoadSuccess = useCallback(function (emojiId) {
211
+ onEmojiLoadSuccess && onEmojiLoadSuccess(emojiId.id);
212
+ }, [onEmojiLoadSuccess]);
217
213
  return /*#__PURE__*/React.createElement(EmojiCommonProvider, {
218
214
  emojiProvider: resolvedEmojiProvider
219
215
  }, /*#__PURE__*/React.createElement("span", {
@@ -228,6 +224,7 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(props) {
228
224
  }), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.FALLBACK && /*#__PURE__*/React.createElement(React.Fragment, null, customFallback || fallback || shortName), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.EMOJI && optimisticEmojiDescription && /*#__PURE__*/React.createElement(Emoji, {
229
225
  emoji: optimisticEmojiDescription,
230
226
  onLoadError: handleOnLoadError,
227
+ onLoadSuccess: handleOnLoadSuccess,
231
228
  showTooltip: showTooltip,
232
229
  fitToHeight: fitToHeight,
233
230
  autoWidth: !!emoji ? false : true,
@@ -13,7 +13,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
13
13
  actionSubjectId: actionSubjectId,
14
14
  attributes: _objectSpread({
15
15
  packageName: "@atlaskit/emoji",
16
- packageVersion: "69.0.13"
16
+ packageVersion: "69.1.0"
17
17
  }, attributes)
18
18
  };
19
19
  };
@@ -3,7 +3,7 @@ import type { CategoryId } from '../components/picker/categories';
3
3
  import { type EmojiDescription, type EmojiId, type EmojiProvider, type EmojiResponse, type EmojiSearchResult, type EmojiUpload, type OptionalEmojiDescription, type OptionalEmojiDescriptionWithVariations, type OptionalUser, type SearchOptions, type ToneSelection, type UploadingEmojiProvider, type User } from '../types';
4
4
  import EmojiRepository from './EmojiRepository';
5
5
  import SiteEmojiResource from './media/SiteEmojiResource';
6
- import type { OptimisticImageApiLoaderConfig, Options, SingleEmojiApiLoaderConfig } from './EmojiUtils';
6
+ import type { OptimisticImageApiLoaderConfig, Options, SingleEmojiApiLoaderConfig, EmojiLoadSuccessCallback, EmojiLoadFailCallback } from './EmojiUtils';
7
7
  interface GetEmojiProviderOptions {
8
8
  /**
9
9
  * Whether fetch emoji provider at start
@@ -52,6 +52,14 @@ export interface EmojiResourceConfig {
52
52
  * the user is being presented with a placeholder
53
53
  */
54
54
  optimisticImageApi?: OptimisticImageApiLoaderConfig;
55
+ /**
56
+ * A callback triggered on emoji load success
57
+ */
58
+ onEmojiLoadSuccess?: EmojiLoadSuccessCallback;
59
+ /**
60
+ * A callback triggered on emoji load failure
61
+ */
62
+ onEmojiLoadFail?: EmojiLoadFailCallback;
55
63
  }
56
64
  export interface OnEmojiProviderChange extends OnProviderChange<EmojiSearchResult, any, void> {
57
65
  }
@@ -12,6 +12,8 @@ export interface SingleEmojiApiLoaderConfig extends Omit<ServiceConfig, 'url'> {
12
12
  export interface OptimisticImageApiLoaderConfig extends Omit<ServiceConfig, 'url'> {
13
13
  getUrl: (emojiId: EmojiId) => string;
14
14
  }
15
+ export type EmojiLoadSuccessCallback = (emojiId?: string) => void;
16
+ export type EmojiLoadFailCallback = (emojiId?: string, reason?: string) => void;
15
17
  export declare const emojiRequest: (provider: EmojiLoaderConfig, options?: RequestServiceOptions) => Promise<EmojiServiceResponse>;
16
18
  export declare const getPixelRatio: () => number;
17
19
  export declare const getAltRepresentation: (reps: AltRepresentations) => EmojiServiceRepresentation;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { EmojiProvider } from '../../api/EmojiResource';
3
+ import type { EmojiLoadSuccessCallback, EmojiLoadFailCallback } from '../../api/EmojiUtils';
3
4
  import { type EmojiId } from '../../types';
4
5
  export interface BaseResourcedEmojiProps {
5
6
  /**
@@ -49,6 +50,14 @@ export interface Props extends BaseResourcedEmojiProps {
49
50
  * EmojiResource instance that handles fetching of emoji data.
50
51
  */
51
52
  emojiProvider: Promise<EmojiProvider>;
53
+ /**
54
+ * A callback triggered on emoji load success
55
+ */
56
+ onEmojiLoadSuccess?: EmojiLoadSuccessCallback;
57
+ /**
58
+ * A callback triggered on emoji load failure
59
+ */
60
+ onEmojiLoadFail?: EmojiLoadFailCallback;
52
61
  }
53
62
  export declare const ResourcedEmojiComponent: (props: Props) => React.JSX.Element;
54
63
  export default ResourcedEmojiComponent;
@@ -1,5 +1,6 @@
1
1
  export { AbstractResource } from '@atlaskit/util-service-support';
2
2
  export { default as EmojiResource } from './api/EmojiResource';
3
3
  export type { EmojiProvider, UploadingEmojiProvider, EmojiResourceConfig, OnEmojiProviderChange, } from './api/EmojiResource';
4
+ export type { EmojiLoadSuccessCallback, EmojiLoadFailCallback } from './api/EmojiUtils';
4
5
  export { default as EmojiRepository } from './api/EmojiRepository';
5
6
  export { default as EmojiLoader } from './api/EmojiLoader';
@@ -3,7 +3,7 @@ import type { CategoryId } from '../components/picker/categories';
3
3
  import { type EmojiDescription, type EmojiId, type EmojiProvider, type EmojiResponse, type EmojiSearchResult, type EmojiUpload, type OptionalEmojiDescription, type OptionalEmojiDescriptionWithVariations, type OptionalUser, type SearchOptions, type ToneSelection, type UploadingEmojiProvider, type User } from '../types';
4
4
  import EmojiRepository from './EmojiRepository';
5
5
  import SiteEmojiResource from './media/SiteEmojiResource';
6
- import type { OptimisticImageApiLoaderConfig, Options, SingleEmojiApiLoaderConfig } from './EmojiUtils';
6
+ import type { OptimisticImageApiLoaderConfig, Options, SingleEmojiApiLoaderConfig, EmojiLoadSuccessCallback, EmojiLoadFailCallback } from './EmojiUtils';
7
7
  interface GetEmojiProviderOptions {
8
8
  /**
9
9
  * Whether fetch emoji provider at start
@@ -52,6 +52,14 @@ export interface EmojiResourceConfig {
52
52
  * the user is being presented with a placeholder
53
53
  */
54
54
  optimisticImageApi?: OptimisticImageApiLoaderConfig;
55
+ /**
56
+ * A callback triggered on emoji load success
57
+ */
58
+ onEmojiLoadSuccess?: EmojiLoadSuccessCallback;
59
+ /**
60
+ * A callback triggered on emoji load failure
61
+ */
62
+ onEmojiLoadFail?: EmojiLoadFailCallback;
55
63
  }
56
64
  export interface OnEmojiProviderChange extends OnProviderChange<EmojiSearchResult, any, void> {
57
65
  }
@@ -12,6 +12,8 @@ export interface SingleEmojiApiLoaderConfig extends Omit<ServiceConfig, 'url'> {
12
12
  export interface OptimisticImageApiLoaderConfig extends Omit<ServiceConfig, 'url'> {
13
13
  getUrl: (emojiId: EmojiId) => string;
14
14
  }
15
+ export type EmojiLoadSuccessCallback = (emojiId?: string) => void;
16
+ export type EmojiLoadFailCallback = (emojiId?: string, reason?: string) => void;
15
17
  export declare const emojiRequest: (provider: EmojiLoaderConfig, options?: RequestServiceOptions) => Promise<EmojiServiceResponse>;
16
18
  export declare const getPixelRatio: () => number;
17
19
  export declare const getAltRepresentation: (reps: AltRepresentations) => EmojiServiceRepresentation;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { EmojiProvider } from '../../api/EmojiResource';
3
+ import type { EmojiLoadSuccessCallback, EmojiLoadFailCallback } from '../../api/EmojiUtils';
3
4
  import { type EmojiId } from '../../types';
4
5
  export interface BaseResourcedEmojiProps {
5
6
  /**
@@ -49,6 +50,14 @@ export interface Props extends BaseResourcedEmojiProps {
49
50
  * EmojiResource instance that handles fetching of emoji data.
50
51
  */
51
52
  emojiProvider: Promise<EmojiProvider>;
53
+ /**
54
+ * A callback triggered on emoji load success
55
+ */
56
+ onEmojiLoadSuccess?: EmojiLoadSuccessCallback;
57
+ /**
58
+ * A callback triggered on emoji load failure
59
+ */
60
+ onEmojiLoadFail?: EmojiLoadFailCallback;
52
61
  }
53
62
  export declare const ResourcedEmojiComponent: (props: Props) => React.JSX.Element;
54
63
  export default ResourcedEmojiComponent;
@@ -1,5 +1,6 @@
1
1
  export { AbstractResource } from '@atlaskit/util-service-support';
2
2
  export { default as EmojiResource } from './api/EmojiResource';
3
3
  export type { EmojiProvider, UploadingEmojiProvider, EmojiResourceConfig, OnEmojiProviderChange, } from './api/EmojiResource';
4
+ export type { EmojiLoadSuccessCallback, EmojiLoadFailCallback } from './api/EmojiUtils';
4
5
  export { default as EmojiRepository } from './api/EmojiRepository';
5
6
  export { default as EmojiLoader } from './api/EmojiLoader';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "69.0.13",
3
+ "version": "69.1.0",
4
4
  "description": "Fabric emoji React components",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"