@atlaskit/smart-hooks 0.1.7 → 0.1.8
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 +6 -0
- package/dist/cjs/i18n/cs.js +0 -1
- package/dist/cjs/i18n/da.js +0 -1
- package/dist/cjs/i18n/de.js +0 -1
- package/dist/cjs/i18n/en_ZZ.js +0 -1
- package/dist/cjs/i18n/es.js +0 -1
- package/dist/cjs/i18n/et.js +0 -1
- package/dist/cjs/i18n/fi.js +0 -1
- package/dist/cjs/i18n/fr.js +0 -1
- package/dist/cjs/i18n/hu.js +0 -1
- package/dist/cjs/i18n/index.js +0 -31
- package/dist/cjs/i18n/it.js +0 -1
- package/dist/cjs/i18n/ja.js +0 -1
- package/dist/cjs/i18n/ko.js +0 -1
- package/dist/cjs/i18n/nb.js +0 -1
- package/dist/cjs/i18n/nl.js +0 -1
- package/dist/cjs/i18n/pl.js +0 -1
- package/dist/cjs/i18n/pt_BR.js +0 -1
- package/dist/cjs/i18n/pt_PT.js +0 -1
- package/dist/cjs/i18n/ru.js +0 -1
- package/dist/cjs/i18n/sk.js +0 -1
- package/dist/cjs/i18n/sv.js +0 -1
- package/dist/cjs/i18n/th.js +0 -1
- package/dist/cjs/i18n/tr.js +0 -1
- package/dist/cjs/i18n/uk.js +0 -1
- package/dist/cjs/i18n/vi.js +0 -1
- package/dist/cjs/i18n/zh.js +0 -1
- package/dist/cjs/i18n/zh_TW.js +0 -1
- package/dist/cjs/index.js +0 -3
- package/dist/cjs/messages.js +0 -2
- package/dist/cjs/services/use-function-usage-tracking/index.js +8 -13
- package/dist/cjs/services/use-user-recommendations/analytics.js +9 -25
- package/dist/cjs/services/use-user-recommendations/index.js +42 -88
- package/dist/cjs/services/use-user-recommendations/ufoExperiences.js +0 -2
- package/dist/cjs/utils/transform-recommendations-to-options/index.js +0 -16
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/services/use-function-usage-tracking/index.js +6 -6
- package/dist/es2019/services/use-user-recommendations/analytics.js +0 -2
- package/dist/es2019/services/use-user-recommendations/index.js +16 -18
- package/dist/es2019/utils/transform-recommendations-to-options/index.js +0 -10
- package/dist/es2019/version.json +1 -1
- package/dist/esm/services/use-function-usage-tracking/index.js +8 -9
- package/dist/esm/services/use-user-recommendations/analytics.js +9 -14
- package/dist/esm/services/use-user-recommendations/index.js +42 -68
- package/dist/esm/utils/transform-recommendations-to-options/index.js +0 -12
- package/dist/esm/version.json +1 -1
- package/package.json +8 -6
|
@@ -1,42 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.instrumentFailureOption = exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
-
|
|
12
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
13
|
-
|
|
14
10
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
-
|
|
16
11
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
-
|
|
18
12
|
var _react = require("react");
|
|
19
|
-
|
|
20
13
|
var _debounce = _interopRequireDefault(require("lodash/debounce"));
|
|
21
|
-
|
|
22
14
|
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
|
|
23
|
-
|
|
24
15
|
var _uuid = require("uuid");
|
|
25
|
-
|
|
26
16
|
var _analyticsNext = require("@atlaskit/analytics-next");
|
|
27
|
-
|
|
28
17
|
var _smartCommon = require("@atlaskit/smart-common");
|
|
29
|
-
|
|
30
18
|
var _useFunctionUsageTracking = _interopRequireDefault(require("../use-function-usage-tracking"));
|
|
31
|
-
|
|
32
19
|
var _analytics = require("./analytics");
|
|
33
|
-
|
|
34
20
|
var _ufoExperiences = require("./ufoExperiences");
|
|
35
|
-
|
|
36
21
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
37
|
-
|
|
38
22
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
39
|
-
|
|
40
23
|
var MAX_NUMBER_RESULTS = 25;
|
|
41
24
|
var DEFAULT_DEBOUNCE_TIME_MS = 150;
|
|
42
25
|
var defaultProps = {
|
|
@@ -52,54 +35,46 @@ var instrumentFailureOption = [{
|
|
|
52
35
|
avatarUrl: ''
|
|
53
36
|
}];
|
|
54
37
|
exports.instrumentFailureOption = instrumentFailureOption;
|
|
55
|
-
|
|
56
38
|
var useUserRecommendations = function useUserRecommendations(props) {
|
|
57
39
|
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
40
|
+
baseUrl = _defaultProps$props.baseUrl,
|
|
41
|
+
childObjectId = _defaultProps$props.childObjectId,
|
|
42
|
+
containerId = _defaultProps$props.containerId,
|
|
43
|
+
debounceTimeMs = _defaultProps$props.debounceTimeMs,
|
|
44
|
+
fieldId = _defaultProps$props.fieldId,
|
|
45
|
+
includeUsers = _defaultProps$props.includeUsers,
|
|
46
|
+
includeGroups = _defaultProps$props.includeGroups,
|
|
47
|
+
includeTeams = _defaultProps$props.includeTeams,
|
|
48
|
+
maxNumberOfResults = _defaultProps$props.maxNumberOfResults,
|
|
49
|
+
objectId = _defaultProps$props.objectId,
|
|
50
|
+
preload = _defaultProps$props.preload,
|
|
51
|
+
principalId = _defaultProps$props.principalId,
|
|
52
|
+
productAttributes = _defaultProps$props.productAttributes,
|
|
53
|
+
productKey = _defaultProps$props.productKey,
|
|
54
|
+
cpusSearchQuery = _defaultProps$props.cpusSearchQuery,
|
|
55
|
+
tenantId = _defaultProps$props.tenantId;
|
|
75
56
|
var _useState = (0, _react.useState)([]),
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
57
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
58
|
+
recommendations = _useState2[0],
|
|
59
|
+
setRecommendations = _useState2[1];
|
|
80
60
|
var _useState3 = (0, _react.useState)(false),
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
61
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
62
|
+
isLoading = _useState4[0],
|
|
63
|
+
setIsLoading = _useState4[1];
|
|
85
64
|
var _useState5 = (0, _react.useState)(),
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
65
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
66
|
+
error = _useState6[0],
|
|
67
|
+
setError = _useState6[1];
|
|
90
68
|
var _useState7 = (0, _react.useState)(function () {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
69
|
+
return (0, _uuid.v4)();
|
|
70
|
+
}),
|
|
71
|
+
_useState8 = (0, _slicedToArray2.default)(_useState7, 1),
|
|
72
|
+
renderId = _useState8[0];
|
|
96
73
|
var sessionId = (0, _react.useRef)('');
|
|
97
74
|
var currentQuery = (0, _react.useRef)('');
|
|
98
75
|
var lastAbortController = (0, _react.useRef)();
|
|
99
|
-
|
|
100
76
|
var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
|
|
101
|
-
|
|
102
|
-
|
|
77
|
+
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
103
78
|
var getAnalyticsAttributes = (0, _react.useCallback)(function () {
|
|
104
79
|
return _objectSpread({}, (0, _analytics.createDefaultAttributes)({
|
|
105
80
|
fieldId: fieldId,
|
|
@@ -117,25 +92,20 @@ var useUserRecommendations = function useUserRecommendations(props) {
|
|
|
117
92
|
var fetchRecommendations = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
118
93
|
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(query) {
|
|
119
94
|
var _lastAbortController$, currentController, recommendedUsersResult;
|
|
120
|
-
|
|
121
95
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
122
96
|
while (1) {
|
|
123
97
|
switch (_context.prev = _context.next) {
|
|
124
98
|
case 0:
|
|
125
|
-
setIsLoading(true);
|
|
126
|
-
|
|
99
|
+
setIsLoading(true);
|
|
100
|
+
// restart session
|
|
127
101
|
sessionId.current = (0, _uuid.v4)();
|
|
128
|
-
|
|
129
102
|
_ufoExperiences.UsersFetchedUfoExperience.getInstance(fieldId).start();
|
|
130
|
-
|
|
131
103
|
_context.prev = 3;
|
|
132
|
-
|
|
133
104
|
if (lastAbortController.current) {
|
|
134
105
|
(_lastAbortController$ = lastAbortController.current) === null || _lastAbortController$ === void 0 ? void 0 : _lastAbortController$.abort();
|
|
135
|
-
}
|
|
106
|
+
}
|
|
107
|
+
// in case there are still IE users, check AbortController before init,
|
|
136
108
|
// IE has no timeout applied on fetch since AbortController isn't available
|
|
137
|
-
|
|
138
|
-
|
|
139
109
|
currentController = typeof AbortController !== 'undefined' ? new AbortController() : null;
|
|
140
110
|
lastAbortController.current = currentController;
|
|
141
111
|
_context.next = 9;
|
|
@@ -159,48 +129,37 @@ var useUserRecommendations = function useUserRecommendations(props) {
|
|
|
159
129
|
searchQuery: cpusSearchQuery,
|
|
160
130
|
query: query
|
|
161
131
|
}, currentController === null || currentController === void 0 ? void 0 : currentController.signal);
|
|
162
|
-
|
|
163
132
|
case 9:
|
|
164
133
|
recommendedUsersResult = _context.sent;
|
|
165
134
|
currentQuery.current = query !== null && query !== void 0 ? query : '';
|
|
166
|
-
|
|
167
135
|
_ufoExperiences.UsersFetchedUfoExperience.getInstance(fieldId).success({
|
|
168
136
|
metadata: _objectSpread(_objectSpread({}, getAnalyticsAttributes()), {}, {
|
|
169
137
|
loadedUsersSize: recommendedUsersResult.length
|
|
170
138
|
})
|
|
171
139
|
});
|
|
172
|
-
|
|
173
140
|
setRecommendations(recommendedUsersResult);
|
|
174
141
|
_context.next = 24;
|
|
175
142
|
break;
|
|
176
|
-
|
|
177
143
|
case 15:
|
|
178
144
|
_context.prev = 15;
|
|
179
145
|
_context.t0 = _context["catch"](3);
|
|
180
|
-
|
|
181
146
|
if (!(_context.t0 instanceof Error && _context.t0.name === 'AbortError')) {
|
|
182
147
|
_context.next = 22;
|
|
183
148
|
break;
|
|
184
149
|
}
|
|
185
|
-
|
|
186
150
|
// Request aborted client-side
|
|
187
|
-
_ufoExperiences.UsersFetchedUfoExperience.getInstance(fieldId).abort();
|
|
188
|
-
|
|
189
|
-
|
|
151
|
+
_ufoExperiences.UsersFetchedUfoExperience.getInstance(fieldId).abort();
|
|
152
|
+
// return early to prevent disabling isLoading
|
|
190
153
|
return _context.abrupt("return");
|
|
191
|
-
|
|
192
154
|
case 22:
|
|
193
155
|
_ufoExperiences.UsersFetchedUfoExperience.getInstance(fieldId).failure({
|
|
194
156
|
metadata: getAnalyticsAttributes()
|
|
195
157
|
});
|
|
196
|
-
|
|
197
158
|
setError(_context.t0);
|
|
198
|
-
|
|
199
159
|
case 24:
|
|
200
|
-
setIsLoading(false);
|
|
201
|
-
|
|
160
|
+
setIsLoading(false);
|
|
161
|
+
// clear abort controller
|
|
202
162
|
lastAbortController.current = undefined;
|
|
203
|
-
|
|
204
163
|
case 26:
|
|
205
164
|
case "end":
|
|
206
165
|
return _context.stop();
|
|
@@ -208,7 +167,6 @@ var useUserRecommendations = function useUserRecommendations(props) {
|
|
|
208
167
|
}
|
|
209
168
|
}, _callee, null, [[3, 15]]);
|
|
210
169
|
}));
|
|
211
|
-
|
|
212
170
|
return function (_x) {
|
|
213
171
|
return _ref.apply(this, arguments);
|
|
214
172
|
};
|
|
@@ -231,15 +189,12 @@ var useUserRecommendations = function useUserRecommendations(props) {
|
|
|
231
189
|
position: (0, _analytics.findUserPosition)(recommendations, userId)
|
|
232
190
|
}));
|
|
233
191
|
}, [createAnalyticsEvent, getAnalyticsAttributes, recommendations]);
|
|
234
|
-
|
|
235
192
|
var _useFunctionUsageTrac = (0, _useFunctionUsageTracking.default)(onInputChange),
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
193
|
+
isOnInputChangeUsed = _useFunctionUsageTrac.isUsed,
|
|
194
|
+
usageTrackedOnInputChange = _useFunctionUsageTrac.trackingFunction;
|
|
239
195
|
var _useFunctionUsageTrac2 = (0, _useFunctionUsageTracking.default)(onUserSelect),
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
196
|
+
isOnUserSelectUsed = _useFunctionUsageTrac2.isUsed,
|
|
197
|
+
usageTrackedOnUserSelect = _useFunctionUsageTrac2.trackingFunction;
|
|
243
198
|
return {
|
|
244
199
|
recommendations: isOnInputChangeUsed && isOnUserSelectUsed ? recommendations : instrumentFailureOption,
|
|
245
200
|
triggerSearchFactory: usageTrackedOnInputChange,
|
|
@@ -248,6 +203,5 @@ var useUserRecommendations = function useUserRecommendations(props) {
|
|
|
248
203
|
error: error
|
|
249
204
|
};
|
|
250
205
|
};
|
|
251
|
-
|
|
252
206
|
var _default = useUserRecommendations;
|
|
253
207
|
exports.default = _default;
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.UsersFetchedUfoExperience = void 0;
|
|
7
|
-
|
|
8
7
|
var _ufo = require("@atlaskit/ufo");
|
|
9
|
-
|
|
10
8
|
var COMPONENT_NAME = 'smart-hooks.use-user-recommendations';
|
|
11
9
|
var UsersFetchedUfoExperience = new _ufo.ConcurrentExperience('users-fetched', {
|
|
12
10
|
platform: {
|
|
@@ -4,20 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _smartCommon = require("@atlaskit/smart-common");
|
|
9
|
-
|
|
10
8
|
var _userPicker = require("@atlaskit/user-picker");
|
|
11
|
-
|
|
12
9
|
var _messages = require("../../messages");
|
|
13
|
-
|
|
14
10
|
var getLozenzeProperties = function getLozenzeProperties(entity, intl) {
|
|
15
11
|
var _entity$attributes, _entity$attributes2;
|
|
16
|
-
|
|
17
12
|
if ((_entity$attributes = entity.attributes) !== null && _entity$attributes !== void 0 && _entity$attributes.workspaceMember) {
|
|
18
13
|
return intl.formatMessage(_messages.messages.memberLozengeText);
|
|
19
14
|
}
|
|
20
|
-
|
|
21
15
|
if ((_entity$attributes2 = entity.attributes) !== null && _entity$attributes2 !== void 0 && _entity$attributes2.isConfluenceExternalCollaborator) {
|
|
22
16
|
var lozengeTooltipMessage = entity.entityType === _smartCommon.EntityType.GROUP ? _messages.messages.guestGroupLozengeTooltip : _messages.messages.guestUserLozengeTooltip;
|
|
23
17
|
return {
|
|
@@ -26,13 +20,10 @@ var getLozenzeProperties = function getLozenzeProperties(entity, intl) {
|
|
|
26
20
|
appearance: 'new'
|
|
27
21
|
};
|
|
28
22
|
}
|
|
29
|
-
|
|
30
23
|
return undefined;
|
|
31
24
|
};
|
|
32
|
-
|
|
33
25
|
var transformRecommendation = function transformRecommendation(item, intl) {
|
|
34
26
|
var type = item.entityType;
|
|
35
|
-
|
|
36
27
|
if (type === _smartCommon.EntityType.USER) {
|
|
37
28
|
var user = item;
|
|
38
29
|
var lozenge = getLozenzeProperties(user, intl);
|
|
@@ -45,7 +36,6 @@ var transformRecommendation = function transformRecommendation(item, intl) {
|
|
|
45
36
|
lozenge: lozenge
|
|
46
37
|
};
|
|
47
38
|
}
|
|
48
|
-
|
|
49
39
|
if (type === _smartCommon.EntityType.TEAM) {
|
|
50
40
|
var team = item;
|
|
51
41
|
return {
|
|
@@ -58,12 +48,9 @@ var transformRecommendation = function transformRecommendation(item, intl) {
|
|
|
58
48
|
avatarUrl: team.largeAvatarImageUrl || team.smallAvatarImageUrl
|
|
59
49
|
};
|
|
60
50
|
}
|
|
61
|
-
|
|
62
51
|
if (type === _smartCommon.EntityType.GROUP) {
|
|
63
52
|
var group = item;
|
|
64
|
-
|
|
65
53
|
var _lozenge = getLozenzeProperties(group, intl);
|
|
66
|
-
|
|
67
54
|
return {
|
|
68
55
|
id: group.id,
|
|
69
56
|
type: _userPicker.GroupType,
|
|
@@ -71,10 +58,8 @@ var transformRecommendation = function transformRecommendation(item, intl) {
|
|
|
71
58
|
lozenge: _lozenge
|
|
72
59
|
};
|
|
73
60
|
}
|
|
74
|
-
|
|
75
61
|
return;
|
|
76
62
|
};
|
|
77
|
-
|
|
78
63
|
var _default = function _default(recommendations, intl) {
|
|
79
64
|
return (recommendations || []).map(function (item) {
|
|
80
65
|
return transformRecommendation(item, intl);
|
|
@@ -84,5 +69,4 @@ var _default = function _default(recommendations, intl) {
|
|
|
84
69
|
return option;
|
|
85
70
|
});
|
|
86
71
|
};
|
|
87
|
-
|
|
88
72
|
exports.default = _default;
|
package/dist/cjs/version.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { useMemo, useState } from 'react';
|
|
2
2
|
import memoizeOne from 'memoize-one';
|
|
3
|
-
|
|
4
3
|
function useFunctionUsageTracking(trackedFunction) {
|
|
5
|
-
const [isUsed, setIsUsed] = useState(false);
|
|
4
|
+
const [isUsed, setIsUsed] = useState(false);
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
// trackingFunction needs to be stable for hook consumers...
|
|
7
|
+
const trackingFunction = useMemo(() =>
|
|
8
|
+
// ...and the function that the factory returns needs to be stable for hook consumers as well
|
|
8
9
|
memoizeOne(() => {
|
|
9
10
|
if (!isUsed) {
|
|
10
11
|
setIsUsed(true);
|
|
11
12
|
}
|
|
12
|
-
|
|
13
13
|
return trackedFunction;
|
|
14
|
-
}),
|
|
14
|
+
}),
|
|
15
|
+
// isUsed deliberately left out to avoid new tracking fn being generated
|
|
15
16
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
17
|
[trackedFunction]);
|
|
17
18
|
return {
|
|
@@ -19,5 +20,4 @@ function useFunctionUsageTracking(trackedFunction) {
|
|
|
19
20
|
trackingFunction
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
|
-
|
|
23
23
|
export default useFunctionUsageTracking;
|
|
@@ -3,7 +3,6 @@ import { FabricChannel } from '@atlaskit/analytics-listeners';
|
|
|
3
3
|
import { createAndFireEvent } from '@atlaskit/analytics-next';
|
|
4
4
|
import { name as packageName, version as packageVersion } from '../../version.json';
|
|
5
5
|
const createAndFireEventInElementsChannel = createAndFireEvent(FabricChannel.elements);
|
|
6
|
-
|
|
7
6
|
const createEvent = (eventType, action, actionSubject, attributes = {}) => ({
|
|
8
7
|
eventType,
|
|
9
8
|
action,
|
|
@@ -15,7 +14,6 @@ const createEvent = (eventType, action, actionSubject, attributes = {}) => ({
|
|
|
15
14
|
...attributes
|
|
16
15
|
}
|
|
17
16
|
});
|
|
18
|
-
|
|
19
17
|
export const findUserPosition = (loadedUsers, userId) => {
|
|
20
18
|
return loadedUsers.findIndex(val => val.id === userId);
|
|
21
19
|
};
|
|
@@ -21,7 +21,6 @@ export const instrumentFailureOption = [{
|
|
|
21
21
|
entityType: EntityType.USER,
|
|
22
22
|
avatarUrl: ''
|
|
23
23
|
}];
|
|
24
|
-
|
|
25
24
|
const useUserRecommendations = props => {
|
|
26
25
|
const {
|
|
27
26
|
baseUrl,
|
|
@@ -40,7 +39,8 @@ const useUserRecommendations = props => {
|
|
|
40
39
|
productKey,
|
|
41
40
|
cpusSearchQuery,
|
|
42
41
|
tenantId
|
|
43
|
-
} = {
|
|
42
|
+
} = {
|
|
43
|
+
...defaultProps,
|
|
44
44
|
...props
|
|
45
45
|
};
|
|
46
46
|
const [recommendations, setRecommendations] = useState([]);
|
|
@@ -53,7 +53,8 @@ const useUserRecommendations = props => {
|
|
|
53
53
|
const {
|
|
54
54
|
createAnalyticsEvent
|
|
55
55
|
} = useAnalyticsEvents();
|
|
56
|
-
const getAnalyticsAttributes = useCallback(() => ({
|
|
56
|
+
const getAnalyticsAttributes = useCallback(() => ({
|
|
57
|
+
...createDefaultAttributes({
|
|
57
58
|
fieldId,
|
|
58
59
|
objectId,
|
|
59
60
|
containerId,
|
|
@@ -67,20 +68,17 @@ const useUserRecommendations = props => {
|
|
|
67
68
|
}, renderId, sessionId.current, currentQuery.current)
|
|
68
69
|
}), [childObjectId, containerId, fieldId, includeTeams, maxNumberOfResults, objectId, preload, principalId, productKey, renderId, tenantId]);
|
|
69
70
|
const fetchRecommendations = useCallback(async query => {
|
|
70
|
-
setIsLoading(true);
|
|
71
|
-
|
|
71
|
+
setIsLoading(true);
|
|
72
|
+
// restart session
|
|
72
73
|
sessionId.current = uuid();
|
|
73
74
|
UsersFetchedUfoExperience.getInstance(fieldId).start();
|
|
74
|
-
|
|
75
75
|
try {
|
|
76
76
|
if (lastAbortController.current) {
|
|
77
77
|
var _lastAbortController$;
|
|
78
|
-
|
|
79
78
|
(_lastAbortController$ = lastAbortController.current) === null || _lastAbortController$ === void 0 ? void 0 : _lastAbortController$.abort();
|
|
80
|
-
}
|
|
79
|
+
}
|
|
80
|
+
// in case there are still IE users, check AbortController before init,
|
|
81
81
|
// IE has no timeout applied on fetch since AbortController isn't available
|
|
82
|
-
|
|
83
|
-
|
|
84
82
|
const currentController = typeof AbortController !== 'undefined' ? new AbortController() : null;
|
|
85
83
|
lastAbortController.current = currentController;
|
|
86
84
|
const recommendedUsersResult = await fetchUserRecommendations({
|
|
@@ -105,7 +103,8 @@ const useUserRecommendations = props => {
|
|
|
105
103
|
}, currentController === null || currentController === void 0 ? void 0 : currentController.signal);
|
|
106
104
|
currentQuery.current = query !== null && query !== void 0 ? query : '';
|
|
107
105
|
UsersFetchedUfoExperience.getInstance(fieldId).success({
|
|
108
|
-
metadata: {
|
|
106
|
+
metadata: {
|
|
107
|
+
...getAnalyticsAttributes(),
|
|
109
108
|
loadedUsersSize: recommendedUsersResult.length
|
|
110
109
|
}
|
|
111
110
|
});
|
|
@@ -113,8 +112,8 @@ const useUserRecommendations = props => {
|
|
|
113
112
|
} catch (error) {
|
|
114
113
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
115
114
|
// Request aborted client-side
|
|
116
|
-
UsersFetchedUfoExperience.getInstance(fieldId).abort();
|
|
117
|
-
|
|
115
|
+
UsersFetchedUfoExperience.getInstance(fieldId).abort();
|
|
116
|
+
// return early to prevent disabling isLoading
|
|
118
117
|
return;
|
|
119
118
|
} else {
|
|
120
119
|
UsersFetchedUfoExperience.getInstance(fieldId).failure({
|
|
@@ -123,9 +122,8 @@ const useUserRecommendations = props => {
|
|
|
123
122
|
setError(error);
|
|
124
123
|
}
|
|
125
124
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
125
|
+
setIsLoading(false);
|
|
126
|
+
// clear abort controller
|
|
129
127
|
lastAbortController.current = undefined;
|
|
130
128
|
}, [baseUrl, childObjectId, containerId, objectId, principalId, productAttributes, productKey, fieldId, tenantId, includeUsers, includeGroups, includeTeams, maxNumberOfResults, cpusSearchQuery, getAnalyticsAttributes]);
|
|
131
129
|
const memoizedDebouncedFetchRecommendations = useMemo(() => memoizeOne(debounce(fetchRecommendations, debounceTimeMs)), [fetchRecommendations, debounceTimeMs]);
|
|
@@ -138,7 +136,8 @@ const useUserRecommendations = props => {
|
|
|
138
136
|
memoizedDebouncedFetchRecommendations(query !== null && query !== void 0 ? query : '');
|
|
139
137
|
}, [memoizedDebouncedFetchRecommendations]);
|
|
140
138
|
const onUserSelect = useCallback(userId => {
|
|
141
|
-
fireUserSelectedEvent(createAnalyticsEvent, {
|
|
139
|
+
fireUserSelectedEvent(createAnalyticsEvent, {
|
|
140
|
+
...getAnalyticsAttributes(),
|
|
142
141
|
selectedUser: userId,
|
|
143
142
|
loadedUsersSize: recommendations.length,
|
|
144
143
|
position: findUserPosition(recommendations, userId)
|
|
@@ -160,5 +159,4 @@ const useUserRecommendations = props => {
|
|
|
160
159
|
error
|
|
161
160
|
};
|
|
162
161
|
};
|
|
163
|
-
|
|
164
162
|
export default useUserRecommendations;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { EntityType } from '@atlaskit/smart-common';
|
|
2
2
|
import { GroupType, TeamType, UserType } from '@atlaskit/user-picker';
|
|
3
3
|
import { messages } from '../../messages';
|
|
4
|
-
|
|
5
4
|
const getLozenzeProperties = (entity, intl) => {
|
|
6
5
|
var _entity$attributes, _entity$attributes2;
|
|
7
|
-
|
|
8
6
|
if ((_entity$attributes = entity.attributes) !== null && _entity$attributes !== void 0 && _entity$attributes.workspaceMember) {
|
|
9
7
|
return intl.formatMessage(messages.memberLozengeText);
|
|
10
8
|
}
|
|
11
|
-
|
|
12
9
|
if ((_entity$attributes2 = entity.attributes) !== null && _entity$attributes2 !== void 0 && _entity$attributes2.isConfluenceExternalCollaborator) {
|
|
13
10
|
const lozengeTooltipMessage = entity.entityType === EntityType.GROUP ? messages.guestGroupLozengeTooltip : messages.guestUserLozengeTooltip;
|
|
14
11
|
return {
|
|
@@ -17,13 +14,10 @@ const getLozenzeProperties = (entity, intl) => {
|
|
|
17
14
|
appearance: 'new'
|
|
18
15
|
};
|
|
19
16
|
}
|
|
20
|
-
|
|
21
17
|
return undefined;
|
|
22
18
|
};
|
|
23
|
-
|
|
24
19
|
const transformRecommendation = (item, intl) => {
|
|
25
20
|
const type = item.entityType;
|
|
26
|
-
|
|
27
21
|
if (type === EntityType.USER) {
|
|
28
22
|
const user = item;
|
|
29
23
|
const lozenge = getLozenzeProperties(user, intl);
|
|
@@ -36,7 +30,6 @@ const transformRecommendation = (item, intl) => {
|
|
|
36
30
|
lozenge: lozenge
|
|
37
31
|
};
|
|
38
32
|
}
|
|
39
|
-
|
|
40
33
|
if (type === EntityType.TEAM) {
|
|
41
34
|
const team = item;
|
|
42
35
|
return {
|
|
@@ -49,7 +42,6 @@ const transformRecommendation = (item, intl) => {
|
|
|
49
42
|
avatarUrl: team.largeAvatarImageUrl || team.smallAvatarImageUrl
|
|
50
43
|
};
|
|
51
44
|
}
|
|
52
|
-
|
|
53
45
|
if (type === EntityType.GROUP) {
|
|
54
46
|
const group = item;
|
|
55
47
|
const lozenge = getLozenzeProperties(group, intl);
|
|
@@ -60,8 +52,6 @@ const transformRecommendation = (item, intl) => {
|
|
|
60
52
|
lozenge: lozenge
|
|
61
53
|
};
|
|
62
54
|
}
|
|
63
|
-
|
|
64
55
|
return;
|
|
65
56
|
};
|
|
66
|
-
|
|
67
57
|
export default ((recommendations, intl) => (recommendations || []).map(item => transformRecommendation(item, intl)).filter(option => !!option).map(option => option));
|
package/dist/es2019/version.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import { useMemo, useState } from 'react';
|
|
3
3
|
import memoizeOne from 'memoize-one';
|
|
4
|
-
|
|
5
4
|
function useFunctionUsageTracking(trackedFunction) {
|
|
6
5
|
var _useState = useState(false),
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
7
|
+
isUsed = _useState2[0],
|
|
8
|
+
setIsUsed = _useState2[1];
|
|
11
9
|
|
|
10
|
+
// trackingFunction needs to be stable for hook consumers...
|
|
12
11
|
var trackingFunction = useMemo(function () {
|
|
13
|
-
return (
|
|
12
|
+
return (
|
|
13
|
+
// ...and the function that the factory returns needs to be stable for hook consumers as well
|
|
14
14
|
memoizeOne(function () {
|
|
15
15
|
if (!isUsed) {
|
|
16
16
|
setIsUsed(true);
|
|
17
17
|
}
|
|
18
|
-
|
|
19
18
|
return trackedFunction;
|
|
20
19
|
})
|
|
21
20
|
);
|
|
22
|
-
},
|
|
21
|
+
},
|
|
22
|
+
// isUsed deliberately left out to avoid new tracking fn being generated
|
|
23
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
24
|
[trackedFunction]);
|
|
25
25
|
return {
|
|
@@ -27,5 +27,4 @@ function useFunctionUsageTracking(trackedFunction) {
|
|
|
27
27
|
trackingFunction: trackingFunction
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
|
|
31
30
|
export default useFunctionUsageTracking;
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
|
|
3
2
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
-
|
|
5
3
|
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; }
|
|
6
|
-
|
|
7
4
|
import { TRACK_EVENT_TYPE } from '@atlaskit/analytics-gas-types';
|
|
8
5
|
import { FabricChannel } from '@atlaskit/analytics-listeners';
|
|
9
6
|
import { createAndFireEvent } from '@atlaskit/analytics-next';
|
|
10
7
|
import { name as packageName, version as packageVersion } from '../../version.json';
|
|
11
8
|
var createAndFireEventInElementsChannel = createAndFireEvent(FabricChannel.elements);
|
|
12
|
-
|
|
13
9
|
var createEvent = function createEvent(eventType, action, actionSubject) {
|
|
14
10
|
var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
15
11
|
return {
|
|
@@ -23,7 +19,6 @@ var createEvent = function createEvent(eventType, action, actionSubject) {
|
|
|
23
19
|
}, attributes)
|
|
24
20
|
};
|
|
25
21
|
};
|
|
26
|
-
|
|
27
22
|
export var findUserPosition = function findUserPosition(loadedUsers, userId) {
|
|
28
23
|
return loadedUsers.findIndex(function (val) {
|
|
29
24
|
return val.id === userId;
|
|
@@ -31,15 +26,15 @@ export var findUserPosition = function findUserPosition(loadedUsers, userId) {
|
|
|
31
26
|
};
|
|
32
27
|
export var createDefaultAttributes = function createDefaultAttributes(props, renderId, sessionId, query) {
|
|
33
28
|
var fieldId = props.fieldId,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
objectId = props.objectId,
|
|
30
|
+
containerId = props.containerId,
|
|
31
|
+
childObjectId = props.childObjectId,
|
|
32
|
+
preload = props.preload,
|
|
33
|
+
includeTeams = props.includeTeams,
|
|
34
|
+
productKey = props.productKey,
|
|
35
|
+
principalId = props.principalId,
|
|
36
|
+
tenantId = props.tenantId,
|
|
37
|
+
maxNumberOfResults = props.maxNumberOfResults;
|
|
43
38
|
return {
|
|
44
39
|
context: fieldId,
|
|
45
40
|
childObjectId: childObjectId,
|