diff --git a/src/components/views/room_settings/RoomPublishSetting.tsx b/src/components/views/room_settings/RoomPublishSetting.tsx index 496678851fa7a32c67275184e683e0c67f8a2506..a940e0591bd4a2ac2b9a96f323d4c1f01383fad4 100644 --- a/src/components/views/room_settings/RoomPublishSetting.tsx +++ b/src/components/views/room_settings/RoomPublishSetting.tsx @@ -6,15 +6,16 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { ChangeEventHandler } from "react"; +import React, { type ChangeEventHandler } from "react"; import { JoinRule, Visibility } from "matrix-js-sdk/src/matrix"; +import { SettingsToggleInput } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import DirectoryCustomisations from "../../../customisations/Directory"; import Modal from "../../../Modal"; import ErrorDialog from "../dialogs/ErrorDialog"; -import { SettingsToggleInput } from "@vector-im/compound-web"; +import { logger } from "matrix-js-sdk/src/logger"; interface IProps { roomId: string; @@ -50,10 +51,13 @@ export default class RoomPublishSetting extends React.PureComponent<IProps, ISta const client = MatrixClientPeg.safeGet(); try { - await client - .setRoomDirectoryVisibility(this.props.roomId, newValue ? Visibility.Public : Visibility.Private) + await client.setRoomDirectoryVisibility( + this.props.roomId, + newValue ? Visibility.Public : Visibility.Private, + ); this.setState({ isRoomPublished: newValue }); } catch (ex) { + logger.error("Error while setting room directory visibility", ex); this.showError(); } finally { this.setState({ busy: false }); @@ -72,16 +76,18 @@ export default class RoomPublishSetting extends React.PureComponent<IProps, ISta const room = client.getRoom(this.props.roomId); const isRoomPublishable = room && room.getJoinRule() !== JoinRule.Invite; - const canSetCanonicalAlias = (DirectoryCustomisations.requireCanonicalAliasAccessToPublish?.() === false || this.props.canSetCanonicalAlias); + const canSetCanonicalAlias = + DirectoryCustomisations.requireCanonicalAliasAccessToPublish?.() === false || + this.props.canSetCanonicalAlias; let disabledMessage; if (!isRoomPublishable) { disabledMessage = _t("room_settings|general|publish_warn_invite_only"); } else if (!canSetCanonicalAlias) { - disabledMessage = _t("room_settings|general|publish_warn_cannot_set_canonical"); + disabledMessage = _t("room_settings|general|publish_warn_no_canonical_permission"); } - const enabled =canSetCanonicalAlias && (isRoomPublishable || this.state.isRoomPublished); + const enabled = canSetCanonicalAlias && (isRoomPublishable || this.state.isRoomPublished); return ( <SettingsToggleInput diff --git a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx index e456070cce3cae095bcf4208d32d90ba9b2b7828..0827966ddf67923fc1fde008360390588c54ffba 100644 --- a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx +++ b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, useState } from "react"; +import React, { type ChangeEventHandler, type JSX, useCallback, useState } from "react"; import { type Room, EventType, @@ -15,12 +15,12 @@ import { JoinRule, type MatrixClient, } from "matrix-js-sdk/src/matrix"; +import { SettingsToggleInput } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import AccessibleButton from "../elements/AccessibleButton"; import AliasSettings from "../room_settings/AliasSettings"; import { useStateToggle } from "../../../hooks/useStateToggle"; -import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; import { useLocalEcho } from "../../../hooks/useLocalEcho"; import JoinRuleSettings from "../settings/JoinRuleSettings"; import { useRoomState } from "../../../hooks/useRoomState"; @@ -50,6 +50,7 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space const userId = cli.getUserId()!; const joinRule = useRoomState(space, (state) => state.getJoinRule()); + const [guestAccessEnabled, setGuestAccessEnabled] = useLocalEcho<boolean>( () => space.currentState.getStateEvents(EventType.RoomGuestAccess, "")?.getContent()?.guest_access === @@ -65,6 +66,10 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space ), () => setError(_t("room_settings|visibility|error_update_guest_access")), ); + const onGuestAccessEnabledChanged = useCallback<ChangeEventHandler<HTMLInputElement>>( + (e) => setGuestAccessEnabled(e.target.checked), + [setGuestAccessEnabled], + ); const [historyVisibility, setHistoryVisibility] = useLocalEcho<HistoryVisibility>( () => space.currentState.getStateEvents(EventType.RoomHistoryVisibility, "")?.getContent()?.history_visibility || @@ -104,17 +109,15 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space {showAdvancedSection && ( <div className="mx_SettingsTab_toggleWithDescription"> - <LabelledToggleSwitch - value={guestAccessEnabled} - onChange={setGuestAccessEnabled} + <SettingsToggleInput + name="guest-access-enabled" + checked={guestAccessEnabled} + onChange={onGuestAccessEnabledChanged} disabled={!canSetGuestAccess} + disabledMessage={_t("room_settings|visibility|guest_access_disabled")} + helpMessage={_t("room_settings|visibility|guest_access_explainer")} label={_t("room_settings|visibility|guest_access_label")} /> - <p> - {_t("room_settings|visibility|guest_access_explainer")} - <br /> - {_t("room_settings|visibility|guest_access_explainer_public_space")} - </p> </div> )} </div> @@ -157,19 +160,20 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space /> {advancedSection} <div className="mx_SettingsTab_toggleWithDescription"> - <LabelledToggleSwitch - value={historyVisibility === HistoryVisibility.WorldReadable} - onChange={(checked: boolean): void => { + <SettingsToggleInput + name="space-history-visibility" + checked={historyVisibility === HistoryVisibility.WorldReadable} + onChange={(evt): void => { setHistoryVisibility( - checked ? HistoryVisibility.WorldReadable : HistoryVisibility.Shared, + evt.target.checked ? HistoryVisibility.WorldReadable : HistoryVisibility.Shared, ); }} + helpMessage={_t("room_settings|visibility|history_visibility_anyone_space_description")} disabled={!canSetHistoryVisibility} + disabledMessage={_t("room_settings|visibility|history_visibility_anyone_space_disabled")} label={_t("room_settings|visibility|history_visibility_anyone_space")} /> <p> - {_t("room_settings|visibility|history_visibility_anyone_space_description")} - <br /> <strong> {_t("room_settings|visibility|history_visibility_anyone_space_recommendation")} </strong> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 56f22dc6d765eafd31497bb3fad51ec3c78f309d..45a70b886f34b88e4f9bf683efb61eec3f0b7924 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2281,6 +2281,8 @@ "no_aliases_space": "This space has no local addresses", "other_section": "Other", "publish_toggle": "Publish this room to the public in %(domain)s's room directory?", + "publish_warn_invite_only": "You cannot publish a room that is invite-only.", + "publish_warn_no_canonical_permission": "You must have permission to set the main address to publish this room.", "published_aliases_description": "To publish an address, it needs to be set as a local address first.", "published_aliases_explainer_room": "Published addresses can be used by anyone on any server to join your room.", "published_aliases_explainer_space": "Published addresses can be used by anyone on any server to join your space.", @@ -2431,11 +2433,12 @@ "error_failed_save": "Failed to update the visibility of this space", "error_update_guest_access": "Failed to update the guest access of this space", "error_update_history_visibility": "Failed to update the history visibility of this space", - "guest_access_explainer": "Guests can join a space without having an account.", - "guest_access_explainer_public_space": "This may be useful for public spaces.", + "guest_access_explainer": "Guests can join a space without having an account. This may be useful for public spaces.", "guest_access_label": "Enable guest access", + "guest_access_disabled": "You do not have permission to change guest access.", "history_visibility_anyone_space": "Preview Space", "history_visibility_anyone_space_description": "Allow people to preview your space before they join.", + "history_visibility_anyone_space_disabled":"You do not have permission to change history visibilty.", "history_visibility_anyone_space_recommendation": "Recommended for public spaces.", "title": "Visibility" },