@atlaskit/profilecard
Version:
A React component to display a card with user information.
470 lines (469 loc) • 22.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = ProfilecardTriggerNext;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireWildcard(require("react"));
var _reactIntlNext = require("react-intl-next");
var _giveKudos = require("@atlaskit/give-kudos");
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
var _popup = _interopRequireDefault(require("@atlaskit/popup"));
var _teamsAppInternalAnalytics = require("@atlaskit/teams-app-internal-analytics");
var _constants = require("@atlaskit/theme/constants");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
var _filterActions = _interopRequireDefault(require("../../internal/filterActions"));
var _getLabelMessage = _interopRequireDefault(require("../../internal/getLabelMessage"));
var _UserTrigger = require("../../styled/UserTrigger");
var _analytics = require("../../util/analytics");
var _config = require("../../util/config");
var _performance = require("../../util/performance");
var _AgentProfileCardResourced = require("../Agent/AgentProfileCardResourced");
var _lazyProfileCard = require("./lazyProfileCard");
var _UserLoadingState = _interopRequireDefault(require("./UserLoadingState"));
var _excluded = ["ref"],
_excluded2 = ["aria-expanded", "aria-haspopup"];
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
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; }
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; }
function ProfileCardContent(_ref) {
var profilecardProps = _ref.profilecardProps,
userId = _ref.userId,
cloudId = _ref.cloudId,
resourceClient = _ref.resourceClient,
trigger = _ref.trigger,
isAgent = _ref.isAgent,
profileCardAction = _ref.profileCardAction,
hasError = _ref.hasError,
errorType = _ref.errorType,
agentActions = _ref.agentActions,
isRenderedInPortal = _ref.isRenderedInPortal,
addFlag = _ref.addFlag,
hideAgentMoreActions = _ref.hideAgentMoreActions,
hideAiDisclaimer = _ref.hideAiDisclaimer;
if (isAgent) {
return /*#__PURE__*/_react.default.createElement(_AgentProfileCardResourced.AgentProfileCardResourced, {
accountId: userId,
cloudId: cloudId,
resourceClient: resourceClient,
trigger: trigger,
onChatClick: agentActions === null || agentActions === void 0 ? void 0 : agentActions.onChatClick,
onConversationStartersClick: agentActions === null || agentActions === void 0 ? void 0 : agentActions.onConversationStartersClick,
addFlag: addFlag,
hideMoreActions: (0, _platformFeatureFlags.fg)('jira_ai_profilecard_hide_agent_actions') && !!hideAgentMoreActions,
hideConversationStarters: (0, _platformFeatureFlags.fg)('jira_ai_hide_conversation_starters_profilecard') && !!profilecardProps.hideAgentConversationStarters,
hideAiDisclaimer: hideAiDisclaimer
});
} else {
return /*#__PURE__*/_react.default.createElement(_react.Suspense, {
fallback: null
}, /*#__PURE__*/_react.default.createElement(_lazyProfileCard.ProfileCardLazy, (0, _extends2.default)({}, profilecardProps, {
isRenderedInPortal: isRenderedInPortal,
actions: profileCardAction,
hasError: hasError,
errorType: errorType,
withoutElevation: true
})));
}
}
function ProfilecardTriggerNext(_ref2) {
var autoFocus = _ref2.autoFocus,
_ref2$trigger = _ref2.trigger,
trigger = _ref2$trigger === void 0 ? 'hover' : _ref2$trigger,
userId = _ref2.userId,
cloudId = _ref2.cloudId,
resourceClient = _ref2.resourceClient,
_ref2$actions = _ref2.actions,
actions = _ref2$actions === void 0 ? [] : _ref2$actions,
_ref2$position = _ref2.position,
position = _ref2$position === void 0 ? 'bottom-start' : _ref2$position,
children = _ref2.children,
testId = _ref2.testId,
addFlag = _ref2.addFlag,
onReportingLinesClick = _ref2.onReportingLinesClick,
ariaLabel = _ref2.ariaLabel,
ariaLabelledBy = _ref2.ariaLabelledBy,
prepopulatedData = _ref2.prepopulatedData,
disabledAriaAttributes = _ref2.disabledAriaAttributes,
onVisibilityChange = _ref2.onVisibilityChange,
offset = _ref2.offset,
viewingUserId = _ref2.viewingUserId,
product = _ref2.product,
agentActions = _ref2.agentActions,
hideAgentMoreActions = _ref2.hideAgentMoreActions,
hideAiDisclaimer = _ref2.hideAiDisclaimer,
hideAgentConversationStarters = _ref2.hideAgentConversationStarters,
hideReportingLines = _ref2.hideReportingLines,
_ref2$ariaHideProfile = _ref2.ariaHideProfileTrigger,
ariaHideProfileTrigger = _ref2$ariaHideProfile === void 0 ? false : _ref2$ariaHideProfile,
propsIsVisible = _ref2.isVisible,
isRenderedInPortal = _ref2.isRenderedInPortal,
ssrPlaceholderId = _ref2.ssrPlaceholderId,
customShowDelay = _ref2.showDelay,
customHideDelay = _ref2.hideDelay;
var _useIntl = (0, _reactIntlNext.useIntl)(),
formatMessage = _useIntl.formatMessage;
var isMounted = (0, _react.useRef)(false);
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
visible = _useState2[0],
setVisible = _useState2[1];
var showTimer = (0, _react.useRef)(0);
var hideTimer = (0, _react.useRef)(0);
var isExternalControl = propsIsVisible !== undefined && propsIsVisible !== visible;
var showDelay = trigger === 'click' || isExternalControl && (0, _platformFeatureFlags.fg)('fix_profilecard_trigger_isvisible') ? 0 : customShowDelay !== null && customShowDelay !== void 0 ? customShowDelay : _config.DELAY_MS_SHOW;
var hideDelay = trigger === 'click' || isExternalControl && (0, _platformFeatureFlags.fg)('fix_profilecard_trigger_isvisible') ? 0 : customHideDelay !== null && customHideDelay !== void 0 ? customHideDelay : _config.DELAY_MS_HIDE;
var _useState3 = (0, _react.useState)(undefined),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
isLoading = _useState4[0],
setIsLoading = _useState4[1];
var _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
hasError = _useState6[0],
setHasError = _useState6[1];
var _useState7 = (0, _react.useState)(null),
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
error = _useState8[0],
setError = _useState8[1];
var _useState9 = (0, _react.useState)(null),
_useState0 = (0, _slicedToArray2.default)(_useState9, 2),
data = _useState0[0],
setData = _useState0[1];
var _useState1 = (0, _react.useState)(undefined),
_useState10 = (0, _slicedToArray2.default)(_useState1, 2),
reportingLinesData = _useState10[0],
setReportingLinesData = _useState10[1];
var _useState11 = (0, _react.useState)(false),
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
shouldShowGiveKudos = _useState12[0],
setShouldShowGiveKudos = _useState12[1];
var _useState13 = (0, _react.useState)(undefined),
_useState14 = (0, _slicedToArray2.default)(_useState13, 2),
teamCentralBaseUrl = _useState14[0],
setTeamCentralBaseUrl = _useState14[1];
var _useState15 = (0, _react.useState)(false),
_useState16 = (0, _slicedToArray2.default)(_useState15, 2),
kudosDrawerOpen = _useState16[0],
setKudosDrawerOpen = _useState16[1];
var _useState17 = (0, _react.useState)(false),
_useState18 = (0, _slicedToArray2.default)(_useState17, 2),
isTriggeredUsingKeyboard = _useState18[0],
setTriggeredUsingKeyboard = _useState18[1];
var triggerRef = (0, _react.useRef)(null);
var _useAnalyticsEvents = (0, _teamsAppInternalAnalytics.useAnalyticsEvents)(),
fireEvent = _useAnalyticsEvents.fireEvent;
(0, _react.useEffect)(function () {
isMounted.current = true;
return function () {
isMounted.current = false;
clearTimeout(showTimer.current);
clearTimeout(hideTimer.current);
};
}, []);
(0, _react.useEffect)(function () {
// Reset state when the userId changes
setIsLoading(undefined);
setHasError(false);
setError(null);
setData(null);
setReportingLinesData(undefined);
setShouldShowGiveKudos(false);
setTeamCentralBaseUrl(undefined);
}, [userId]);
var fireAnalytics = (0, _react.useCallback)(function (eventKey) {
if (!isMounted.current) {
return;
}
for (var _len = arguments.length, attributes = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
attributes[_key - 1] = arguments[_key];
}
fireEvent.apply(void 0, [eventKey].concat(attributes));
}, [fireEvent]);
var hideProfilecard = (0, _react.useCallback)(function () {
clearTimeout(showTimer.current);
clearTimeout(hideTimer.current);
if (!isTriggeredUsingKeyboard) {
hideTimer.current = window.setTimeout(function () {
setVisible(false);
onVisibilityChange && onVisibilityChange(false);
}, hideDelay);
}
}, [hideDelay, isTriggeredUsingKeyboard, onVisibilityChange]);
var handleKeyboardClose = (0, _react.useCallback)(function (event) {
if (event.key && event.key !== 'Escape') {
return;
}
if (triggerRef.current) {
triggerRef.current.focus();
}
setTriggeredUsingKeyboard(false);
setVisible(false);
onVisibilityChange && onVisibilityChange(false);
}, [setTriggeredUsingKeyboard, setVisible, onVisibilityChange]);
var handleClientSuccess = (0, _react.useCallback)(function (profileData, reportingLinesData, shouldShowGiveKudos, teamCentralBaseUrl) {
if (!isMounted.current) {
return;
}
setIsLoading(false);
setHasError(false);
setData(profileData);
setReportingLinesData(reportingLinesData);
setTeamCentralBaseUrl(teamCentralBaseUrl);
setShouldShowGiveKudos(shouldShowGiveKudos);
}, [setHasError, setIsLoading, setData, setReportingLinesData, setShouldShowGiveKudos]);
var handleClientError = (0, _react.useCallback)(function (err) {
if (!isMounted.current) {
return;
}
setIsLoading(false);
setHasError(true);
setError(err);
}, [setHasError, setIsLoading, setError]);
var clientFetchProfile = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var shouldHideReportingLines, requests, responses;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(isLoading === true)) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
setIsLoading(true);
setHasError(false);
setError(null);
setData(null);
_context.prev = 6;
shouldHideReportingLines = (0, _platformFeatureFlags.fg)('jira_ai_profilecard_hide_reportinglines') && hideReportingLines;
requests = Promise.all([resourceClient.getProfile(cloudId || '', userId, fireAnalytics), shouldHideReportingLines ? Promise.resolve({
managers: [],
reports: []
}) : resourceClient.getReportingLines(userId), resourceClient.shouldShowGiveKudos(), resourceClient.getTeamCentralBaseUrl({
withOrgContext: true,
withSiteContext: true
})]);
_context.next = 11;
return requests;
case 11:
responses = _context.sent;
handleClientSuccess.apply(void 0, (0, _toConsumableArray2.default)(responses));
_context.next = 18;
break;
case 15:
_context.prev = 15;
_context.t0 = _context["catch"](6);
handleClientError(_context.t0);
case 18:
case "end":
return _context.stop();
}
}, _callee, null, [[6, 15]]);
})), [cloudId, fireAnalytics, isLoading, resourceClient, userId, handleClientSuccess, handleClientError, hideReportingLines]);
var showProfilecard = (0, _react.useCallback)(function () {
clearTimeout(hideTimer.current);
clearTimeout(showTimer.current);
showTimer.current = window.setTimeout(function () {
if (!visible) {
void clientFetchProfile();
setVisible(true);
onVisibilityChange && onVisibilityChange(true);
}
}, showDelay);
}, [showDelay, visible, clientFetchProfile, onVisibilityChange]);
var onClick = (0, _react.useCallback)(function (event) {
// If the user clicks on the trigger then we don't want that click event to
// propagate out to parent containers. For example when clicking a mention
// lozenge in an inline-edit.
event.stopPropagation();
showProfilecard();
if (!visible) {
fireAnalytics('ui.profilecard.triggered', _objectSpread({
method: 'click',
firedAt: Math.round((0, _performance.getPageTime)())
}, _analytics.PACKAGE_META_DATA));
}
}, [fireAnalytics, showProfilecard, visible]);
var onMouseEnter = (0, _react.useCallback)(function () {
showProfilecard();
if (!visible) {
fireAnalytics('ui.profilecard.triggered', _objectSpread({
method: 'hover',
firedAt: Math.round((0, _performance.getPageTime)())
}, _analytics.PACKAGE_META_DATA));
}
}, [fireAnalytics, showProfilecard, visible]);
var onKeyPress = (0, _react.useCallback)(function (event) {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
setTriggeredUsingKeyboard(true);
showProfilecard();
if (!visible) {
fireAnalytics('ui.profilecard.triggered', _objectSpread({
method: 'click',
firedAt: Math.round((0, _performance.getPageTime)())
}, _analytics.PACKAGE_META_DATA));
}
}
}, [fireAnalytics, showProfilecard, visible]);
var onFocus = (0, _react.useCallback)(function () {
showProfilecard();
}, [showProfilecard]);
(0, _react.useEffect)(function () {
if (!(0, _platformFeatureFlags.fg)('fix_profilecard_trigger_isvisible')) {
return;
}
// If the prop isVisible is not defined, we don't want to do anything
if (propsIsVisible === undefined) {
return;
}
// If the prop isVisible is defined, we want to show or hide the profile card based on the value
if (propsIsVisible) {
showProfilecard();
} else {
hideProfilecard();
}
}, [hideProfilecard, propsIsVisible, showProfilecard]);
var containerListeners = (0, _react.useMemo)(function () {
return trigger === 'hover' ? {
onMouseEnter: onMouseEnter,
onMouseLeave: hideProfilecard,
onBlur: hideProfilecard,
onKeyPress: onKeyPress
} : {
onClick: onClick,
onKeyPress: onKeyPress
};
}, [hideProfilecard, onClick, onKeyPress, onMouseEnter, trigger]);
var filterActions = (0, _react.useCallback)(function () {
return (0, _filterActions.default)(actions, data);
}, [actions, data]);
var openKudosDrawer = function openKudosDrawer() {
hideProfilecard();
setKudosDrawerOpen(true);
};
var closeKudosDrawer = function closeKudosDrawer() {
setKudosDrawerOpen(false);
};
var showLoading = isLoading === true || isLoading === undefined;
var wrapperProps = (0, _react.useMemo)(function () {
return trigger === 'hover' ? {
onMouseEnter: onMouseEnter,
onMouseLeave: hideProfilecard,
onFocus: onFocus
} : {};
}, [hideProfilecard, onFocus, onMouseEnter, trigger]);
var profilecardProps = _objectSpread(_objectSpread({
userId: userId,
fullName: prepopulatedData === null || prepopulatedData === void 0 ? void 0 : prepopulatedData.fullName,
isCurrentUser: userId === viewingUserId,
clientFetchProfile: clientFetchProfile
}, data), {}, {
reportingLines: reportingLinesData,
onReportingLinesClick: onReportingLinesClick,
isKudosEnabled: shouldShowGiveKudos,
teamCentralBaseUrl: teamCentralBaseUrl,
cloudId: cloudId,
openKudosDrawer: openKudosDrawer,
isTriggeredUsingKeyboard: isTriggeredUsingKeyboard,
disabledAriaAttributes: disabledAriaAttributes,
hideReportingLines: (0, _platformFeatureFlags.fg)('jira_ai_profilecard_hide_reportinglines') && hideReportingLines,
hideAgentConversationStarters: (0, _platformFeatureFlags.fg)('jira_ai_hide_conversation_starters_profilecard') && hideAgentConversationStarters
});
var ssrPlaceholderProp = ssrPlaceholderId ? {
'data-ssr-placeholder-replace': ssrPlaceholderId
} : {};
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_popup.default, {
isOpen: !!visible,
onClose: function onClose(event) {
hideProfilecard();
handleKeyboardClose(event);
},
placement: position,
offset: offset !== null && offset !== void 0 ? offset : [0, 8],
content: function content() {
return /*#__PURE__*/_react.default.createElement("div", wrapperProps, showLoading ? /*#__PURE__*/_react.default.createElement(LoadingView, {
fireAnalytics: fireAnalytics
}) : visible && /*#__PURE__*/_react.default.createElement(ProfileCardContent, {
profilecardProps: profilecardProps,
isAgent: !!(data !== null && data !== void 0 && data.isAgent),
userId: userId,
cloudId: cloudId,
resourceClient: resourceClient,
viewingUserId: viewingUserId,
trigger: trigger,
product: product,
profileCardAction: filterActions(),
errorType: error,
hasError: hasError,
agentActions: agentActions,
addFlag: addFlag,
hideAgentMoreActions: hideAgentMoreActions,
hideAiDisclaimer: hideAiDisclaimer,
isRenderedInPortal: isRenderedInPortal
}));
},
trigger: function trigger(triggerProps) {
var callbackRef = triggerProps.ref,
innerProps = (0, _objectWithoutProperties2.default)(triggerProps, _excluded);
var ref = function ref(element) {
triggerRef.current = element;
if (typeof callbackRef === 'function') {
callbackRef(element);
}
};
var _ = innerProps['aria-expanded'],
__ = innerProps['aria-haspopup'],
restInnerProps = (0, _objectWithoutProperties2.default)(innerProps, _excluded2);
return /*#__PURE__*/_react.default.createElement("span", (0, _extends2.default)({}, disabledAriaAttributes ? restInnerProps : triggerProps, containerListeners, {
ref: ref,
"data-testid": testId
}, !ariaHideProfileTrigger && {
'aria-labelledby': ariaLabelledBy
}, disabledAriaAttributes ? {} : {
role: 'button',
// aria-hidden cannot contain focusable elements: https://dequeuniversity.com/rules/axe/3.5/aria-hidden-focus
tabIndex: ariaHideProfileTrigger ? -1 : 0,
'aria-label': ariaHideProfileTrigger ? undefined : (0, _getLabelMessage.default)(ariaLabel, profilecardProps.fullName, formatMessage)
}, ariaHideProfileTrigger && {
'aria-hidden': 'true'
}, ssrPlaceholderProp), children);
},
zIndex: _constants.layers.modal(),
shouldUseCaptureOnOutsideClick: true,
autoFocus: (0, _expValEquals.expValEquals)('editor_a11y_7152_profile_card_tab_order', 'isEnabled', true) ? isRenderedInPortal && isTriggeredUsingKeyboard ? false : autoFocus !== null && autoFocus !== void 0 ? autoFocus : trigger === 'click' : autoFocus !== null && autoFocus !== void 0 ? autoFocus : trigger === 'click'
// This feature gate is currently enabled only for Jira_Web to avoid UI issues in Confluence_Web.
,
shouldRenderToParent: (0, _platformFeatureFlags.fg)('enable_appropriate_reading_order_in_profile_card'),
shouldDisableFocusLock: (0, _platformFeatureFlags.fg)('enable_appropriate_reading_order_in_profile_card')
}), shouldShowGiveKudos && teamCentralBaseUrl && /*#__PURE__*/_react.default.createElement(_react.Suspense, {
fallback: null
}, /*#__PURE__*/_react.default.createElement(_giveKudos.GiveKudosLauncherLazy, {
isOpen: kudosDrawerOpen,
recipient: {
type: _giveKudos.KudosType.INDIVIDUAL,
recipientId: userId
},
analyticsSource: "profile-card",
teamCentralBaseUrl: teamCentralBaseUrl,
cloudId: cloudId,
addFlag: addFlag,
onClose: closeKudosDrawer
})));
}
var LoadingView = function LoadingView(_ref4) {
var fireAnalytics = _ref4.fireAnalytics;
return /*#__PURE__*/_react.default.createElement(_UserTrigger.CardWrapper, {
testId: "profilecard.profilecardtrigger.loading"
}, /*#__PURE__*/_react.default.createElement(_UserLoadingState.default, {
fireAnalytics: fireAnalytics
}));
};