UNPKG

@atlaskit/profilecard

Version:

A React component to display a card with user information.

454 lines (451 loc) 20.6 kB
"use strict"; 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);