@atlaskit/smart-user-picker 8.1.0 → 8.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlassian/smart-user-picker
2
2
 
3
+ ## 8.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`272ab9229ad98`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/272ab9229ad98) -
8
+ add additional userResolvers prop to support adding additional contacts to existing user
9
+ recommendations
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 8.1.0
4
16
 
5
17
  ### Minor Changes
@@ -25,6 +25,9 @@
25
25
  {
26
26
  "path": "../../../analytics/analytics-next/afm-cc/tsconfig.json"
27
27
  },
28
+ {
29
+ "path": "../../../platform/feature-flags/afm-cc/tsconfig.json"
30
+ },
28
31
  {
29
32
  "path": "../../../data/ufo-external/afm-cc/tsconfig.json"
30
33
  },
@@ -0,0 +1,35 @@
1
+ {
2
+ "extends": "../../../../tsconfig.entry-points.passionfruit.json",
3
+ "compilerOptions": {
4
+ "target": "es5",
5
+ "outDir": "../../../../../passionfruit/tsDist/@atlaskit__smart-user-picker/app",
6
+ "rootDir": "../",
7
+ "composite": true
8
+ },
9
+ "include": [
10
+ "../src/**/*.ts",
11
+ "../src/**/*.tsx"
12
+ ],
13
+ "exclude": [
14
+ "../src/**/__tests__/*",
15
+ "../src/**/*.test.*",
16
+ "../src/**/test.*",
17
+ "../src/**/examples.*",
18
+ "../src/**/examples/*",
19
+ "../src/**/examples/**/*",
20
+ "../src/**/*.stories.*",
21
+ "../src/**/stories/*",
22
+ "../src/**/stories/**/*"
23
+ ],
24
+ "references": [
25
+ {
26
+ "path": "../../../analytics/analytics-next/afm-passionfruit/tsconfig.json"
27
+ },
28
+ {
29
+ "path": "../../../data/ufo-external/afm-passionfruit/tsconfig.json"
30
+ },
31
+ {
32
+ "path": "../../../elements/user-picker/afm-passionfruit/tsconfig.json"
33
+ }
34
+ ]
35
+ }
@@ -13,7 +13,13 @@
13
13
  "exclude": [
14
14
  "../src/**/__tests__/*",
15
15
  "../src/**/*.test.*",
16
- "../src/**/test.*"
16
+ "../src/**/test.*",
17
+ "../src/**/examples.*",
18
+ "../src/**/examples/*",
19
+ "../src/**/examples/**/*",
20
+ "../src/**/*.stories.*",
21
+ "../src/**/stories/*",
22
+ "../src/**/stories/**/*"
17
23
  ],
18
24
  "references": [
19
25
  {
@@ -4,14 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.successfulRequestUsersEvent = exports.startSession = exports.requestUsersEvent = exports.preparedUsersLoadedEvent = exports.mountedWithPrefetchEvent = exports.filterUsersEvent = exports.failedRequestUsersEvent = exports.createAndFireEventInElementsChannel = void 0;
7
+ exports.successfulRequestUsersEvent = exports.startSession = exports.requestUsersEvent = exports.preparedUsersLoadedEvent = exports.mountedWithPrefetchEvent = exports.filterUsersEvent = exports.failedUserResolversEvent = exports.failedRequestUsersEvent = exports.createAndFireEventInElementsChannel = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _analyticsNext = require("@atlaskit/analytics-next");
10
10
  var _uuid = require("uuid");
11
11
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
12
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
13
  var packageName = "@atlaskit/smart-user-picker";
14
- var packageVersion = "8.0.1";
14
+ var packageVersion = "8.1.0";
15
15
  var startSession = exports.startSession = function startSession() {
16
16
  return {
17
17
  id: (0, _uuid.v4)(),
@@ -97,4 +97,8 @@ var successfulRequestUsersEvent = exports.successfulRequestUsersEvent = function
97
97
  var failedRequestUsersEvent = exports.failedRequestUsersEvent = function failedRequestUsersEvent(props, state) {
98
98
  var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
99
99
  return createSmartUserPickerEvent('failed', 'usersRequest', _objectSpread(_objectSpread({}, createDefaultSmartPickerAttributes(props, state)), attributes));
100
+ };
101
+ var failedUserResolversEvent = exports.failedUserResolversEvent = function failedUserResolversEvent(props, state) {
102
+ var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
103
+ return createSmartUserPickerEvent('failed', 'userResolversRequest', _objectSpread(_objectSpread({}, createDefaultSmartPickerAttributes(props, state)), attributes));
100
104
  };
@@ -8,6 +8,8 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.SmartUserPickerWithoutAnalytics = exports.SmartUserPicker = void 0;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
+ var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
11
13
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
14
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
15
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
@@ -23,6 +25,7 @@ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
23
25
  var _reactIntlNext = require("react-intl-next");
24
26
  var _ufo = require("@atlaskit/ufo");
25
27
  var _userPicker = _interopRequireWildcard(require("@atlaskit/user-picker"));
28
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
26
29
  var _analytics = require("../analytics");
27
30
  var _MessagesIntlProvider = _interopRequireDefault(require("./MessagesIntlProvider"));
28
31
  var _service = require("../service");
@@ -107,12 +110,12 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
107
110
  });
108
111
  (0, _defineProperty2.default)(_this, "memoizedFilterOptions", (0, _memoizeOne.default)(_this.filterOptions));
109
112
  (0, _defineProperty2.default)(_this, "getUsers", (0, _debounce.default)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
110
- var _this$state, query, sessionId, closed, _this$props, baseUrl, childObjectId, containerId, fieldId, includeGroups, includeTeams, includeUsers, includeNonLicensedUsers, intl, maxOptions, objectId, onEmpty, onError, overrideByline, orgId, principalId, productAttributes, productKey, searchQueryFilter, siteId, transformOptions, maxNumberOfResults, startTime, recommendationsRequest, _yield$onEmpty, _query, recommendedUsers, _iterator, _step, option, elapsedTimeMilli, transformedOptions, displayedUsers, is5xxEvent, onErrorProducedError, defaultUsers, _elapsedTimeMilli;
113
+ var _this$state, query, sessionId, closed, _this$props, baseUrl, childObjectId, containerId, fieldId, includeGroups, includeTeams, includeUsers, includeNonLicensedUsers, intl, maxOptions, objectId, onEmpty, onError, overrideByline, orgId, principalId, productAttributes, productKey, searchQueryFilter, siteId, transformOptions, userResolvers, maxNumberOfResults, startTime, recommendationsRequest, _yield$onEmpty, _query, recommendedUsers, userRecommendationsPromise, userResolversPromises, _yield$Promise$all, _yield$Promise$all2, mainRecommendations, userResolverResults, _iterator, _step, option, elapsedTimeMilli, transformedOptions, displayedUsers, is5xxEvent, onErrorProducedError, defaultUsers, _elapsedTimeMilli;
111
114
  return _regenerator.default.wrap(function _callee$(_context) {
112
115
  while (1) switch (_context.prev = _context.next) {
113
116
  case 0:
114
117
  _this$state = _this.state, query = _this$state.query, sessionId = _this$state.sessionId, closed = _this$state.closed;
115
- _this$props = _this.props, baseUrl = _this$props.baseUrl, childObjectId = _this$props.childObjectId, containerId = _this$props.containerId, fieldId = _this$props.fieldId, includeGroups = _this$props.includeGroups, includeTeams = _this$props.includeTeams, includeUsers = _this$props.includeUsers, includeNonLicensedUsers = _this$props.includeNonLicensedUsers, intl = _this$props.intl, maxOptions = _this$props.maxOptions, objectId = _this$props.objectId, onEmpty = _this$props.onEmpty, onError = _this$props.onError, overrideByline = _this$props.overrideByline, orgId = _this$props.orgId, principalId = _this$props.principalId, productAttributes = _this$props.productAttributes, productKey = _this$props.productKey, searchQueryFilter = _this$props.searchQueryFilter, siteId = _this$props.siteId, transformOptions = _this$props.transformOptions;
118
+ _this$props = _this.props, baseUrl = _this$props.baseUrl, childObjectId = _this$props.childObjectId, containerId = _this$props.containerId, fieldId = _this$props.fieldId, includeGroups = _this$props.includeGroups, includeTeams = _this$props.includeTeams, includeUsers = _this$props.includeUsers, includeNonLicensedUsers = _this$props.includeNonLicensedUsers, intl = _this$props.intl, maxOptions = _this$props.maxOptions, objectId = _this$props.objectId, onEmpty = _this$props.onEmpty, onError = _this$props.onError, overrideByline = _this$props.overrideByline, orgId = _this$props.orgId, principalId = _this$props.principalId, productAttributes = _this$props.productAttributes, productKey = _this$props.productKey, searchQueryFilter = _this$props.searchQueryFilter, siteId = _this$props.siteId, transformOptions = _this$props.transformOptions, userResolvers = _this$props.userResolvers;
116
119
  maxNumberOfResults = maxOptions || 100;
117
120
  startTime = window.performance.now();
118
121
  recommendationsRequest = {
@@ -140,10 +143,36 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
140
143
  _context.prev = 5;
141
144
  _query = _this.state.query;
142
145
  _this.fireEvent(_analytics.requestUsersEvent);
143
- _context.next = 10;
146
+ if (!(0, _platformFeatureFlags.fg)('twcg-444-invite-usd-improvements-m2-gate')) {
147
+ _context.next = 20;
148
+ break;
149
+ }
150
+ userRecommendationsPromise = (0, _service.getUserRecommendations)(recommendationsRequest, intl);
151
+ userResolversPromises = (userResolvers !== null && userResolvers !== void 0 ? userResolvers : []).map(function (resolver) {
152
+ return resolver(_query).catch(function (error) {
153
+ _this.fireEvent(_analytics.failedUserResolversEvent, {
154
+ resolverName: resolver.name,
155
+ error: error
156
+ });
157
+ return [];
158
+ });
159
+ });
160
+ _context.next = 13;
161
+ return Promise.all([userRecommendationsPromise].concat((0, _toConsumableArray2.default)(userResolversPromises)));
162
+ case 13:
163
+ _yield$Promise$all = _context.sent;
164
+ _yield$Promise$all2 = (0, _toArray2.default)(_yield$Promise$all);
165
+ mainRecommendations = _yield$Promise$all2[0];
166
+ userResolverResults = _yield$Promise$all2.slice(1);
167
+ recommendedUsers = [mainRecommendations].concat((0, _toConsumableArray2.default)(userResolverResults)).flat();
168
+ _context.next = 23;
169
+ break;
170
+ case 20:
171
+ _context.next = 22;
144
172
  return (0, _service.getUserRecommendations)(recommendationsRequest, intl);
145
- case 10:
173
+ case 22:
146
174
  recommendedUsers = _context.sent;
175
+ case 23:
147
176
  if (overrideByline) {
148
177
  _iterator = _createForOfIteratorHelper(recommendedUsers);
149
178
  try {
@@ -161,71 +190,75 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
161
190
  }
162
191
  elapsedTimeMilli = window.performance.now() - startTime;
163
192
  if (!transformOptions) {
164
- _context.next = 19;
193
+ _context.next = 31;
165
194
  break;
166
195
  }
167
- _context.next = 16;
196
+ _context.next = 28;
168
197
  return transformOptions(recommendedUsers, _query);
169
- case 16:
198
+ case 28:
170
199
  _context.t0 = _context.sent;
171
- _context.next = 20;
200
+ _context.next = 32;
172
201
  break;
173
- case 19:
202
+ case 31:
174
203
  _context.t0 = recommendedUsers;
175
- case 20:
204
+ case 32:
176
205
  transformedOptions = _context.t0;
177
206
  if (!(transformedOptions.length === 0 && onEmpty)) {
178
- _context.next = 36;
207
+ _context.next = 48;
179
208
  break;
180
209
  }
181
- _context.next = 24;
210
+ _context.next = 36;
182
211
  return onEmpty(_query);
183
- case 24:
212
+ case 36:
184
213
  _context.t3 = _yield$onEmpty = _context.sent;
185
214
  _context.t2 = _context.t3 !== null;
186
215
  if (!_context.t2) {
187
- _context.next = 28;
216
+ _context.next = 40;
188
217
  break;
189
218
  }
190
219
  _context.t2 = _yield$onEmpty !== void 0;
191
- case 28:
220
+ case 40:
192
221
  if (!_context.t2) {
193
- _context.next = 32;
222
+ _context.next = 44;
194
223
  break;
195
224
  }
196
225
  _context.t4 = _yield$onEmpty;
197
- _context.next = 33;
226
+ _context.next = 45;
198
227
  break;
199
- case 32:
228
+ case 44:
200
229
  _context.t4 = [];
201
- case 33:
230
+ case 45:
202
231
  _context.t1 = _context.t4;
203
- _context.next = 37;
232
+ _context.next = 49;
204
233
  break;
205
- case 36:
234
+ case 48:
206
235
  _context.t1 = transformedOptions;
207
- case 37:
236
+ case 49:
208
237
  displayedUsers = _context.t1;
209
238
  _this.setState(function (state) {
210
239
  var applicable = state.query === _query;
211
240
  var users = applicable ? displayedUsers : state.users;
212
241
  var loading = !applicable;
213
- _this.fireEvent(_analytics.successfulRequestUsersEvent, {
242
+ _this.fireEvent(_analytics.successfulRequestUsersEvent, _objectSpread({
214
243
  users: getUsersForAnalytics(recommendedUsers),
215
244
  elapsedTimeMilli: elapsedTimeMilli,
216
245
  displayedUsers: getUsersForAnalytics(displayedUsers),
217
246
  productAttributes: productAttributes,
218
247
  applicable: applicable
219
- });
248
+ }, (0, _platformFeatureFlags.fg)('twcg-444-invite-usd-improvements-m2-gate') && {
249
+ userResolvers: Array.isArray(userResolvers) ? userResolvers.map(function (resolver) {
250
+ return resolver.name;
251
+ }) : []
252
+ }));
220
253
  return {
221
254
  users: users,
222
255
  loading: loading
223
256
  };
224
257
  });
225
- _context.next = 70;
258
+ _context.next = 82;
226
259
  break;
227
- case 41:
228
- _context.prev = 41;
260
+ case 53:
261
+ _context.prev = 53;
229
262
  _context.t5 = _context["catch"](5);
230
263
  is5xxEvent = checkIf500Event(_context.t5.statusCode);
231
264
  if (!closed && !onError && is5xxEvent) {
@@ -238,35 +271,35 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
238
271
  });
239
272
  onErrorProducedError = false;
240
273
  defaultUsers = [];
241
- _context.prev = 48;
274
+ _context.prev = 60;
242
275
  if (!onError) {
243
- _context.next = 58;
276
+ _context.next = 70;
244
277
  break;
245
278
  }
246
- _context.next = 52;
279
+ _context.next = 64;
247
280
  return onError(_context.t5, recommendationsRequest);
248
- case 52:
281
+ case 64:
249
282
  _context.t7 = _context.sent;
250
283
  if (_context.t7) {
251
- _context.next = 55;
284
+ _context.next = 67;
252
285
  break;
253
286
  }
254
287
  _context.t7 = [];
255
- case 55:
288
+ case 67:
256
289
  _context.t6 = _context.t7;
257
- _context.next = 59;
290
+ _context.next = 71;
258
291
  break;
259
- case 58:
292
+ case 70:
260
293
  _context.t6 = [];
261
- case 59:
294
+ case 71:
262
295
  defaultUsers = _context.t6;
263
- _context.next = 65;
296
+ _context.next = 77;
264
297
  break;
265
- case 62:
266
- _context.prev = 62;
267
- _context.t8 = _context["catch"](48);
298
+ case 74:
299
+ _context.prev = 74;
300
+ _context.t8 = _context["catch"](60);
268
301
  onErrorProducedError = true;
269
- case 65:
302
+ case 77:
270
303
  if (onErrorProducedError && is5xxEvent) {
271
304
  // Log error from fallback data source `onError` to UFO
272
305
  _this.optionsShownUfoExperienceInstance.failure(ufoEndStateConfig(_this.props.fieldId));
@@ -283,11 +316,11 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
283
316
  elapsedTimeMilli: _elapsedTimeMilli,
284
317
  productAttributes: productAttributes
285
318
  });
286
- case 70:
319
+ case 82:
287
320
  case "end":
288
321
  return _context.stop();
289
322
  }
290
- }, _callee, null, [[5, 41], [48, 62]]);
323
+ }, _callee, null, [[5, 53], [60, 74]]);
291
324
  })), (_this$props$debounceT = _this.props.debounceTime) !== null && _this$props$debounceT !== void 0 ? _this$props$debounceT : 0));
292
325
  (0, _defineProperty2.default)(_this, "onInputChange", function (newQuery, sessionId) {
293
326
  var query = newQuery || '';
@@ -474,6 +507,7 @@ var SmartUserPickerWithoutAnalytics = exports.SmartUserPickerWithoutAnalytics =
474
507
  includeNonLicensedUsers: false,
475
508
  prefetch: false,
476
509
  principalId: 'Context',
477
- debounceTime: DEFAULT_DEBOUNCE_TIME_MS
510
+ debounceTime: DEFAULT_DEBOUNCE_TIME_MS,
511
+ userResolvers: []
478
512
  });
479
513
  var SmartUserPicker = exports.SmartUserPicker = (0, _analyticsNext.withAnalyticsEvents)()((0, _reactIntlNext.injectIntl)(SmartUserPickerWithoutAnalytics));
@@ -1,7 +1,7 @@
1
1
  import { createAndFireEvent } from '@atlaskit/analytics-next';
2
2
  import { v4 as uuid } from 'uuid';
3
3
  const packageName = "@atlaskit/smart-user-picker";
4
- const packageVersion = "8.0.1";
4
+ const packageVersion = "8.1.0";
5
5
  export const startSession = () => ({
6
6
  id: uuid(),
7
7
  start: Date.now(),
@@ -85,4 +85,8 @@ export const successfulRequestUsersEvent = (props, state, attributes = {}) => cr
85
85
  export const failedRequestUsersEvent = (props, state, attributes = {}) => createSmartUserPickerEvent('failed', 'usersRequest', {
86
86
  ...createDefaultSmartPickerAttributes(props, state),
87
87
  ...attributes
88
+ });
89
+ export const failedUserResolversEvent = (props, state, attributes = {}) => createSmartUserPickerEvent('failed', 'userResolversRequest', {
90
+ ...createDefaultSmartPickerAttributes(props, state),
91
+ ...attributes
88
92
  });
@@ -8,7 +8,8 @@ import memoizeOne from 'memoize-one';
8
8
  import { injectIntl } from 'react-intl-next';
9
9
  import { UFOExperienceState } from '@atlaskit/ufo';
10
10
  import UserPicker, { isExternalUser, isTeam, isUser } from '@atlaskit/user-picker';
11
- import { requestUsersEvent, filterUsersEvent, preparedUsersLoadedEvent, successfulRequestUsersEvent, failedRequestUsersEvent, mountedWithPrefetchEvent, createAndFireEventInElementsChannel } from '../analytics';
11
+ import { fg } from '@atlaskit/platform-feature-flags';
12
+ import { requestUsersEvent, filterUsersEvent, preparedUsersLoadedEvent, successfulRequestUsersEvent, failedRequestUsersEvent, mountedWithPrefetchEvent, createAndFireEventInElementsChannel, failedUserResolversEvent } from '../analytics';
12
13
  import MessagesIntlProvider from './MessagesIntlProvider';
13
14
  import { getUserRecommendations, hydrateDefaultValues } from '../service';
14
15
  import { smartUserPickerOptionsShownUfoExperience } from '../ufoExperiences';
@@ -98,7 +99,8 @@ export class SmartUserPickerWithoutAnalytics extends React.Component {
98
99
  productKey,
99
100
  searchQueryFilter,
100
101
  siteId,
101
- transformOptions
102
+ transformOptions,
103
+ userResolvers
102
104
  } = this.props;
103
105
  const maxNumberOfResults = maxOptions || 100;
104
106
  const startTime = window.performance.now();
@@ -130,7 +132,21 @@ export class SmartUserPickerWithoutAnalytics extends React.Component {
130
132
  query
131
133
  } = this.state;
132
134
  this.fireEvent(requestUsersEvent);
133
- const recommendedUsers = await getUserRecommendations(recommendationsRequest, intl);
135
+ let recommendedUsers;
136
+ if (fg('twcg-444-invite-usd-improvements-m2-gate')) {
137
+ const userRecommendationsPromise = getUserRecommendations(recommendationsRequest, intl);
138
+ const userResolversPromises = (userResolvers !== null && userResolvers !== void 0 ? userResolvers : []).map(resolver => resolver(query).catch(error => {
139
+ this.fireEvent(failedUserResolversEvent, {
140
+ resolverName: resolver.name,
141
+ error
142
+ });
143
+ return [];
144
+ }));
145
+ const [mainRecommendations, ...userResolverResults] = await Promise.all([userRecommendationsPromise, ...userResolversPromises]);
146
+ recommendedUsers = [mainRecommendations, ...userResolverResults].flat();
147
+ } else {
148
+ recommendedUsers = await getUserRecommendations(recommendationsRequest, intl);
149
+ }
134
150
  if (overrideByline) {
135
151
  for (let option of recommendedUsers) {
136
152
  if (isUser(option) || isExternalUser(option) || isTeam(option)) {
@@ -150,7 +166,10 @@ export class SmartUserPickerWithoutAnalytics extends React.Component {
150
166
  elapsedTimeMilli,
151
167
  displayedUsers: getUsersForAnalytics(displayedUsers),
152
168
  productAttributes,
153
- applicable
169
+ applicable,
170
+ ...(fg('twcg-444-invite-usd-improvements-m2-gate') && {
171
+ userResolvers: Array.isArray(userResolvers) ? userResolvers.map(resolver => resolver.name) : []
172
+ })
154
173
  });
155
174
  return {
156
175
  users,
@@ -349,6 +368,7 @@ _defineProperty(SmartUserPickerWithoutAnalytics, "defaultProps", {
349
368
  includeNonLicensedUsers: false,
350
369
  prefetch: false,
351
370
  principalId: 'Context',
352
- debounceTime: DEFAULT_DEBOUNCE_TIME_MS
371
+ debounceTime: DEFAULT_DEBOUNCE_TIME_MS,
372
+ userResolvers: []
353
373
  });
354
374
  export const SmartUserPicker = withAnalyticsEvents()(injectIntl(SmartUserPickerWithoutAnalytics));
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  import { createAndFireEvent } from '@atlaskit/analytics-next';
5
5
  import { v4 as uuid } from 'uuid';
6
6
  var packageName = "@atlaskit/smart-user-picker";
7
- var packageVersion = "8.0.1";
7
+ var packageVersion = "8.1.0";
8
8
  export var startSession = function startSession() {
9
9
  return {
10
10
  id: uuid(),
@@ -90,4 +90,8 @@ export var successfulRequestUsersEvent = function successfulRequestUsersEvent(pr
90
90
  export var failedRequestUsersEvent = function failedRequestUsersEvent(props, state) {
91
91
  var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
92
92
  return createSmartUserPickerEvent('failed', 'usersRequest', _objectSpread(_objectSpread({}, createDefaultSmartPickerAttributes(props, state)), attributes));
93
+ };
94
+ export var failedUserResolversEvent = function failedUserResolversEvent(props, state) {
95
+ var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
96
+ return createSmartUserPickerEvent('failed', 'userResolversRequest', _objectSpread(_objectSpread({}, createDefaultSmartPickerAttributes(props, state)), attributes));
93
97
  };
@@ -1,4 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ import _toArray from "@babel/runtime/helpers/toArray";
2
4
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
5
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
6
  import _createClass from "@babel/runtime/helpers/createClass";
@@ -6,9 +8,9 @@ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstruct
6
8
  import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
9
  import _inherits from "@babel/runtime/helpers/inherits";
8
10
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
11
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
9
12
  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; }
10
13
  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; }
11
- import _regeneratorRuntime from "@babel/runtime/regenerator";
12
14
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
13
15
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
16
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -22,7 +24,8 @@ import memoizeOne from 'memoize-one';
22
24
  import { injectIntl } from 'react-intl-next';
23
25
  import { UFOExperienceState } from '@atlaskit/ufo';
24
26
  import UserPicker, { isExternalUser, isTeam, isUser } from '@atlaskit/user-picker';
25
- import { requestUsersEvent, filterUsersEvent, preparedUsersLoadedEvent, successfulRequestUsersEvent, failedRequestUsersEvent, mountedWithPrefetchEvent, createAndFireEventInElementsChannel } from '../analytics';
27
+ import { fg } from '@atlaskit/platform-feature-flags';
28
+ import { requestUsersEvent, filterUsersEvent, preparedUsersLoadedEvent, successfulRequestUsersEvent, failedRequestUsersEvent, mountedWithPrefetchEvent, createAndFireEventInElementsChannel, failedUserResolversEvent } from '../analytics';
26
29
  import MessagesIntlProvider from './MessagesIntlProvider';
27
30
  import { getUserRecommendations, hydrateDefaultValues } from '../service';
28
31
  import { smartUserPickerOptionsShownUfoExperience } from '../ufoExperiences';
@@ -98,12 +101,12 @@ export var SmartUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compo
98
101
  });
99
102
  _defineProperty(_this, "memoizedFilterOptions", memoizeOne(_this.filterOptions));
100
103
  _defineProperty(_this, "getUsers", debounce( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
101
- var _this$state, query, sessionId, closed, _this$props, baseUrl, childObjectId, containerId, fieldId, includeGroups, includeTeams, includeUsers, includeNonLicensedUsers, intl, maxOptions, objectId, onEmpty, onError, overrideByline, orgId, principalId, productAttributes, productKey, searchQueryFilter, siteId, transformOptions, maxNumberOfResults, startTime, recommendationsRequest, _yield$onEmpty, _query, recommendedUsers, _iterator, _step, option, elapsedTimeMilli, transformedOptions, displayedUsers, is5xxEvent, onErrorProducedError, defaultUsers, _elapsedTimeMilli;
104
+ var _this$state, query, sessionId, closed, _this$props, baseUrl, childObjectId, containerId, fieldId, includeGroups, includeTeams, includeUsers, includeNonLicensedUsers, intl, maxOptions, objectId, onEmpty, onError, overrideByline, orgId, principalId, productAttributes, productKey, searchQueryFilter, siteId, transformOptions, userResolvers, maxNumberOfResults, startTime, recommendationsRequest, _yield$onEmpty, _query, recommendedUsers, userRecommendationsPromise, userResolversPromises, _yield$Promise$all, _yield$Promise$all2, mainRecommendations, userResolverResults, _iterator, _step, option, elapsedTimeMilli, transformedOptions, displayedUsers, is5xxEvent, onErrorProducedError, defaultUsers, _elapsedTimeMilli;
102
105
  return _regeneratorRuntime.wrap(function _callee$(_context) {
103
106
  while (1) switch (_context.prev = _context.next) {
104
107
  case 0:
105
108
  _this$state = _this.state, query = _this$state.query, sessionId = _this$state.sessionId, closed = _this$state.closed;
106
- _this$props = _this.props, baseUrl = _this$props.baseUrl, childObjectId = _this$props.childObjectId, containerId = _this$props.containerId, fieldId = _this$props.fieldId, includeGroups = _this$props.includeGroups, includeTeams = _this$props.includeTeams, includeUsers = _this$props.includeUsers, includeNonLicensedUsers = _this$props.includeNonLicensedUsers, intl = _this$props.intl, maxOptions = _this$props.maxOptions, objectId = _this$props.objectId, onEmpty = _this$props.onEmpty, onError = _this$props.onError, overrideByline = _this$props.overrideByline, orgId = _this$props.orgId, principalId = _this$props.principalId, productAttributes = _this$props.productAttributes, productKey = _this$props.productKey, searchQueryFilter = _this$props.searchQueryFilter, siteId = _this$props.siteId, transformOptions = _this$props.transformOptions;
109
+ _this$props = _this.props, baseUrl = _this$props.baseUrl, childObjectId = _this$props.childObjectId, containerId = _this$props.containerId, fieldId = _this$props.fieldId, includeGroups = _this$props.includeGroups, includeTeams = _this$props.includeTeams, includeUsers = _this$props.includeUsers, includeNonLicensedUsers = _this$props.includeNonLicensedUsers, intl = _this$props.intl, maxOptions = _this$props.maxOptions, objectId = _this$props.objectId, onEmpty = _this$props.onEmpty, onError = _this$props.onError, overrideByline = _this$props.overrideByline, orgId = _this$props.orgId, principalId = _this$props.principalId, productAttributes = _this$props.productAttributes, productKey = _this$props.productKey, searchQueryFilter = _this$props.searchQueryFilter, siteId = _this$props.siteId, transformOptions = _this$props.transformOptions, userResolvers = _this$props.userResolvers;
107
110
  maxNumberOfResults = maxOptions || 100;
108
111
  startTime = window.performance.now();
109
112
  recommendationsRequest = {
@@ -131,10 +134,36 @@ export var SmartUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compo
131
134
  _context.prev = 5;
132
135
  _query = _this.state.query;
133
136
  _this.fireEvent(requestUsersEvent);
134
- _context.next = 10;
137
+ if (!fg('twcg-444-invite-usd-improvements-m2-gate')) {
138
+ _context.next = 20;
139
+ break;
140
+ }
141
+ userRecommendationsPromise = getUserRecommendations(recommendationsRequest, intl);
142
+ userResolversPromises = (userResolvers !== null && userResolvers !== void 0 ? userResolvers : []).map(function (resolver) {
143
+ return resolver(_query).catch(function (error) {
144
+ _this.fireEvent(failedUserResolversEvent, {
145
+ resolverName: resolver.name,
146
+ error: error
147
+ });
148
+ return [];
149
+ });
150
+ });
151
+ _context.next = 13;
152
+ return Promise.all([userRecommendationsPromise].concat(_toConsumableArray(userResolversPromises)));
153
+ case 13:
154
+ _yield$Promise$all = _context.sent;
155
+ _yield$Promise$all2 = _toArray(_yield$Promise$all);
156
+ mainRecommendations = _yield$Promise$all2[0];
157
+ userResolverResults = _yield$Promise$all2.slice(1);
158
+ recommendedUsers = [mainRecommendations].concat(_toConsumableArray(userResolverResults)).flat();
159
+ _context.next = 23;
160
+ break;
161
+ case 20:
162
+ _context.next = 22;
135
163
  return getUserRecommendations(recommendationsRequest, intl);
136
- case 10:
164
+ case 22:
137
165
  recommendedUsers = _context.sent;
166
+ case 23:
138
167
  if (overrideByline) {
139
168
  _iterator = _createForOfIteratorHelper(recommendedUsers);
140
169
  try {
@@ -152,71 +181,75 @@ export var SmartUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compo
152
181
  }
153
182
  elapsedTimeMilli = window.performance.now() - startTime;
154
183
  if (!transformOptions) {
155
- _context.next = 19;
184
+ _context.next = 31;
156
185
  break;
157
186
  }
158
- _context.next = 16;
187
+ _context.next = 28;
159
188
  return transformOptions(recommendedUsers, _query);
160
- case 16:
189
+ case 28:
161
190
  _context.t0 = _context.sent;
162
- _context.next = 20;
191
+ _context.next = 32;
163
192
  break;
164
- case 19:
193
+ case 31:
165
194
  _context.t0 = recommendedUsers;
166
- case 20:
195
+ case 32:
167
196
  transformedOptions = _context.t0;
168
197
  if (!(transformedOptions.length === 0 && onEmpty)) {
169
- _context.next = 36;
198
+ _context.next = 48;
170
199
  break;
171
200
  }
172
- _context.next = 24;
201
+ _context.next = 36;
173
202
  return onEmpty(_query);
174
- case 24:
203
+ case 36:
175
204
  _context.t3 = _yield$onEmpty = _context.sent;
176
205
  _context.t2 = _context.t3 !== null;
177
206
  if (!_context.t2) {
178
- _context.next = 28;
207
+ _context.next = 40;
179
208
  break;
180
209
  }
181
210
  _context.t2 = _yield$onEmpty !== void 0;
182
- case 28:
211
+ case 40:
183
212
  if (!_context.t2) {
184
- _context.next = 32;
213
+ _context.next = 44;
185
214
  break;
186
215
  }
187
216
  _context.t4 = _yield$onEmpty;
188
- _context.next = 33;
217
+ _context.next = 45;
189
218
  break;
190
- case 32:
219
+ case 44:
191
220
  _context.t4 = [];
192
- case 33:
221
+ case 45:
193
222
  _context.t1 = _context.t4;
194
- _context.next = 37;
223
+ _context.next = 49;
195
224
  break;
196
- case 36:
225
+ case 48:
197
226
  _context.t1 = transformedOptions;
198
- case 37:
227
+ case 49:
199
228
  displayedUsers = _context.t1;
200
229
  _this.setState(function (state) {
201
230
  var applicable = state.query === _query;
202
231
  var users = applicable ? displayedUsers : state.users;
203
232
  var loading = !applicable;
204
- _this.fireEvent(successfulRequestUsersEvent, {
233
+ _this.fireEvent(successfulRequestUsersEvent, _objectSpread({
205
234
  users: getUsersForAnalytics(recommendedUsers),
206
235
  elapsedTimeMilli: elapsedTimeMilli,
207
236
  displayedUsers: getUsersForAnalytics(displayedUsers),
208
237
  productAttributes: productAttributes,
209
238
  applicable: applicable
210
- });
239
+ }, fg('twcg-444-invite-usd-improvements-m2-gate') && {
240
+ userResolvers: Array.isArray(userResolvers) ? userResolvers.map(function (resolver) {
241
+ return resolver.name;
242
+ }) : []
243
+ }));
211
244
  return {
212
245
  users: users,
213
246
  loading: loading
214
247
  };
215
248
  });
216
- _context.next = 70;
249
+ _context.next = 82;
217
250
  break;
218
- case 41:
219
- _context.prev = 41;
251
+ case 53:
252
+ _context.prev = 53;
220
253
  _context.t5 = _context["catch"](5);
221
254
  is5xxEvent = checkIf500Event(_context.t5.statusCode);
222
255
  if (!closed && !onError && is5xxEvent) {
@@ -229,35 +262,35 @@ export var SmartUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compo
229
262
  });
230
263
  onErrorProducedError = false;
231
264
  defaultUsers = [];
232
- _context.prev = 48;
265
+ _context.prev = 60;
233
266
  if (!onError) {
234
- _context.next = 58;
267
+ _context.next = 70;
235
268
  break;
236
269
  }
237
- _context.next = 52;
270
+ _context.next = 64;
238
271
  return onError(_context.t5, recommendationsRequest);
239
- case 52:
272
+ case 64:
240
273
  _context.t7 = _context.sent;
241
274
  if (_context.t7) {
242
- _context.next = 55;
275
+ _context.next = 67;
243
276
  break;
244
277
  }
245
278
  _context.t7 = [];
246
- case 55:
279
+ case 67:
247
280
  _context.t6 = _context.t7;
248
- _context.next = 59;
281
+ _context.next = 71;
249
282
  break;
250
- case 58:
283
+ case 70:
251
284
  _context.t6 = [];
252
- case 59:
285
+ case 71:
253
286
  defaultUsers = _context.t6;
254
- _context.next = 65;
287
+ _context.next = 77;
255
288
  break;
256
- case 62:
257
- _context.prev = 62;
258
- _context.t8 = _context["catch"](48);
289
+ case 74:
290
+ _context.prev = 74;
291
+ _context.t8 = _context["catch"](60);
259
292
  onErrorProducedError = true;
260
- case 65:
293
+ case 77:
261
294
  if (onErrorProducedError && is5xxEvent) {
262
295
  // Log error from fallback data source `onError` to UFO
263
296
  _this.optionsShownUfoExperienceInstance.failure(ufoEndStateConfig(_this.props.fieldId));
@@ -274,11 +307,11 @@ export var SmartUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compo
274
307
  elapsedTimeMilli: _elapsedTimeMilli,
275
308
  productAttributes: productAttributes
276
309
  });
277
- case 70:
310
+ case 82:
278
311
  case "end":
279
312
  return _context.stop();
280
313
  }
281
- }, _callee, null, [[5, 41], [48, 62]]);
314
+ }, _callee, null, [[5, 53], [60, 74]]);
282
315
  })), (_this$props$debounceT = _this.props.debounceTime) !== null && _this$props$debounceT !== void 0 ? _this$props$debounceT : 0));
283
316
  _defineProperty(_this, "onInputChange", function (newQuery, sessionId) {
284
317
  var query = newQuery || '';
@@ -467,6 +500,7 @@ _defineProperty(SmartUserPickerWithoutAnalytics, "defaultProps", {
467
500
  includeNonLicensedUsers: false,
468
501
  prefetch: false,
469
502
  principalId: 'Context',
470
- debounceTime: DEFAULT_DEBOUNCE_TIME_MS
503
+ debounceTime: DEFAULT_DEBOUNCE_TIME_MS,
504
+ userResolvers: []
471
505
  });
472
506
  export var SmartUserPicker = withAnalyticsEvents()(injectIntl(SmartUserPickerWithoutAnalytics));
@@ -19,3 +19,4 @@ export declare const filterUsersEvent: SmartEventCreator;
19
19
  export declare const requestUsersEvent: SmartEventCreator;
20
20
  export declare const successfulRequestUsersEvent: SmartEventCreator;
21
21
  export declare const failedRequestUsersEvent: SmartEventCreator;
22
+ export declare const failedUserResolversEvent: SmartEventCreator;
@@ -15,6 +15,7 @@ export declare class SmartUserPickerWithoutAnalytics extends React.Component<Pro
15
15
  prefetch: boolean;
16
16
  principalId: string;
17
17
  debounceTime: number;
18
+ userResolvers: never[];
18
19
  };
19
20
  constructor(props: Props & WrappedComponentProps);
20
21
  componentDidMount(): Promise<void>;
@@ -196,6 +196,10 @@ export interface SmartProps {
196
196
  * Called after options are loaded.
197
197
  */
198
198
  transformOptions?: TransformOptions;
199
+ /**
200
+ * Optional callback to provide additional user resolvers, such as for fetching and adding users from third party sources
201
+ */
202
+ userResolvers?: Array<(query: string) => Promise<OptionData[]>>;
199
203
  }
200
204
  export interface Props extends SmartProps, UserPickerProps, WithAnalyticsEventsProps {
201
205
  /**
@@ -19,3 +19,4 @@ export declare const filterUsersEvent: SmartEventCreator;
19
19
  export declare const requestUsersEvent: SmartEventCreator;
20
20
  export declare const successfulRequestUsersEvent: SmartEventCreator;
21
21
  export declare const failedRequestUsersEvent: SmartEventCreator;
22
+ export declare const failedUserResolversEvent: SmartEventCreator;
@@ -15,6 +15,7 @@ export declare class SmartUserPickerWithoutAnalytics extends React.Component<Pro
15
15
  prefetch: boolean;
16
16
  principalId: string;
17
17
  debounceTime: number;
18
+ userResolvers: never[];
18
19
  };
19
20
  constructor(props: Props & WrappedComponentProps);
20
21
  componentDidMount(): Promise<void>;
@@ -196,6 +196,10 @@ export interface SmartProps {
196
196
  * Called after options are loaded.
197
197
  */
198
198
  transformOptions?: TransformOptions;
199
+ /**
200
+ * Optional callback to provide additional user resolvers, such as for fetching and adding users from third party sources
201
+ */
202
+ userResolvers?: Array<(query: string) => Promise<OptionData[]>>;
199
203
  }
200
204
  export interface Props extends SmartProps, UserPickerProps, WithAnalyticsEventsProps {
201
205
  /**
@@ -6,7 +6,7 @@
6
6
  "sideEffects": false,
7
7
  "types": "../dist/types/option.d.ts",
8
8
  "typesVersions": {
9
- ">=4.5 <5.4": {
9
+ ">=4.5 <5.9": {
10
10
  "*": [
11
11
  "../dist/types-ts4.5/option.d.ts"
12
12
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-user-picker",
3
- "version": "8.1.0",
3
+ "version": "8.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -39,8 +39,9 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@atlaskit/analytics-next": "^11.1.0",
42
+ "@atlaskit/platform-feature-flags": "^1.1.0",
42
43
  "@atlaskit/ufo": "^0.4.0",
43
- "@atlaskit/user-picker": "^11.4.0",
44
+ "@atlaskit/user-picker": "^11.6.0",
44
45
  "@babel/runtime": "^7.0.0",
45
46
  "lodash": "^4.17.21",
46
47
  "memoize-one": "^6.0.0",
@@ -53,7 +54,7 @@
53
54
  },
54
55
  "devDependencies": {
55
56
  "@atlaskit/select": "^21.2.0",
56
- "@atlaskit/util-data-test": "^18.0.0",
57
+ "@atlaskit/util-data-test": "^18.1.0",
57
58
  "@testing-library/dom": "^10.1.0",
58
59
  "@testing-library/react": "^13.4.0",
59
60
  "@testing-library/user-event": "^14.4.3",
@@ -61,5 +62,10 @@
61
62
  "fetch-mock": "^8.0.0",
62
63
  "graphql-tag": "^2.10.1",
63
64
  "mock-apollo-client": "^0.1.0"
65
+ },
66
+ "platform-feature-flags": {
67
+ "twcg-444-invite-usd-improvements-m2-gate": {
68
+ "type": "boolean"
69
+ }
64
70
  }
65
71
  }