@atlaskit/profilecard 19.7.15 → 19.9.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/dist/cjs/client/getTeamFromAGG.js +1 -1
  4. package/dist/cjs/components/User/ProfileCard.js +17 -5
  5. package/dist/cjs/components/User/ProfileCardTrigger.js +7 -2
  6. package/dist/cjs/components/User/ProfileCardTriggerNext.js +347 -0
  7. package/dist/cjs/i18n/en.js +1 -0
  8. package/dist/cjs/i18n/en_GB.js +1 -0
  9. package/dist/cjs/i18n/en_ZZ.js +1 -0
  10. package/dist/cjs/util/analytics.js +1 -1
  11. package/dist/es2019/client/getTeamFromAGG.js +1 -1
  12. package/dist/es2019/components/User/ProfileCard.js +18 -6
  13. package/dist/es2019/components/User/ProfileCardTrigger.js +6 -1
  14. package/dist/es2019/components/User/ProfileCardTriggerNext.js +266 -0
  15. package/dist/es2019/i18n/en.js +1 -0
  16. package/dist/es2019/i18n/en_GB.js +1 -0
  17. package/dist/es2019/i18n/en_ZZ.js +1 -0
  18. package/dist/es2019/util/analytics.js +1 -1
  19. package/dist/esm/client/getTeamFromAGG.js +1 -1
  20. package/dist/esm/components/User/ProfileCard.js +18 -6
  21. package/dist/esm/components/User/ProfileCardTrigger.js +6 -1
  22. package/dist/esm/components/User/ProfileCardTriggerNext.js +337 -0
  23. package/dist/esm/i18n/en.js +1 -0
  24. package/dist/esm/i18n/en_GB.js +1 -0
  25. package/dist/esm/i18n/en_ZZ.js +1 -0
  26. package/dist/esm/util/analytics.js +1 -1
  27. package/dist/types/components/User/ProfileCardTrigger.d.ts +3 -4
  28. package/dist/types/components/User/ProfileCardTriggerNext.d.ts +3 -0
  29. package/dist/types/i18n/en.d.ts +1 -0
  30. package/dist/types/i18n/en_GB.d.ts +1 -0
  31. package/dist/types/i18n/en_ZZ.d.ts +1 -0
  32. package/dist/types/types.d.ts +4 -1
  33. package/dist/types-ts4.5/components/User/ProfileCardTrigger.d.ts +3 -4
  34. package/dist/types-ts4.5/components/User/ProfileCardTriggerNext.d.ts +3 -0
  35. package/dist/types-ts4.5/i18n/en.d.ts +1 -0
  36. package/dist/types-ts4.5/i18n/en_GB.d.ts +1 -0
  37. package/dist/types-ts4.5/i18n/en_ZZ.d.ts +1 -0
  38. package/dist/types-ts4.5/types.d.ts +4 -1
  39. package/package.json +12 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/profilecard
2
2
 
3
+ ## 19.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#70817](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/70817) [`bc59c17947b6`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/bc59c17947b6) - Add focus to view profile button when Profile card display
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+
13
+ ## 19.8.0
14
+
15
+ ### Minor Changes
16
+
17
+ - [#68345](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/68345) [`c769c4488d20`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/c769c4488d20) - Add aria label to trigger & add ProfilecardTriggerNext
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+
3
23
  ## 19.7.15
4
24
 
5
25
  ### Patch Changes
@@ -51,6 +51,9 @@
51
51
  {
52
52
  "path": "../../../design-system/menu/afm-cc/tsconfig.json"
53
53
  },
54
+ {
55
+ "path": "../../../platform/feature-flags/afm-cc/tsconfig.json"
56
+ },
54
57
  {
55
58
  "path": "../../../design-system/popup/afm-cc/tsconfig.json"
56
59
  },
@@ -57,7 +57,7 @@ var addHeaders = exports.addHeaders = function addHeaders(headers) {
57
57
  headers.append('X-ExperimentalApi', 'teams-beta');
58
58
  headers.append('X-ExperimentalApi', 'team-members-beta');
59
59
  headers.append('atl-client-name', "@atlaskit/profilecard");
60
- headers.append('atl-client-version', "19.7.15");
60
+ headers.append('atl-client-version', "19.9.0");
61
61
  return headers;
62
62
  };
63
63
  function getTeamFromAGG(_x, _x2, _x3) {
@@ -131,12 +131,14 @@ var ProfilecardInternal = exports.ProfilecardInternal = function ProfilecardInte
131
131
  fireAnalyticsWithDuration: fireAnalyticsWithDuration
132
132
  })), realActions && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Card.ActionsFlexSpacer, null), /*#__PURE__*/_react.default.createElement(Actions, {
133
133
  actions: realActions,
134
- fireAnalyticsWithDuration: fireAnalyticsWithDuration
134
+ fireAnalyticsWithDuration: fireAnalyticsWithDuration,
135
+ isTriggeredUsingKeyboard: props.isTriggeredUsingKeyboard
135
136
  })))));
136
137
  };
137
138
  var Actions = function Actions(_ref) {
138
139
  var actions = _ref.actions,
139
- fireAnalyticsWithDuration = _ref.fireAnalyticsWithDuration;
140
+ fireAnalyticsWithDuration = _ref.fireAnalyticsWithDuration,
141
+ isTriggeredUsingKeyboard = _ref.isTriggeredUsingKeyboard;
140
142
  var onActionClick = (0, _react.useCallback)(function (action, args, event, index) {
141
143
  fireAnalyticsWithDuration(function (duration) {
142
144
  return (0, _analytics.actionClicked)('user', {
@@ -152,6 +154,12 @@ var Actions = function Actions(_ref) {
152
154
  action.callback.apply(action, [event].concat((0, _toConsumableArray2.default)(args)));
153
155
  }
154
156
  }, [fireAnalyticsWithDuration]);
157
+ var buttonRef = (0, _react.useRef)(null);
158
+ (0, _react.useEffect)(function () {
159
+ if (actions.length > 0 && buttonRef.current && isTriggeredUsingKeyboard) {
160
+ buttonRef.current.focus();
161
+ }
162
+ }, [isTriggeredUsingKeyboard, actions.length]);
155
163
  if (!actions || actions.length === 0) {
156
164
  return null;
157
165
  }
@@ -162,7 +170,8 @@ var Actions = function Actions(_ref) {
162
170
  }, regularActions.map(function (action, index) {
163
171
  var isKudos = action.id === GIVE_KUDOS_ACTION_ID;
164
172
  var button = /*#__PURE__*/_react.default.createElement(_focusRing.default, {
165
- isInset: true
173
+ isInset: true,
174
+ key: "profile-card-action-focus-ring_".concat(action.id || index)
166
175
  }, /*#__PURE__*/_react.default.createElement(_customThemeButton.default, {
167
176
  appearance: "default",
168
177
  key: action.id || index,
@@ -172,10 +181,13 @@ var Actions = function Actions(_ref) {
172
181
  }
173
182
  return onActionClick(action, args, event, index);
174
183
  },
175
- href: action.link
184
+ href: action.link,
185
+ ref: index === 0 ? buttonRef : undefined
176
186
  }, action.label, isKudos && /*#__PURE__*/_react.default.createElement(_Card.AnimationWrapper, null, /*#__PURE__*/_react.default.createElement(_Card.KudosBlobAnimation, null))));
177
187
  if (isKudos) {
178
- return /*#__PURE__*/_react.default.createElement(_Card.AnimatedKudosButton, null, button);
188
+ return /*#__PURE__*/_react.default.createElement(_Card.AnimatedKudosButton, {
189
+ key: "profile-card-action-kudos_".concat(action.id || index)
190
+ }, button);
179
191
  }
180
192
  return button;
181
193
  }), overflowActions && /*#__PURE__*/_react.default.createElement(_OverflowProfileCardButtons.OverflowProfileCardButtons, {
@@ -5,7 +5,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = void 0;
8
+ exports.default = ProfilecardTriggerSwitch;
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
@@ -19,6 +19,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
19
19
  var _react = _interopRequireWildcard(require("react"));
20
20
  var _analyticsNext = require("@atlaskit/analytics-next");
21
21
  var _giveKudos = require("@atlaskit/give-kudos");
22
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
22
23
  var _popup = _interopRequireDefault(require("@atlaskit/popup"));
23
24
  var _constants = require("@atlaskit/theme/constants");
24
25
  var _filterActions2 = _interopRequireDefault(require("../../internal/filterActions"));
@@ -26,6 +27,7 @@ var _Card = require("../../styled/Card");
26
27
  var _analytics = require("../../util/analytics");
27
28
  var _config = require("../../util/config");
28
29
  var _lazyProfileCard = require("./lazyProfileCard");
30
+ var _ProfileCardTriggerNext = _interopRequireDefault(require("./ProfileCardTriggerNext"));
29
31
  var _UserLoadingState = _interopRequireDefault(require("./UserLoadingState"));
30
32
  var _excluded = ["ref"];
31
33
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -325,4 +327,7 @@ var ProfilecardTrigger = /*#__PURE__*/function (_React$PureComponent) {
325
327
  trigger: 'hover',
326
328
  position: 'bottom-start'
327
329
  });
328
- var _default = exports.default = (0, _analyticsNext.withAnalyticsEvents)()(ProfilecardTrigger);
330
+ var ProfilecardTriggerLegacy = (0, _analyticsNext.withAnalyticsEvents)()(ProfilecardTrigger);
331
+ function ProfilecardTriggerSwitch(props) {
332
+ return (0, _platformFeatureFlags.getBooleanFF)('platform.profile-card-trigger-next') ? /*#__PURE__*/_react.default.createElement(_ProfileCardTriggerNext.default, props) : /*#__PURE__*/_react.default.createElement(ProfilecardTriggerLegacy, props);
333
+ }
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = ProfilecardTriggerNext;
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
+ var _react = _interopRequireWildcard(require("react"));
17
+ var _analyticsNext = require("@atlaskit/analytics-next");
18
+ var _giveKudos = require("@atlaskit/give-kudos");
19
+ var _popup = _interopRequireDefault(require("@atlaskit/popup"));
20
+ var _constants = require("@atlaskit/theme/constants");
21
+ var _filterActions = _interopRequireDefault(require("../../internal/filterActions"));
22
+ var _Card = require("../../styled/Card");
23
+ var _analytics = require("../../util/analytics");
24
+ var _config = require("../../util/config");
25
+ var _lazyProfileCard = require("./lazyProfileCard");
26
+ var _UserLoadingState = _interopRequireDefault(require("./UserLoadingState"));
27
+ var _excluded = ["ref"];
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
30
+ 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; }
31
+ 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; }
32
+ function ProfilecardTriggerNext(_ref) {
33
+ var _ref$trigger = _ref.trigger,
34
+ trigger = _ref$trigger === void 0 ? 'hover' : _ref$trigger,
35
+ userId = _ref.userId,
36
+ cloudId = _ref.cloudId,
37
+ resourceClient = _ref.resourceClient,
38
+ _ref$actions = _ref.actions,
39
+ actions = _ref$actions === void 0 ? [] : _ref$actions,
40
+ _ref$position = _ref.position,
41
+ position = _ref$position === void 0 ? 'bottom-start' : _ref$position,
42
+ children = _ref.children,
43
+ testId = _ref.testId,
44
+ addFlag = _ref.addFlag,
45
+ onReportingLinesClick = _ref.onReportingLinesClick,
46
+ ariaLabel = _ref.ariaLabel,
47
+ ariaLabelledBy = _ref.ariaLabelledBy;
48
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
49
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
50
+ var _useState = (0, _react.useState)(false),
51
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
52
+ isMounted = _useState2[0],
53
+ setIsMounted = _useState2[1];
54
+ var showDelay = trigger === 'click' ? 0 : _config.DELAY_MS_SHOW;
55
+ var hideDelay = trigger === 'click' ? 0 : _config.DELAY_MS_HIDE;
56
+ var _useState3 = (0, _react.useState)(0),
57
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
58
+ showTimer = _useState4[0],
59
+ setShowTimer = _useState4[1];
60
+ var _useState5 = (0, _react.useState)(0),
61
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
62
+ hideTimer = _useState6[0],
63
+ setHideTimer = _useState6[1];
64
+ var _useState7 = (0, _react.useState)(false),
65
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
66
+ visible = _useState8[0],
67
+ setVisible = _useState8[1];
68
+ var _useState9 = (0, _react.useState)(undefined),
69
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
70
+ isLoading = _useState10[0],
71
+ setIsLoading = _useState10[1];
72
+ var _useState11 = (0, _react.useState)(false),
73
+ _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
74
+ hasError = _useState12[0],
75
+ setHasError = _useState12[1];
76
+ var _useState13 = (0, _react.useState)(null),
77
+ _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
78
+ error = _useState14[0],
79
+ setError = _useState14[1];
80
+ var _useState15 = (0, _react.useState)(null),
81
+ _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
82
+ data = _useState16[0],
83
+ setData = _useState16[1];
84
+ var _useState17 = (0, _react.useState)(undefined),
85
+ _useState18 = (0, _slicedToArray2.default)(_useState17, 2),
86
+ reportingLinesData = _useState18[0],
87
+ setReportingLinesData = _useState18[1];
88
+ var _useState19 = (0, _react.useState)(false),
89
+ _useState20 = (0, _slicedToArray2.default)(_useState19, 2),
90
+ shouldShowGiveKudos = _useState20[0],
91
+ setShouldShowGiveKudos = _useState20[1];
92
+ var _useState21 = (0, _react.useState)(undefined),
93
+ _useState22 = (0, _slicedToArray2.default)(_useState21, 2),
94
+ teamCentralBaseUrl = _useState22[0],
95
+ setTeamCentralBaseUrl = _useState22[1];
96
+ var _useState23 = (0, _react.useState)(false),
97
+ _useState24 = (0, _slicedToArray2.default)(_useState23, 2),
98
+ kudosDrawerOpen = _useState24[0],
99
+ setKudosDrawerOpen = _useState24[1];
100
+ var _useState25 = (0, _react.useState)(false),
101
+ _useState26 = (0, _slicedToArray2.default)(_useState25, 2),
102
+ isTriggeredUsingKeyboard = _useState26[0],
103
+ setTriggeredUsingKeyboard = _useState26[1];
104
+ var triggerRef = (0, _react.useRef)(null);
105
+ (0, _react.useEffect)(function () {
106
+ setIsMounted(true);
107
+ return function () {
108
+ setIsMounted(false);
109
+ clearTimeout(showTimer);
110
+ clearTimeout(hideTimer);
111
+ };
112
+ // eslint-disable-next-line react-hooks/exhaustive-deps
113
+ }, []);
114
+ (0, _react.useEffect)(function () {
115
+ // Reset state when the userId changes
116
+ setIsLoading(undefined);
117
+ setHasError(false);
118
+ setError(null);
119
+ setData(null);
120
+ setReportingLinesData(undefined);
121
+ setShouldShowGiveKudos(false);
122
+ setTeamCentralBaseUrl(undefined);
123
+ }, [userId]);
124
+ var fireAnalytics = (0, _react.useCallback)(function (payload) {
125
+ // Don't fire any analytics if the component is unmounted
126
+ if (!isMounted) {
127
+ return;
128
+ }
129
+ (0, _analytics.fireEvent)(createAnalyticsEvent, payload);
130
+ }, [createAnalyticsEvent, isMounted]);
131
+ var hideProfilecard = (0, _react.useCallback)(function () {
132
+ clearTimeout(showTimer);
133
+ clearTimeout(hideTimer);
134
+ if (!isTriggeredUsingKeyboard) {
135
+ setHideTimer(window.setTimeout(function () {
136
+ setVisible(false);
137
+ }, hideDelay));
138
+ }
139
+ setTriggeredUsingKeyboard(false);
140
+ }, [hideDelay, hideTimer, showTimer, isTriggeredUsingKeyboard]);
141
+ var handleKeyboardClose = (0, _react.useCallback)(function (event) {
142
+ if (event.key !== 'Escape') {
143
+ return;
144
+ }
145
+ if (triggerRef.current) {
146
+ triggerRef.current.focus();
147
+ }
148
+ setTriggeredUsingKeyboard(false);
149
+ setVisible(false);
150
+ }, [setTriggeredUsingKeyboard, setVisible]);
151
+ var handleClientSuccess = (0, _react.useCallback)(function (profileData, reportingLinesData, shouldShowGiveKudos) {
152
+ if (!isMounted) {
153
+ return;
154
+ }
155
+ setIsLoading(false);
156
+ setHasError(false);
157
+ setData(profileData);
158
+ setReportingLinesData(reportingLinesData);
159
+ setShouldShowGiveKudos(shouldShowGiveKudos);
160
+ }, [isMounted, setHasError, setIsLoading, setData, setReportingLinesData, setShouldShowGiveKudos]);
161
+ var handleClientError = (0, _react.useCallback)(function (err) {
162
+ if (!isMounted) {
163
+ return;
164
+ }
165
+ setIsLoading(false);
166
+ setHasError(true);
167
+ setError(err);
168
+ }, [isMounted, setHasError, setIsLoading, setError]);
169
+ var clientFetchProfile = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
170
+ var requests, responses;
171
+ return _regenerator.default.wrap(function _callee$(_context) {
172
+ while (1) switch (_context.prev = _context.next) {
173
+ case 0:
174
+ if (!(isLoading === true)) {
175
+ _context.next = 2;
176
+ break;
177
+ }
178
+ return _context.abrupt("return");
179
+ case 2:
180
+ setTeamCentralBaseUrl(resourceClient.getTeamCentralBaseUrl());
181
+ setIsLoading(true);
182
+ setHasError(false);
183
+ setError(null);
184
+ setData(null);
185
+ _context.prev = 7;
186
+ requests = Promise.all([resourceClient.getProfile(cloudId || '', userId, fireAnalytics), resourceClient.getReportingLines(userId), resourceClient.shouldShowGiveKudos()]);
187
+ _context.next = 11;
188
+ return requests;
189
+ case 11:
190
+ responses = _context.sent;
191
+ handleClientSuccess.apply(void 0, (0, _toConsumableArray2.default)(responses));
192
+ _context.next = 18;
193
+ break;
194
+ case 15:
195
+ _context.prev = 15;
196
+ _context.t0 = _context["catch"](7);
197
+ handleClientError(_context.t0);
198
+ case 18:
199
+ case "end":
200
+ return _context.stop();
201
+ }
202
+ }, _callee, null, [[7, 15]]);
203
+ })), [cloudId, fireAnalytics, isLoading, resourceClient, userId, handleClientSuccess, handleClientError]);
204
+ var showProfilecard = (0, _react.useCallback)(function () {
205
+ clearTimeout(hideTimer);
206
+ clearTimeout(showTimer);
207
+ setShowTimer(window.setTimeout(function () {
208
+ if (!visible) {
209
+ void clientFetchProfile();
210
+ setVisible(true);
211
+ }
212
+ }, showDelay));
213
+ }, [hideTimer, showDelay, showTimer, visible, clientFetchProfile]);
214
+ var onClick = (0, _react.useCallback)(function (event) {
215
+ // If the user clicks on the trigger then we don't want that click event to
216
+ // propagate out to parent containers. For example when clicking a mention
217
+ // lozenge in an inline-edit.
218
+ event.stopPropagation();
219
+ showProfilecard();
220
+ if (!visible) {
221
+ fireAnalytics((0, _analytics.cardTriggered)('user', 'click'));
222
+ }
223
+ }, [fireAnalytics, showProfilecard, visible]);
224
+ var onMouseEnter = (0, _react.useCallback)(function () {
225
+ showProfilecard();
226
+ if (!visible) {
227
+ fireAnalytics((0, _analytics.cardTriggered)('user', 'hover'));
228
+ }
229
+ }, [fireAnalytics, showProfilecard, visible]);
230
+ var onKeyPress = (0, _react.useCallback)(function (event) {
231
+ if (event.key === 'Enter' || event.key === ' ') {
232
+ event.preventDefault();
233
+ setTriggeredUsingKeyboard(true);
234
+ showProfilecard();
235
+ if (!visible) {
236
+ fireAnalytics((0, _analytics.cardTriggered)('user', 'click'));
237
+ }
238
+ }
239
+ }, [fireAnalytics, showProfilecard, visible]);
240
+ var onFocus = (0, _react.useCallback)(function () {
241
+ showProfilecard();
242
+ }, [showProfilecard]);
243
+ var containerListeners = (0, _react.useMemo)(function () {
244
+ return trigger === 'hover' ? {
245
+ onMouseEnter: onMouseEnter,
246
+ onMouseLeave: hideProfilecard,
247
+ onBlur: hideProfilecard,
248
+ onKeyPress: onKeyPress
249
+ } : {
250
+ onClick: onClick,
251
+ onKeyPress: onKeyPress
252
+ };
253
+ }, [hideProfilecard, onClick, onKeyPress, onMouseEnter, trigger]);
254
+ var filterActions = (0, _react.useCallback)(function () {
255
+ return (0, _filterActions.default)(actions, data);
256
+ }, [actions, data]);
257
+ var openKudosDrawer = function openKudosDrawer() {
258
+ hideProfilecard();
259
+ setKudosDrawerOpen(true);
260
+ };
261
+ var closeKudosDrawer = function closeKudosDrawer() {
262
+ setKudosDrawerOpen(false);
263
+ };
264
+ var showLoading = isLoading === true || isLoading === undefined;
265
+ var wrapperProps = (0, _react.useMemo)(function () {
266
+ return trigger === 'hover' ? {
267
+ onMouseEnter: onMouseEnter,
268
+ onMouseLeave: hideProfilecard,
269
+ onFocus: onFocus
270
+ } : {};
271
+ }, [hideProfilecard, onFocus, onMouseEnter, trigger]);
272
+ var profilecardProps = _objectSpread(_objectSpread({
273
+ userId: userId,
274
+ isCurrentUser: data === null || data === void 0 ? void 0 : data.isCurrentUser,
275
+ clientFetchProfile: clientFetchProfile
276
+ }, data), {}, {
277
+ reportingLines: reportingLinesData,
278
+ onReportingLinesClick: onReportingLinesClick,
279
+ isKudosEnabled: shouldShowGiveKudos,
280
+ teamCentralBaseUrl: teamCentralBaseUrl,
281
+ cloudId: cloudId,
282
+ openKudosDrawer: openKudosDrawer,
283
+ isTriggeredUsingKeyboard: isTriggeredUsingKeyboard
284
+ });
285
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_popup.default, {
286
+ isOpen: !!visible,
287
+ onClose: function onClose(event) {
288
+ hideProfilecard();
289
+ handleKeyboardClose(event);
290
+ },
291
+ placement: position,
292
+ content: function content() {
293
+ return showLoading ? /*#__PURE__*/_react.default.createElement(LoadingView, {
294
+ fireAnalytics: fireAnalytics
295
+ }) : /*#__PURE__*/_react.default.createElement("div", wrapperProps, visible && /*#__PURE__*/_react.default.createElement(_react.Suspense, {
296
+ fallback: null
297
+ }, /*#__PURE__*/_react.default.createElement(_lazyProfileCard.ProfileCardLazy, (0, _extends2.default)({}, profilecardProps, {
298
+ actions: filterActions(),
299
+ hasError: hasError,
300
+ errorType: error,
301
+ withoutElevation: true
302
+ }))));
303
+ },
304
+ trigger: function trigger(triggerProps) {
305
+ var callbackRef = triggerProps.ref,
306
+ innerProps = (0, _objectWithoutProperties2.default)(triggerProps, _excluded);
307
+ var ref = function ref(element) {
308
+ triggerRef.current = element;
309
+ if (typeof callbackRef === 'function') {
310
+ callbackRef(element);
311
+ }
312
+ };
313
+ return /*#__PURE__*/_react.default.createElement("span", (0, _extends2.default)({}, innerProps, containerListeners, {
314
+ ref: ref,
315
+ "data-testid": testId,
316
+ role: "button",
317
+ tabIndex: 0,
318
+ "aria-label": ariaLabel,
319
+ "aria-labelledby": ariaLabelledBy
320
+ }), children);
321
+ },
322
+ zIndex: _constants.layers.modal(),
323
+ shouldUseCaptureOnOutsideClick: true,
324
+ autoFocus: trigger === 'click'
325
+ }), shouldShowGiveKudos && /*#__PURE__*/_react.default.createElement(_react.Suspense, {
326
+ fallback: null
327
+ }, /*#__PURE__*/_react.default.createElement(_giveKudos.GiveKudosLauncherLazy, {
328
+ isOpen: kudosDrawerOpen,
329
+ recipient: {
330
+ type: _giveKudos.KudosType.INDIVIDUAL,
331
+ recipientId: userId
332
+ },
333
+ analyticsSource: "profile-card",
334
+ teamCentralBaseUrl: teamCentralBaseUrl,
335
+ cloudId: cloudId,
336
+ addFlag: addFlag,
337
+ onClose: closeKudosDrawer
338
+ })));
339
+ }
340
+ var LoadingView = function LoadingView(_ref3) {
341
+ var fireAnalytics = _ref3.fireAnalytics;
342
+ return /*#__PURE__*/_react.default.createElement(_Card.CardWrapper, {
343
+ "data-testId": "profilecard.profilecardtrigger.loading"
344
+ }, /*#__PURE__*/_react.default.createElement(_UserLoadingState.default, {
345
+ fireAnalytics: fireAnalytics
346
+ }));
347
+ };
@@ -13,6 +13,7 @@ exports.default = void 0;
13
13
  */
14
14
  //
15
15
  var _default = exports.default = {
16
+ 'profilecard.user.trigger.aria-label': 'More information about {fullName}',
16
17
  'pt.profile-card.closed.account': 'Account deleted',
17
18
  'pt.profile-card.closed.account.has.date.a.few.months': 'Their account has been deleted for a few months.',
18
19
  'pt.profile-card.closed.account.has.date.last.month': 'Their account was deleted last month.',
@@ -13,6 +13,7 @@ exports.default = void 0;
13
13
  */
14
14
  //English (United Kingdom)
15
15
  var _default = exports.default = {
16
+ 'profilecard.user.trigger.aria-label': 'More information about {fullName}',
16
17
  'pt.profile-card.closed.account': 'Account deleted',
17
18
  'pt.profile-card.closed.account.has.date.a.few.months': 'Their account has been deleted for a few months.',
18
19
  'pt.profile-card.closed.account.has.date.last.month': 'Their account was deleted last month.',
@@ -13,6 +13,7 @@ exports.default = void 0;
13
13
  */
14
14
  //
15
15
  var _default = exports.default = {
16
+ 'profilecard.user.trigger.aria-label': '⁣⁢More information about {fullName}⁠‍⁡؜‍‌‌⁡‌؜⁡‌⁣⁤',
16
17
  'pt.profile-card.closed.account': '⁣⁢Account deleted⁠؜⁡‌؜⁠‍⁡⁠؜؜⁣⁤',
17
18
  'pt.profile-card.closed.account.has.date.a.few.months': '⁣⁢Their account has been deleted for a few months.⁠⁡⁠‍‌⁠⁡‍؜‌⁡‌‌؜⁣⁤',
18
19
  'pt.profile-card.closed.account.has.date.last.month': '⁣⁢Their account was deleted last month.⁡‍⁠‌⁡؜‍؜⁠‍⁠؜⁣⁤',
@@ -44,7 +44,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
44
44
  actionSubjectId: actionSubjectId,
45
45
  attributes: _objectSpread(_objectSpread({
46
46
  packageName: "@atlaskit/profilecard",
47
- packageVersion: "19.7.15"
47
+ packageVersion: "19.9.0"
48
48
  }, attributes), {}, {
49
49
  firedAt: Math.round((0, _performance.getPageTime)())
50
50
  })
@@ -67,7 +67,7 @@ export const addHeaders = headers => {
67
67
  headers.append('X-ExperimentalApi', 'teams-beta');
68
68
  headers.append('X-ExperimentalApi', 'team-members-beta');
69
69
  headers.append('atl-client-name', "@atlaskit/profilecard");
70
- headers.append('atl-client-version', "19.7.15");
70
+ headers.append('atl-client-version', "19.9.0");
71
71
  return headers;
72
72
  };
73
73
  export async function getTeamFromAGG(url, teamId, siteId) {
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { FormattedMessage } from 'react-intl-next';
4
4
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
5
5
  import Avatar from '@atlaskit/avatar';
@@ -118,12 +118,14 @@ export const ProfilecardInternal = props => {
118
118
  fireAnalyticsWithDuration: fireAnalyticsWithDuration
119
119
  })), realActions && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ActionsFlexSpacer, null), /*#__PURE__*/React.createElement(Actions, {
120
120
  actions: realActions,
121
- fireAnalyticsWithDuration: fireAnalyticsWithDuration
121
+ fireAnalyticsWithDuration: fireAnalyticsWithDuration,
122
+ isTriggeredUsingKeyboard: props.isTriggeredUsingKeyboard
122
123
  })))));
123
124
  };
124
125
  const Actions = ({
125
126
  actions,
126
- fireAnalyticsWithDuration
127
+ fireAnalyticsWithDuration,
128
+ isTriggeredUsingKeyboard
127
129
  }) => {
128
130
  const onActionClick = useCallback((action, args, event, index) => {
129
131
  fireAnalyticsWithDuration(duration => actionClicked('user', {
@@ -138,6 +140,12 @@ const Actions = ({
138
140
  action.callback(event, ...args);
139
141
  }
140
142
  }, [fireAnalyticsWithDuration]);
143
+ const buttonRef = useRef(null);
144
+ useEffect(() => {
145
+ if (actions.length > 0 && buttonRef.current && isTriggeredUsingKeyboard) {
146
+ buttonRef.current.focus();
147
+ }
148
+ }, [isTriggeredUsingKeyboard, actions.length]);
141
149
  if (!actions || actions.length === 0) {
142
150
  return null;
143
151
  }
@@ -148,15 +156,19 @@ const Actions = ({
148
156
  }, regularActions.map((action, index) => {
149
157
  const isKudos = action.id === GIVE_KUDOS_ACTION_ID;
150
158
  const button = /*#__PURE__*/React.createElement(FocusRing, {
151
- isInset: true
159
+ isInset: true,
160
+ key: `profile-card-action-focus-ring_${action.id || index}`
152
161
  }, /*#__PURE__*/React.createElement(Button, {
153
162
  appearance: "default",
154
163
  key: action.id || index,
155
164
  onClick: (event, ...args) => onActionClick(action, args, event, index),
156
- href: action.link
165
+ href: action.link,
166
+ ref: index === 0 ? buttonRef : undefined
157
167
  }, action.label, isKudos && /*#__PURE__*/React.createElement(AnimationWrapper, null, /*#__PURE__*/React.createElement(KudosBlobAnimation, null))));
158
168
  if (isKudos) {
159
- return /*#__PURE__*/React.createElement(AnimatedKudosButton, null, button);
169
+ return /*#__PURE__*/React.createElement(AnimatedKudosButton, {
170
+ key: `profile-card-action-kudos_${action.id || index}`
171
+ }, button);
160
172
  }
161
173
  return button;
162
174
  }), overflowActions && /*#__PURE__*/React.createElement(OverflowProfileCardButtons, {
@@ -3,6 +3,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import React, { Suspense } from 'react';
4
4
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
5
5
  import { GiveKudosLauncherLazy, KudosType } from '@atlaskit/give-kudos';
6
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
6
7
  import Popup from '@atlaskit/popup';
7
8
  import { layers } from '@atlaskit/theme/constants';
8
9
  import filterActions from '../../internal/filterActions';
@@ -10,6 +11,7 @@ import { CardWrapper } from '../../styled/Card';
10
11
  import { cardTriggered, fireEvent } from '../../util/analytics';
11
12
  import { DELAY_MS_HIDE, DELAY_MS_SHOW } from '../../util/config';
12
13
  import { ProfileCardLazy } from './lazyProfileCard';
14
+ import ProfilecardTriggerNext from './ProfileCardTriggerNext';
13
15
  import UserLoadingState from './UserLoadingState';
14
16
  class ProfilecardTrigger extends React.PureComponent {
15
17
  constructor(...args) {
@@ -276,4 +278,7 @@ _defineProperty(ProfilecardTrigger, "defaultProps", {
276
278
  trigger: 'hover',
277
279
  position: 'bottom-start'
278
280
  });
279
- export default withAnalyticsEvents()(ProfilecardTrigger);
281
+ const ProfilecardTriggerLegacy = withAnalyticsEvents()(ProfilecardTrigger);
282
+ export default function ProfilecardTriggerSwitch(props) {
283
+ return getBooleanFF('platform.profile-card-trigger-next') ? /*#__PURE__*/React.createElement(ProfilecardTriggerNext, props) : /*#__PURE__*/React.createElement(ProfilecardTriggerLegacy, props);
284
+ }