Files
ThreadNet-Web/apps/web/src/components/views/spaces/QuickSettingsButton.tsx
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

179 lines
7.2 KiB
TypeScript
Raw Normal View History

2021-11-26 15:41:04 +00:00
/*
Copyright 2024,2025 New Vector Ltd.
2024-09-09 14:57:16 +01:00
Copyright 2021-2023 The Matrix.org Foundation C.I.C.
2021-11-26 15:41:04 +00:00
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2021-11-26 15:41:04 +00:00
*/
import React, { type JSX } from "react";
2021-12-09 09:10:23 +00:00
import classNames from "classnames";
import {
OverflowHorizontalIcon,
UserProfileSolidIcon,
FavouriteSolidIcon,
PinSolidIcon,
SettingsSolidIcon,
} from "@vector-im/compound-design-tokens/assets/web/icons";
import { IconButton, Text, Tooltip } from "@vector-im/compound-web";
2021-11-26 15:41:04 +00:00
import { _t } from "../../../languageHandler";
import ContextMenu, { alwaysAboveRightOf, ChevronFace, useContextMenu } from "../../structures/ContextMenu";
2021-11-26 15:41:04 +00:00
import AccessibleButton from "../elements/AccessibleButton";
import StyledCheckbox from "../elements/StyledCheckbox";
import { MetaSpace } from "../../../stores/spaces";
import { useSettingValue } from "../../../hooks/useSettings";
import { onMetaSpaceChangeFactory } from "../settings/tabs/user/SidebarUserSettingsTab";
import defaultDispatcher from "../../../dispatcher/dispatcher";
import { Action } from "../../../dispatcher/actions";
2022-03-24 16:42:53 -06:00
import { UserTab } from "../dialogs/UserTab";
import QuickThemeSwitcher from "./QuickThemeSwitcher";
import Modal from "../../../Modal";
import DevtoolsDialog from "../dialogs/DevtoolsDialog";
import { SdkContextClass } from "../../../contexts/SDKContext";
2021-11-26 15:41:04 +00:00
const QuickSettingsButton: React.FC<{
isPanelCollapsed: boolean;
}> = ({ isPanelCollapsed = false }) => {
const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu<HTMLButtonElement>();
2021-11-26 15:41:04 +00:00
const { [MetaSpace.Favourites]: favouritesEnabled, [MetaSpace.People]: peopleEnabled } =
2024-12-23 20:25:15 +00:00
useSettingValue("Spaces.enabledMetaSpaces");
2021-11-26 15:41:04 +00:00
const currentRoomId = SdkContextClass.instance.roomViewStore.getRoomId();
2024-12-23 20:25:15 +00:00
const developerModeEnabled = useSettingValue("developerMode");
// "Favourites" and "People" meta spaces are not available in the new room list
const newRoomListEnabled = useSettingValue("feature_new_room_list");
let contextMenu: JSX.Element | undefined;
if (menuDisplayed && handle.current) {
2021-11-26 15:41:04 +00:00
contextMenu = (
<ContextMenu
{...alwaysAboveRightOf(handle.current.getBoundingClientRect(), ChevronFace.None, 16)}
wrapperClassName={classNames("mx_QuickSettingsButton_ContextMenuWrapper", {
mx_QuickSettingsButton_ContextMenuWrapper_new_room_list: newRoomListEnabled,
})}
// Eventually replace with a properly aria-labelled menu
data-testid="quick-settings-menu"
2021-11-26 15:41:04 +00:00
onFinished={closeMenu}
managed={false}
focusLock={true}
role="region"
aria-label={_t("quick_settings|title")}
2021-11-26 15:41:04 +00:00
>
<h2>{_t("quick_settings|title")}</h2>
2021-11-26 15:41:04 +00:00
<AccessibleButton
onClick={() => {
closeMenu();
defaultDispatcher.dispatch({ action: Action.ViewUserSettings });
}}
kind="primary_outline"
>
{_t("quick_settings|all_settings")}
</AccessibleButton>
{currentRoomId && developerModeEnabled && (
2022-03-02 10:18:45 +01:00
<AccessibleButton
onClick={() => {
closeMenu();
Modal.createDialog(
DevtoolsDialog,
2022-12-12 12:24:14 +01:00
{
roomId: currentRoomId,
2022-12-12 12:24:14 +01:00
},
2022-03-02 10:18:45 +01:00
"mx_DevtoolsDialog_wrapper",
2022-12-12 12:24:14 +01:00
);
}}
2022-03-02 10:18:45 +01:00
kind="danger_outline"
>
{_t("devtools|title")}
2022-03-02 10:18:45 +01:00
</AccessibleButton>
2022-12-12 12:24:14 +01:00
)}
2021-11-26 15:41:04 +00:00
{!newRoomListEnabled && (
<>
<h4>
<PinSolidIcon className="mx_QuickSettingsButton_icon" />
{_t("quick_settings|metaspace_section")}
</h4>
<StyledCheckbox
className="mx_QuickSettingsButton_option"
checked={!!favouritesEnabled}
onChange={onMetaSpaceChangeFactory(
MetaSpace.Favourites,
"WebQuickSettingsPinToSidebarCheckbox",
)}
>
<FavouriteSolidIcon className="mx_QuickSettingsButton_icon" />
{_t("common|favourites")}
</StyledCheckbox>
<StyledCheckbox
className="mx_QuickSettingsButton_option"
checked={!!peopleEnabled}
onChange={onMetaSpaceChangeFactory(
MetaSpace.People,
"WebQuickSettingsPinToSidebarCheckbox",
)}
>
<UserProfileSolidIcon className="mx_QuickSettingsButton_icon" />
{_t("common|people")}
</StyledCheckbox>
<AccessibleButton
className="mx_QuickSettingsButton_moreOptionsButton mx_QuickSettingsButton_option"
onClick={() => {
closeMenu();
defaultDispatcher.dispatch({
action: Action.ViewUserSettings,
initialTabId: UserTab.Sidebar,
});
}}
>
<OverflowHorizontalIcon className="mx_QuickSettingsButton_icon" />
{_t("quick_settings|sidebar_settings")}
</AccessibleButton>
</>
)}
<QuickThemeSwitcher requestClose={closeMenu} />
2021-11-26 15:41:04 +00:00
</ContextMenu>
);
}
let button = (
<IconButton
aria-label={_t("quick_settings|title")}
className={classNames("mx_QuickSettingsButton", { expanded: !isPanelCollapsed })}
onClick={openMenu}
ref={handle}
aria-expanded={!isPanelCollapsed}
>
<>
<SettingsSolidIcon />
{/* This is dirty, but we need to add the label to the indicator icon */}
{!isPanelCollapsed && (
<Text className="mx_QuickSettingsButton_label" as="span" size="md" title={_t("common|settings")}>
{_t("common|settings")}
</Text>
)}
</>
</IconButton>
);
if (isPanelCollapsed) {
button = (
<Tooltip label={_t("quick_settings|title")} placement="right">
{button}
</Tooltip>
);
}
2021-11-26 15:41:04 +00:00
return (
<>
{button}
2021-11-26 15:41:04 +00:00
{contextMenu}
</>
);
};
export default QuickSettingsButton;