matrix-react-sdk
Version:
SDK for matrix.org using React
663 lines (552 loc) • 85.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _MatrixClientPeg = require("../../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _actions = require("../../dispatcher/actions");
var _languageHandler = require("../../languageHandler");
var _ContextMenu = require("./ContextMenu");
var _UserSettingsDialog = require("../views/dialogs/UserSettingsDialog");
var _FeedbackDialog = _interopRequireDefault(require("../views/dialogs/FeedbackDialog"));
var _Modal = _interopRequireDefault(require("../../Modal"));
var _LogoutDialog = _interopRequireDefault(require("../views/dialogs/LogoutDialog"));
var _SettingsStore = _interopRequireDefault(require("../../settings/SettingsStore"));
var _theme = require("../../theme");
var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton"));
var _SdkConfig = _interopRequireDefault(require("../../SdkConfig"));
var _pages = require("../../utils/pages");
var _OwnProfileStore = require("../../stores/OwnProfileStore");
var _AsyncStore = require("../../stores/AsyncStore");
var _BaseAvatar = _interopRequireDefault(require("../views/avatars/BaseAvatar"));
var _AccessibleTooltipButton = _interopRequireDefault(require("../views/elements/AccessibleTooltipButton"));
var _SettingLevel = require("../../settings/SettingLevel");
var _IconizedContextMenu = _interopRequireWildcard(require("../views/context_menus/IconizedContextMenu"));
var _CommunityPrototypeStore = require("../../stores/CommunityPrototypeStore");
var _GroupFilterOrderStore = _interopRequireDefault(require("../../stores/GroupFilterOrderStore"));
var _RoomInvite = require("../../RoomInvite");
var _RightPanelStorePhases = require("../../stores/RightPanelStorePhases");
var _ErrorDialog = _interopRequireDefault(require("../views/dialogs/ErrorDialog"));
var _EditCommunityPrototypeDialog = _interopRequireDefault(require("../views/dialogs/EditCommunityPrototypeDialog"));
var _UIFeature = require("../../settings/UIFeature");
var _HostSignupAction = _interopRequireDefault(require("./HostSignupAction"));
var _SpaceStore = _interopRequireWildcard(require("../../stores/SpaceStore"));
var _RoomName = _interopRequireDefault(require("../views/elements/RoomName"));
var _replaceableComponent = require("../../utils/replaceableComponent");
var _dec, _class, _temp;
let UserMenu = (_dec = (0, _replaceableComponent.replaceableComponent)("structures.UserMenu"), _dec(_class = (_temp = class UserMenu extends _react.default.Component
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "themeWatcherRef", void 0);
(0, _defineProperty2.default)(this, "dndWatcherRef", void 0);
(0, _defineProperty2.default)(this, "buttonRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "tagStoreRef", void 0);
(0, _defineProperty2.default)(this, "onTagStoreUpdate", () => {
this.forceUpdate(); // we don't have anything useful in state to update
});
(0, _defineProperty2.default)(this, "onProfileUpdate", async () => {
// the store triggered an update, so force a layout update. We don't
// have any state to store here for that to magically happen.
this.forceUpdate();
});
(0, _defineProperty2.default)(this, "onSelectedSpaceUpdate", async (selectedSpace
/*: Room*/
) => {
this.setState({
selectedSpace
});
});
(0, _defineProperty2.default)(this, "onThemeChanged", () => {
this.setState({
isDarkTheme: this.isUserOnDarkTheme()
});
});
(0, _defineProperty2.default)(this, "onAction", (ev
/*: ActionPayload*/
) => {
if (ev.action !== _actions.Action.ToggleUserMenu) return; // not interested
if (this.state.contextMenuPosition) {
this.setState({
contextMenuPosition: null
});
} else {
if (this.buttonRef.current) this.buttonRef.current.click();
}
});
(0, _defineProperty2.default)(this, "onOpenMenuClick", (ev
/*: React.MouseEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
const target = ev.target;
this.setState({
contextMenuPosition: target.getBoundingClientRect()
});
});
(0, _defineProperty2.default)(this, "onContextMenu", (ev
/*: React.MouseEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
this.setState({
contextMenuPosition: {
left: ev.clientX,
top: ev.clientY,
width: 20,
height: 0
}
});
});
(0, _defineProperty2.default)(this, "onCloseMenu", () => {
this.setState({
contextMenuPosition: null
});
});
(0, _defineProperty2.default)(this, "onSwitchThemeClick", (ev
/*: React.MouseEvent*/
) => {
ev.preventDefault();
ev.stopPropagation(); // Disable system theme matching if the user hits this button
_SettingsStore.default.setValue("use_system_theme", null, _SettingLevel.SettingLevel.DEVICE, false);
const newTheme = this.state.isDarkTheme ? "light" : "dark";
_SettingsStore.default.setValue("theme", null, _SettingLevel.SettingLevel.DEVICE, newTheme); // set at same level as Appearance tab
});
(0, _defineProperty2.default)(this, "onSettingsOpen", (ev
/*: ButtonEvent*/
, tabId
/*: string*/
) => {
ev.preventDefault();
ev.stopPropagation();
const payload
/*: OpenToTabPayload*/
= {
action: _actions.Action.ViewUserSettings,
initialTabId: tabId
};
_dispatcher.default.dispatch(payload);
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onShowArchived", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation(); // TODO: Archived room view: https://github.com/vector-im/element-web/issues/14038
// Note: You'll need to uncomment the button too.
console.log("TODO: Show archived rooms");
});
(0, _defineProperty2.default)(this, "onProvideFeedback", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_Modal.default.createTrackedDialog('Feedback Dialog', '', _FeedbackDialog.default);
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onSignOutClick", async (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
const cli = _MatrixClientPeg.MatrixClientPeg.get();
if (!cli || !cli.isCryptoEnabled() || !(await cli.exportRoomKeys())?.length) {
// log out without user prompt if they have no local megolm sessions
_dispatcher.default.dispatch({
action: 'logout'
});
} else {
_Modal.default.createTrackedDialog('Logout from LeftPanel', '', _LogoutDialog.default);
}
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onSignInClick", () => {
_dispatcher.default.dispatch({
action: 'start_login'
});
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onRegisterClick", () => {
_dispatcher.default.dispatch({
action: 'start_registration'
});
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onHomeClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'view_home_page'
});
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onCommunitySettingsClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_Modal.default.createTrackedDialog('Edit Community', '', _EditCommunityPrototypeDialog.default, {
communityId: _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityId()
});
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onCommunityMembersClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation(); // We'd ideally just pop open a right panel with the member list, but the current
// way the right panel is structured makes this exceedingly difficult. Instead, we'll
// switch to the general room and open the member list there as it should be in sync
// anyways.
const chat = _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityGeneralChat();
if (chat) {
_dispatcher.default.dispatch({
action: 'view_room',
room_id: chat.roomId
}, true);
_dispatcher.default.dispatch({
action: _actions.Action.SetRightPanelPhase,
phase: _RightPanelStorePhases.RightPanelPhases.RoomMemberList
});
} else {
// "This should never happen" clauses go here for the prototype.
_Modal.default.createTrackedDialog('Failed to find general chat', '', _ErrorDialog.default, {
title: (0, _languageHandler._t)('Failed to find the general chat for this community'),
description: (0, _languageHandler._t)("Failed to find the general chat for this community")
});
}
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onCommunityInviteClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
(0, _RoomInvite.showCommunityInviteDialog)(_CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityId());
this.setState({
contextMenuPosition: null
}); // also close the menu
});
(0, _defineProperty2.default)(this, "onDndToggle", ev => {
ev.stopPropagation();
const current = _SettingsStore.default.getValue("doNotDisturb");
_SettingsStore.default.setValue("doNotDisturb", null, _SettingLevel.SettingLevel.DEVICE, !current);
});
(0, _defineProperty2.default)(this, "renderContextMenu", () =>
/*: React.ReactNode*/
{
if (!this.state.contextMenuPosition) return null;
const prototypeCommunityName = _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityName();
let topSection;
const hostSignupConfig
/*: IHostSignupConfig*/
= _SdkConfig.default.get().hostSignup;
if (_MatrixClientPeg.MatrixClientPeg.get().isGuest()) {
topSection = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_header mx_UserMenu_contextMenu_guestPrompts"
}, (0, _languageHandler._t)("Got an account? <a>Sign in</a>", {}, {
a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "link",
onClick: this.onSignInClick
}, sub)
}), (0, _languageHandler._t)("New here? <a>Create an account</a>", {}, {
a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "link",
onClick: this.onRegisterClick
}, sub)
}));
} else if (hostSignupConfig) {
if (hostSignupConfig && hostSignupConfig.url) {
// If hostSignup.domains is set to a non-empty array, only show
// dialog if the user is on the domain or a subdomain.
const hostSignupDomains = hostSignupConfig.domains || [];
const mxDomain = _MatrixClientPeg.MatrixClientPeg.get().getDomain();
const validDomains = hostSignupDomains.filter(d => d === mxDomain || mxDomain.endsWith(`.${d}`));
if (!hostSignupConfig.domains || validDomains.length > 0) {
topSection = /*#__PURE__*/_react.default.createElement("div", {
onClick: this.onCloseMenu
}, /*#__PURE__*/_react.default.createElement(_HostSignupAction.default, null));
}
}
}
let homeButton = null;
if (this.hasHomePage) {
homeButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconHome",
label: (0, _languageHandler._t)("Home"),
onClick: this.onHomeClick
});
}
let feedbackButton;
if (_SettingsStore.default.getValue(_UIFeature.UIFeature.Feedback)) {
feedbackButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconMessage",
label: (0, _languageHandler._t)("Feedback"),
onClick: this.onProvideFeedback
});
}
let primaryHeader = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_name"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_contextMenu_displayName"
}, _OwnProfileStore.OwnProfileStore.instance.displayName), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_contextMenu_userId"
}, _MatrixClientPeg.MatrixClientPeg.get().getUserId()));
let primaryOptionList = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, homeButton, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconBell",
label: (0, _languageHandler._t)("Notification settings"),
onClick: e => this.onSettingsOpen(e, _UserSettingsDialog.USER_NOTIFICATIONS_TAB)
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconLock",
label: (0, _languageHandler._t)("Security & privacy"),
onClick: e => this.onSettingsOpen(e, _UserSettingsDialog.USER_SECURITY_TAB)
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSettings",
label: (0, _languageHandler._t)("All settings"),
onClick: e => this.onSettingsOpen(e, null)
}), feedbackButton), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
red: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSignOut",
label: (0, _languageHandler._t)("Sign out"),
onClick: this.onSignOutClick
})));
let secondarySection = null;
if (prototypeCommunityName) {
const communityId = _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityId();
primaryHeader = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_name"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_contextMenu_displayName"
}, prototypeCommunityName));
let settingsOption;
let inviteOption;
if (_CommunityPrototypeStore.CommunityPrototypeStore.instance.canInviteTo(communityId)) {
inviteOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconInvite",
label: (0, _languageHandler._t)("Invite"),
onClick: this.onCommunityInviteClick
});
}
if (_CommunityPrototypeStore.CommunityPrototypeStore.instance.isAdminOf(communityId)) {
settingsOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSettings",
label: (0, _languageHandler._t)("Settings"),
"aria-label": (0, _languageHandler._t)("Community settings"),
onClick: this.onCommunitySettingsClick
});
}
primaryOptionList = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, settingsOption, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconMembers",
label: (0, _languageHandler._t)("Members"),
onClick: this.onCommunityMembersClick
}), inviteOption);
secondarySection = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("hr", null), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_header"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_name"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_contextMenu_displayName"
}, _OwnProfileStore.OwnProfileStore.instance.displayName), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_contextMenu_userId"
}, _MatrixClientPeg.MatrixClientPeg.get().getUserId()))), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSettings",
label: (0, _languageHandler._t)("Settings"),
"aria-label": (0, _languageHandler._t)("User settings"),
onClick: e => this.onSettingsOpen(e, null)
}), feedbackButton), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
red: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSignOut",
label: (0, _languageHandler._t)("Sign out"),
onClick: this.onSignOutClick
})));
} else if (_MatrixClientPeg.MatrixClientPeg.get().isGuest()) {
primaryOptionList = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, homeButton, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_UserMenu_iconSettings",
label: (0, _languageHandler._t)("Settings"),
onClick: e => this.onSettingsOpen(e, null)
}), feedbackButton));
}
const classes = (0, _classnames.default)({
"mx_UserMenu_contextMenu": true,
"mx_UserMenu_contextMenu_prototype": !!prototypeCommunityName
});
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default // numerical adjustments to overlap the context menu by just over the width of the
// menu icon and make it look connected
, {
left: this.state.contextMenuPosition.width + this.state.contextMenuPosition.left - 10,
top: this.state.contextMenuPosition.top + this.state.contextMenuPosition.height + 8,
onFinished: this.onCloseMenu,
className: classes
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_contextMenu_header"
}, primaryHeader, /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, {
className: "mx_UserMenu_contextMenu_themeButton",
onClick: this.onSwitchThemeClick,
title: this.state.isDarkTheme ? (0, _languageHandler._t)("Switch to light mode") : (0, _languageHandler._t)("Switch to dark mode")
}, /*#__PURE__*/_react.default.createElement("img", {
src: require("../../../res/img/element-icons/roomlist/dark-light-mode.svg"),
alt: (0, _languageHandler._t)("Switch theme"),
width: 16
}))), topSection, primaryOptionList, secondarySection);
});
this.state = {
contextMenuPosition: null,
isDarkTheme: this.isUserOnDarkTheme()
};
_OwnProfileStore.OwnProfileStore.instance.on(_AsyncStore.UPDATE_EVENT, this.onProfileUpdate);
if (_SettingsStore.default.getValue("feature_spaces")) {
_SpaceStore.default.instance.on(_SpaceStore.UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate);
} // Force update is the easiest way to trigger the UI update (we don't store state for this)
this.dndWatcherRef = _SettingsStore.default.watchSetting("doNotDisturb", null, () => this.forceUpdate());
}
get hasHomePage()
/*: boolean*/
{
return !!(0, _pages.getHomePageUrl)(_SdkConfig.default.get());
}
componentDidMount() {
this.dispatcherRef = _dispatcher.default.register(this.onAction);
this.themeWatcherRef = _SettingsStore.default.watchSetting("theme", null, this.onThemeChanged);
this.tagStoreRef = _GroupFilterOrderStore.default.addListener(this.onTagStoreUpdate);
}
componentWillUnmount() {
if (this.themeWatcherRef) _SettingsStore.default.unwatchSetting(this.themeWatcherRef);
if (this.dndWatcherRef) _SettingsStore.default.unwatchSetting(this.dndWatcherRef);
if (this.dispatcherRef) _dispatcher.default.unregister(this.dispatcherRef);
_OwnProfileStore.OwnProfileStore.instance.off(_AsyncStore.UPDATE_EVENT, this.onProfileUpdate);
this.tagStoreRef.remove();
if (_SettingsStore.default.getValue("feature_spaces")) {
_SpaceStore.default.instance.off(_SpaceStore.UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate);
}
}
isUserOnDarkTheme()
/*: boolean*/
{
if (_SettingsStore.default.getValue("use_system_theme")) {
return window.matchMedia("(prefers-color-scheme: dark)").matches;
} else {
const theme = _SettingsStore.default.getValue("theme");
if (theme.startsWith("custom-")) {
return (0, _theme.getCustomTheme)(theme.substring("custom-".length)).is_dark;
}
return theme === "dark";
}
}
render() {
const avatarSize = 32; // should match border-radius of the avatar
const userId = _MatrixClientPeg.MatrixClientPeg.get().getUserId();
const displayName = _OwnProfileStore.OwnProfileStore.instance.displayName || userId;
const avatarUrl = _OwnProfileStore.OwnProfileStore.instance.getHttpAvatarUrl(avatarSize);
const prototypeCommunityName = _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityName();
let isPrototype = false;
let menuName = (0, _languageHandler._t)("User menu");
let name = /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_userName"
}, displayName);
let buttons = /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_headerButtons"
});
let dnd;
if (this.state.selectedSpace) {
name = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_doubleName"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_userName"
}, displayName), /*#__PURE__*/_react.default.createElement(_RoomName.default, {
room: this.state.selectedSpace
}, roomName => /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_subUserName"
}, roomName)));
} else if (prototypeCommunityName) {
name = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_doubleName"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_userName"
}, prototypeCommunityName), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_subUserName"
}, displayName));
menuName = (0, _languageHandler._t)("Community and user menu");
isPrototype = true;
} else if (_SettingsStore.default.getValue("feature_communities_v2_prototypes")) {
name = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_doubleName"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_userName"
}, (0, _languageHandler._t)("Home")), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_subUserName"
}, displayName));
isPrototype = true;
} else if (_SettingsStore.default.getValue("feature_dnd")) {
const isDnd = _SettingsStore.default.getValue("doNotDisturb");
dnd = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onDndToggle,
className: (0, _classnames.default)({
"mx_UserMenu_dnd": true,
"mx_UserMenu_dnd_noisy": !isDnd,
"mx_UserMenu_dnd_muted": isDnd
})
});
}
if (this.props.isMinimized) {
name = null;
buttons = null;
}
const classes = (0, _classnames.default)({
'mx_UserMenu': true,
'mx_UserMenu_minimized': this.props.isMinimized,
'mx_UserMenu_prototype': isPrototype
});
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuButton, {
className: classes,
onClick: this.onOpenMenuClick,
inputRef: this.buttonRef,
label: menuName,
isExpanded: !!this.state.contextMenuPosition,
onContextMenu: this.onContextMenu
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_UserMenu_row"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_UserMenu_userAvatarContainer"
}, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, {
idName: userId,
name: displayName,
url: avatarUrl,
width: avatarSize,
height: avatarSize,
resizeMethod: "crop",
className: "mx_UserMenu_userAvatar"
})), name, dnd, buttons)), this.renderContextMenu());
}
}, _temp)) || _class);
exports.default = UserMenu;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvVXNlck1lbnUudHN4Il0sIm5hbWVzIjpbIlVzZXJNZW51IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiZm9yY2VVcGRhdGUiLCJzZWxlY3RlZFNwYWNlIiwic2V0U3RhdGUiLCJpc0RhcmtUaGVtZSIsImlzVXNlck9uRGFya1RoZW1lIiwiZXYiLCJhY3Rpb24iLCJBY3Rpb24iLCJUb2dnbGVVc2VyTWVudSIsInN0YXRlIiwiY29udGV4dE1lbnVQb3NpdGlvbiIsImJ1dHRvblJlZiIsImN1cnJlbnQiLCJjbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGVmdCIsImNsaWVudFgiLCJ0b3AiLCJjbGllbnRZIiwid2lkdGgiLCJoZWlnaHQiLCJTZXR0aW5nc1N0b3JlIiwic2V0VmFsdWUiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJuZXdUaGVtZSIsInRhYklkIiwicGF5bG9hZCIsIlZpZXdVc2VyU2V0dGluZ3MiLCJpbml0aWFsVGFiSWQiLCJkZWZhdWx0RGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiY29uc29sZSIsImxvZyIsIk1vZGFsIiwiY3JlYXRlVHJhY2tlZERpYWxvZyIsIkZlZWRiYWNrRGlhbG9nIiwiY2xpIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiaXNDcnlwdG9FbmFibGVkIiwiZXhwb3J0Um9vbUtleXMiLCJsZW5ndGgiLCJkaXMiLCJMb2dvdXREaWFsb2ciLCJFZGl0Q29tbXVuaXR5UHJvdG90eXBlRGlhbG9nIiwiY29tbXVuaXR5SWQiLCJDb21tdW5pdHlQcm90b3R5cGVTdG9yZSIsImluc3RhbmNlIiwiZ2V0U2VsZWN0ZWRDb21tdW5pdHlJZCIsImNoYXQiLCJnZXRTZWxlY3RlZENvbW11bml0eUdlbmVyYWxDaGF0Iiwicm9vbV9pZCIsInJvb21JZCIsIlNldFJpZ2h0UGFuZWxQaGFzZSIsInBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsIlJvb21NZW1iZXJMaXN0IiwiRXJyb3JEaWFsb2ciLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiZ2V0VmFsdWUiLCJwcm90b3R5cGVDb21tdW5pdHlOYW1lIiwiZ2V0U2VsZWN0ZWRDb21tdW5pdHlOYW1lIiwidG9wU2VjdGlvbiIsImhvc3RTaWdudXBDb25maWciLCJTZGtDb25maWciLCJob3N0U2lnbnVwIiwiaXNHdWVzdCIsImEiLCJzdWIiLCJvblNpZ25JbkNsaWNrIiwib25SZWdpc3RlckNsaWNrIiwidXJsIiwiaG9zdFNpZ251cERvbWFpbnMiLCJkb21haW5zIiwibXhEb21haW4iLCJnZXREb21haW4iLCJ2YWxpZERvbWFpbnMiLCJmaWx0ZXIiLCJkIiwiZW5kc1dpdGgiLCJvbkNsb3NlTWVudSIsImhvbWVCdXR0b24iLCJoYXNIb21lUGFnZSIsIm9uSG9tZUNsaWNrIiwiZmVlZGJhY2tCdXR0b24iLCJVSUZlYXR1cmUiLCJGZWVkYmFjayIsIm9uUHJvdmlkZUZlZWRiYWNrIiwicHJpbWFyeUhlYWRlciIsIk93blByb2ZpbGVTdG9yZSIsImRpc3BsYXlOYW1lIiwiZ2V0VXNlcklkIiwicHJpbWFyeU9wdGlvbkxpc3QiLCJlIiwib25TZXR0aW5nc09wZW4iLCJVU0VSX05PVElGSUNBVElPTlNfVEFCIiwiVVNFUl9TRUNVUklUWV9UQUIiLCJvblNpZ25PdXRDbGljayIsInNlY29uZGFyeVNlY3Rpb24iLCJzZXR0aW5nc09wdGlvbiIsImludml0ZU9wdGlvbiIsImNhbkludml0ZVRvIiwib25Db21tdW5pdHlJbnZpdGVDbGljayIsImlzQWRtaW5PZiIsIm9uQ29tbXVuaXR5U2V0dGluZ3NDbGljayIsIm9uQ29tbXVuaXR5TWVtYmVyc0NsaWNrIiwiY2xhc3NlcyIsIm9uU3dpdGNoVGhlbWVDbGljayIsInJlcXVpcmUiLCJvbiIsIlVQREFURV9FVkVOVCIsIm9uUHJvZmlsZVVwZGF0ZSIsIlNwYWNlU3RvcmUiLCJVUERBVEVfU0VMRUNURURfU1BBQ0UiLCJvblNlbGVjdGVkU3BhY2VVcGRhdGUiLCJkbmRXYXRjaGVyUmVmIiwid2F0Y2hTZXR0aW5nIiwiY29tcG9uZW50RGlkTW91bnQiLCJkaXNwYXRjaGVyUmVmIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsInRoZW1lV2F0Y2hlclJlZiIsIm9uVGhlbWVDaGFuZ2VkIiwidGFnU3RvcmVSZWYiLCJHcm91cEZpbHRlck9yZGVyU3RvcmUiLCJhZGRMaXN0ZW5lciIsIm9uVGFnU3RvcmVVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVud2F0Y2hTZXR0aW5nIiwidW5yZWdpc3RlciIsIm9mZiIsInJlbW92ZSIsIndpbmRvdyIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwidGhlbWUiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwiaXNfZGFyayIsInJlbmRlciIsImF2YXRhclNpemUiLCJ1c2VySWQiLCJhdmF0YXJVcmwiLCJnZXRIdHRwQXZhdGFyVXJsIiwiaXNQcm90b3R5cGUiLCJtZW51TmFtZSIsIm5hbWUiLCJidXR0b25zIiwiZG5kIiwicm9vbU5hbWUiLCJpc0RuZCIsIm9uRG5kVG9nZ2xlIiwiaXNNaW5pbWl6ZWQiLCJvbk9wZW5NZW51Q2xpY2siLCJvbkNvbnRleHRNZW51IiwicmVuZGVyQ29udGV4dE1lbnUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBRUE7O0FBR0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7SUFlcUJBLFEsV0FEcEIsZ0RBQXFCLHFCQUFyQixDLHlCQUFELE1BQ3FCQSxRQURyQixTQUNzQ0MsZUFBTUM7QUFENUM7QUFDc0U7QUFP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SUksTUFBQSxLQUFLLEVBQUUySSxRQUpYO0FBS0ksTUFBQSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUs3SSxLQUFMLENBQVdDLG1CQUw3QjtBQU1JLE1BQUEsYUFBYSxFQUFFLEtBQUtxSjtBQU54QixvQkFRSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsb0JBQ0k7QUFBTSxNQUFBLFNBQVMsRUFBQztBQUFoQixvQkFDSSw2QkFBQyxtQkFBRDtBQUNJLE1BQUEsTUFBTSxFQUFFYixNQURaO0FBRUksTUFBQSxJQUFJLEVBQUVuRCxXQUZWO0FBR0ksTUFBQSxHQUFHLEVBQUVvRCxTQUhUO0FBSUksTUFBQSxLQUFLLEVBQUVGLFVBSlg7QUFLSSxNQUFBLE1BQU0sRUFBRUEsVUFMWjtBQU1JLE1BQUEsWUFBWSxFQUFDLE1BTmpCO0FBT0ksTUFBQSxTQUFTLEVBQUM7QUFQZCxNQURKLENBREosRUFZS00sSUFaTCxFQWFLRSxHQWJMLEVBY0tELE9BZEwsQ0FSSixDQURKLEVBMEJLLEtBQUtRLGlCQUFMLEVBMUJMLENBREo7QUE4Qkg7O0FBemlCaUUsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMCwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGV