/* Copyright 2024 New Vector Ltd. Copyright 2021-2023 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { useState } from "react"; import { Room, EventType, GuestAccess, HistoryVisibility, JoinRule, MatrixClient } from "matrix-js-sdk/src/matrix"; 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"; import SettingsFieldset from "../settings/SettingsFieldset"; import { useAsyncMemo } from "../../../hooks/useAsyncMemo"; import { SettingsSection } from "../settings/shared/SettingsSection"; import SettingsTab from "../settings/tabs/SettingsTab"; interface IProps { matrixClient: MatrixClient; space: Room; closeSettingsFn(): void; } const SpaceSettingsVisibilityTab: React.FC = ({ matrixClient: cli, space, closeSettingsFn }) => { const [error, setError] = useState(""); const serverSupportsExploringSpaces = useAsyncMemo( async (): Promise => { return cli.isVersionSupported("v1.4").then((supported) => { return supported || cli.doesServerSupportUnstableFeature("org.matrix.msc3827.stable"); }); }, [cli], false, ); const userId = cli.getUserId()!; const joinRule = useRoomState(space, (state) => state.getJoinRule()); const [guestAccessEnabled, setGuestAccessEnabled] = useLocalEcho( () => space.currentState.getStateEvents(EventType.RoomGuestAccess, "")?.getContent()?.guest_access === GuestAccess.CanJoin, (guestAccessEnabled) => cli.sendStateEvent( space.roomId, EventType.RoomGuestAccess, { guest_access: guestAccessEnabled ? GuestAccess.CanJoin : GuestAccess.Forbidden, }, "", ), () => setError(_t("room_settings|visibility|error_update_guest_access")), ); const [historyVisibility, setHistoryVisibility] = useLocalEcho( () => space.currentState.getStateEvents(EventType.RoomHistoryVisibility, "")?.getContent()?.history_visibility || HistoryVisibility.Shared, (historyVisibility) => cli.sendStateEvent( space.roomId, EventType.RoomHistoryVisibility, { history_visibility: historyVisibility, }, "", ), () => setError(_t("room_settings|visibility|error_update_history_visibility")), ); const [showAdvancedSection, toggleAdvancedSection] = useStateToggle(); const canSetGuestAccess = space.currentState.maySendStateEvent(EventType.RoomGuestAccess, userId); const canSetHistoryVisibility = space.currentState.maySendStateEvent(EventType.RoomHistoryVisibility, userId); const canSetCanonical = space.currentState.mayClientSendStateEvent(EventType.RoomCanonicalAlias, cli); const canonicalAliasEv = space.currentState.getStateEvents(EventType.RoomCanonicalAlias, ""); let advancedSection; if (joinRule === JoinRule.Public) { advancedSection = (
{showAdvancedSection ? _t("action|hide_advanced") : _t("action|show_advanced")} {showAdvancedSection && (

{_t("room_settings|visibility|guest_access_explainer")}
{_t("room_settings|visibility|guest_access_explainer_public_space")}

)}
); } let addressesSection: JSX.Element | undefined; if (space.getJoinRule() === JoinRule.Public) { addressesSection = ( ); } return ( {error && (
{error}
)} setError(_t("room_settings|visibility|error_failed_save"))} closeSettingsFn={closeSettingsFn} /> {advancedSection}
{ setHistoryVisibility( checked ? HistoryVisibility.WorldReadable : HistoryVisibility.Shared, ); }} disabled={!canSetHistoryVisibility} label={_t("room_settings|visibility|history_visibility_anyone_space")} />

{_t("room_settings|visibility|history_visibility_anyone_space_description")}
{_t("room_settings|visibility|history_visibility_anyone_space_recommendation")}

{addressesSection}
); }; export default SpaceSettingsVisibilityTab;