@atlaskit/profilecard
Version:
A React component to display a card with user information.
454 lines (451 loc) • 20.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.TeamProfileCardTriggerInternal = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
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 _compiled = require("@atlaskit/primitives/compiled");
var _teamsAppInternalAnalytics = require("@atlaskit/teams-app-internal-analytics");
var _constants = require("@atlaskit/theme/constants");
var _filterActions2 = _interopRequireDefault(require("../../internal/filterActions"));
var _messages = _interopRequireDefault(require("../../messages"));
var _analytics = require("../../util/analytics");
var _click = require("../../util/click");
var _config = require("../../util/config");
var _performance = require("../../util/performance");
var _Error = require("../Error");
var _lazyTeamProfileCard = require("./lazyTeamProfileCard");
var _TeamLoadingState = _interopRequireDefault(require("./TeamLoadingState"));
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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var TeamProfileCardTriggerInternal = exports.TeamProfileCardTriggerInternal = /*#__PURE__*/function (_React$PureComponent) {
function TeamProfileCardTriggerInternal() {
var _this;
(0, _classCallCheck2.default)(this, TeamProfileCardTriggerInternal);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, TeamProfileCardTriggerInternal, [].concat(args));
(0, _defineProperty2.default)(_this, "_isMounted", false);
(0, _defineProperty2.default)(_this, "showTimer", 0);
(0, _defineProperty2.default)(_this, "hideTimer", 0);
(0, _defineProperty2.default)(_this, "openedByHover", false);
(0, _defineProperty2.default)(_this, "openTime", 0);
(0, _defineProperty2.default)(_this, "fireAnalytics", function (eventKey) {
// Don't fire any analytics if the component is unmounted
if (!_this._isMounted) {
return;
}
if (_this.props.fireEvent) {
var _this$props;
for (var _len2 = arguments.length, attributes = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
attributes[_key2 - 1] = arguments[_key2];
}
(_this$props = _this.props).fireEvent.apply(_this$props, [eventKey].concat(attributes));
}
});
(0, _defineProperty2.default)(_this, "fireAnalyticsWithDuration", function (eventKey, generator) {
var duration = (0, _performance.getPageTime)() - _this.openTime;
var attributes = generator(duration);
_this.fireAnalytics(eventKey, attributes);
});
(0, _defineProperty2.default)(_this, "hideProfilecard", function () {
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
clearTimeout(_this.showTimer);
clearTimeout(_this.hideTimer);
_this.hideTimer = window.setTimeout(function () {
_this.setState({
visible: false
});
}, delay);
});
(0, _defineProperty2.default)(_this, "showProfilecard", function () {
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
clearTimeout(_this.hideTimer);
clearTimeout(_this.showTimer);
_this.showTimer = window.setTimeout(function () {
if (!_this.state.visible) {
_this.clientFetchProfile();
_this.openTime = (0, _performance.getPageTime)();
_this.setState({
visible: true
});
}
}, delay);
});
(0, _defineProperty2.default)(_this, "onClick", function (event) {
if (_this.props.triggerLinkType === 'link') {
// We want to prevent navigation occurring on basic click, but it's important that
// cmd+click, ctrl+click, etc. still work as expected.
if ((0, _click.isBasicClick)(event)) {
event.preventDefault();
}
}
if (_this.props.triggerLinkType === 'clickable-link') {
if (_this.props.viewProfileOnClick) {
_this.props.viewProfileOnClick(event);
}
}
if (_this.props.trigger !== 'hover') {
_this.openedByHover = false;
_this.showProfilecard(0);
if (!_this.state.visible) {
_this.fireAnalytics('ui.teamProfileCard.triggered', _objectSpread(_objectSpread({
method: 'click'
}, _analytics.PACKAGE_META_DATA), {}, {
firedAt: Math.round((0, _performance.getPageTime)()),
teamId: _this.props.teamId
}));
}
}
});
(0, _defineProperty2.default)(_this, "onMouseEnter", function () {
if (_this.props.trigger === 'click') {
return;
}
if (!_this.state.visible) {
_this.openedByHover = true;
_this.fireAnalytics('ui.teamProfileCard.triggered', _objectSpread(_objectSpread({
method: 'hover'
}, _analytics.PACKAGE_META_DATA), {}, {
firedAt: Math.round((0, _performance.getPageTime)()),
teamId: _this.props.teamId
}));
}
_this.showProfilecard(_config.DELAY_MS_SHOW);
});
(0, _defineProperty2.default)(_this, "onMouseLeave", function () {
if (_this.props.trigger === 'click') {
return;
}
if (_this.openedByHover) {
_this.hideProfilecard(_config.DELAY_MS_HIDE);
}
});
(0, _defineProperty2.default)(_this, "onKeyPress", function (event) {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
_this.setState({
isTriggeredByKeyboard: true
});
_this.showProfilecard(0);
if (!_this.state.visible) {
_this.fireAnalytics('ui.teamProfileCard.triggered', _objectSpread({
method: 'click',
firedAt: Math.round((0, _performance.getPageTime)()),
teamId: _this.props.teamId
}, _analytics.PACKAGE_META_DATA));
}
}
});
(0, _defineProperty2.default)(_this, "onClose", function () {
_this.hideProfilecard();
_this.setState({
isTriggeredByKeyboard: false
});
});
(0, _defineProperty2.default)(_this, "openKudosDrawer", function () {
_this.hideProfilecard(_config.DELAY_MS_HIDE);
_this.setState({
kudosDrawerOpen: true
});
});
(0, _defineProperty2.default)(_this, "closeKudosDrawer", function () {
_this.setState({
kudosDrawerOpen: false
});
});
(0, _defineProperty2.default)(_this, "kudosUrl", function () {
var recipientId = _this.props.teamId && "&recipientId=".concat(_this.props.teamId) || '';
var cloudId = _this.props.cloudId && "&cloudId=".concat(_this.props.cloudId) || '';
return "".concat(_this.state.teamCentralBaseUrl, "/kudos/give?type=team").concat(recipientId).concat(cloudId);
});
(0, _defineProperty2.default)(_this, "stopPropagation", function (event) {
// We need to stop propagation when users click on the card, so that it
// doesn't trigger any special effects that occur when clicking the trigger.
event.stopPropagation();
});
(0, _defineProperty2.default)(_this, "triggerListeners", {
onClick: _this.onClick,
onMouseEnter: _this.onMouseEnter,
onMouseLeave: _this.onMouseLeave
});
(0, _defineProperty2.default)(_this, "cardListeners", {
onClick: _this.stopPropagation,
onMouseEnter: _this.onMouseEnter,
onMouseLeave: _this.onMouseLeave
});
(0, _defineProperty2.default)(_this, "state", {
visible: false,
isLoading: undefined,
hasError: false,
error: null,
data: null,
shouldShowGiveKudos: false,
teamCentralBaseUrl: undefined,
kudosDrawerOpen: false,
isTriggeredByKeyboard: false
});
(0, _defineProperty2.default)(_this, "clientFetchProfile", function () {
var _this$props2 = _this.props,
orgId = _this$props2.orgId,
teamId = _this$props2.teamId;
var isLoading = _this.state.isLoading;
if (isLoading === true) {
// don't fetch data when fetching is in process
return;
}
_this.setState({
isLoading: true,
data: null
}, function () {
var requests = Promise.all([_this.props.resourceClient.getTeamProfile(teamId, orgId, _this.fireAnalytics), _this.props.resourceClient.shouldShowGiveKudos(), _this.props.resourceClient.getTeamCentralBaseUrl({
withOrgContext: true,
withSiteContext: true
})]);
requests.then(function (res) {
var _this2;
return (_this2 = _this).handleClientSuccess.apply(_this2, (0, _toConsumableArray2.default)(res));
}, function (err) {
return _this.handleClientError(err);
}).catch(function (err) {
return _this.handleClientError(err);
});
});
});
(0, _defineProperty2.default)(_this, "onErrorBoundary", function () {
_this.fireAnalytics('ui.teamProfileCard.rendered.errorBoundary', _objectSpread(_objectSpread({}, _analytics.PACKAGE_META_DATA), {}, {
firedAt: Math.round((0, _performance.getPageTime)()),
duration: 0
}));
_this.setState({
renderError: true
});
});
(0, _defineProperty2.default)(_this, "renderProfileCard", function () {
var _this$props3 = _this.props,
generateUserLink = _this$props3.generateUserLink,
onUserClick = _this$props3.onUserClick,
viewingUserId = _this$props3.viewingUserId,
viewProfileLink = _this$props3.viewProfileLink,
viewProfileOnClick = _this$props3.viewProfileOnClick;
var _this$state = _this.state,
data = _this$state.data,
error = _this$state.error,
hasError = _this$state.hasError,
isLoading = _this$state.isLoading;
var newProps = {
clientFetchProfile: _this.clientFetchProfile,
actions: _this.filterActions(),
analytics: _this.fireAnalyticsWithDuration,
team: data || undefined,
generateUserLink: generateUserLink,
onUserClick: onUserClick,
viewingUserId: viewingUserId,
viewProfileLink: viewProfileLink,
viewProfileOnClick: viewProfileOnClick
};
return /*#__PURE__*/_react.default.createElement("div", _this.cardListeners, _this.state.visible && /*#__PURE__*/_react.default.createElement(_react.Suspense, {
fallback: /*#__PURE__*/_react.default.createElement(_TeamLoadingState.default, {
analytics: _this.fireAnalyticsWithDuration
})
}, /*#__PURE__*/_react.default.createElement(_lazyTeamProfileCard.TeamProfileCardLazy, (0, _extends2.default)({}, newProps, {
isLoading: isLoading,
hasError: hasError,
errorType: error,
isTriggeredByKeyboard: _this.state.isTriggeredByKeyboard
}))));
});
(0, _defineProperty2.default)(_this, "renderKudosLauncher", function () {
return _this.state.shouldShowGiveKudos && /*#__PURE__*/_react.default.createElement(_react.Suspense, {
fallback: null
}, /*#__PURE__*/_react.default.createElement(_giveKudos.GiveKudosLauncherLazy, {
isOpen: _this.state.kudosDrawerOpen,
recipient: {
type: _giveKudos.KudosType.TEAM,
recipientId: _this.props.teamId
},
analyticsSource: "team-profile-card",
teamCentralBaseUrl: _this.state.teamCentralBaseUrl,
cloudId: _this.props.cloudId || '',
addFlag: _this.props.addFlag,
onClose: _this.closeKudosDrawer
}));
});
(0, _defineProperty2.default)(_this, "renderTrigger", function (triggerProps) {
var _this$props4 = _this.props,
children = _this$props4.children,
intl = _this$props4.intl,
triggerLinkType = _this$props4.triggerLinkType,
viewProfileLink = _this$props4.viewProfileLink;
if (triggerLinkType === 'none') {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, _this.renderKudosLauncher(), /*#__PURE__*/_react.default.createElement(_compiled.Box, (0, _extends2.default)({
as: "span",
role: "button",
testId: "team-profilecard-trigger-wrapper",
tabIndex: 0,
"aria-label": intl.formatMessage(_messages.default.teamProfileCardAriaLabel),
onKeyUp: _this.onKeyPress
}, triggerProps, _this.triggerListeners), children));
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, _this.renderKudosLauncher(), /*#__PURE__*/_react.default.createElement("a", (0, _extends2.default)({
"data-testid": "team-profilecard-trigger-wrapper"
// eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
,
style: {
color: 'initial',
textDecoration: 'none'
},
href: viewProfileLink
}, triggerProps, {
ref: triggerProps.ref
}, _this.triggerListeners), children));
});
return _this;
}
(0, _inherits2.default)(TeamProfileCardTriggerInternal, _React$PureComponent);
return (0, _createClass2.default)(TeamProfileCardTriggerInternal, [{
key: "componentDidMount",
value: function componentDidMount() {
this._isMounted = true;
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this$props5 = this.props,
orgId = _this$props5.orgId,
teamId = _this$props5.teamId,
resourceClient = _this$props5.resourceClient;
var visible = this.state.visible;
// just re-fetching data when the card opens
if (visible && (teamId !== prevProps.teamId || orgId !== prevProps.orgId || resourceClient !== prevProps.resourceClient)) {
this.setState({
isLoading: undefined
}, this.clientFetchProfile);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._isMounted = false;
clearTimeout(this.showTimer);
clearTimeout(this.hideTimer);
}
}, {
key: "handleClientSuccess",
value: function handleClientSuccess(team, shouldShowGiveKudos, teamCentralBaseUrl) {
if (!this._isMounted) {
return;
}
this.setState({
isLoading: false,
hasError: false,
data: team,
shouldShowGiveKudos: shouldShowGiveKudos,
teamCentralBaseUrl: teamCentralBaseUrl
});
}
}, {
key: "handleClientError",
value: function handleClientError(err) {
if (!this._isMounted) {
return;
}
this.setState({
isLoading: false,
hasError: true,
error: err
});
}
}, {
key: "filterActions",
value: function filterActions() {
var _this3 = this;
var actions = (0, _filterActions2.default)(this.props.actions, this.state.data);
if (this.state.shouldShowGiveKudos) {
var kudosAction = {
label: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.default.giveKudosButton),
id: 'give-kudos',
callback: function callback() {
_this3.openKudosDrawer();
},
link: this.kudosUrl()
};
return actions.concat([kudosAction]);
}
return actions;
}
}, {
key: "renderPopup",
value: function renderPopup() {
var _this4 = this;
if (this.state.renderError) {
return this.props.children;
}
return /*#__PURE__*/_react.default.createElement(_Error.ErrorBoundary, {
onError: this.onErrorBoundary
}, /*#__PURE__*/_react.default.createElement(_popup.default, {
isOpen: !!this.state.visible,
onClose: this.onClose,
placement: this.props.position,
content: this.renderProfileCard,
trigger: function trigger(triggerProps) {
return _this4.renderTrigger(triggerProps);
},
zIndex: _constants.layers.modal(),
shouldFlip: true,
autoFocus: this.props.trigger !== 'hover' && !this.openedByHover,
shouldRenderToParent: (0, _platformFeatureFlags.fg)('enable_appropriate_reading_order_in_profile_card') && this.props.shouldRenderToParent
}));
}
}, {
key: "render",
value: function render() {
if (this.props.children) {
return this.renderPopup();
} else {
throw new Error('Component "TeamProfileCardTrigger" must have "children" property');
}
}
}]);
}(_react.default.PureComponent);
(0, _defineProperty2.default)(TeamProfileCardTriggerInternal, "defaultProps", {
actions: [],
trigger: 'hover',
position: 'bottom-start',
triggerLinkType: 'link',
shouldRenderToParent: true
});
var TeamProfileCardTrigger = function TeamProfileCardTrigger(props) {
var _useAnalyticsEvents = (0, _teamsAppInternalAnalytics.useAnalyticsEvents)(),
fireEvent = _useAnalyticsEvents.fireEvent;
if ((0, _platformFeatureFlags.fg)('people-teams-deprecate-profilecard-teams')) {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children);
}
return /*#__PURE__*/_react.default.createElement(TeamProfileCardTriggerInternal, (0, _extends2.default)({}, props, {
fireEvent: fireEvent
}));
};
/**
* @deprecated This component is deprecated and provides no functionality.
* It now simply renders its children without any profile card behavior.
* Please use `@atlassian/team-profilecard` instead for team profile card functionality.
*/
var _default = exports.default = (0, _reactIntlNext.injectIntl)(TeamProfileCardTrigger);