import React from 'react'; import { Box, color, Spinner, Switch, Text } from 'folds'; import { JoinRule, MatrixError } from 'matrix-js-sdk'; import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types'; import { SequenceCard } from '../../../components/sequence-card'; import { SequenceCardStyle } from '../../room-settings/styles.css'; import { SettingTile } from '../../../components/setting-tile'; import { useRoom } from '../../../hooks/useRoom'; import { useRoomDirectoryVisibility } from '../../../hooks/useRoomDirectoryVisibility'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { IPowerLevels, powerLevelAPI } from '../../../hooks/usePowerLevels'; import { StateEvent } from '../../../../types/matrix/room'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useStateEvent } from '../../../hooks/useStateEvent'; import { ExtendedJoinRules } from '../../../components/JoinRulesSwitcher'; type RoomPublishProps = { powerLevels: IPowerLevels; }; export function RoomPublish({ powerLevels }: RoomPublishProps) { const mx = useMatrixClient(); const room = useRoom(); const userPowerLevel = powerLevelAPI.getPowerLevel(powerLevels, mx.getSafeUserId()); const canEditCanonical = powerLevelAPI.canSendStateEvent( powerLevels, StateEvent.RoomCanonicalAlias, userPowerLevel ); const joinRuleEvent = useStateEvent(room, StateEvent.RoomJoinRules); const content = joinRuleEvent?.getContent(); const rule: ExtendedJoinRules = (content?.join_rule as ExtendedJoinRules) ?? JoinRule.Invite; const { visibilityState, setVisibility } = useRoomDirectoryVisibility(room.roomId); const [toggleState, toggleVisibility] = useAsyncCallback(setVisibility); const loading = visibilityState.status === AsyncStatus.Loading || toggleState.status === AsyncStatus.Loading; const validRule = rule === JoinRule.Public || rule === JoinRule.Knock || rule === 'knock_restricted'; return ( {loading && } {!loading && visibilityState.status === AsyncStatus.Success && ( )} } > {visibilityState.status === AsyncStatus.Error && ( {(visibilityState.error as MatrixError).message} )} {toggleState.status === AsyncStatus.Error && ( {(toggleState.error as MatrixError).message} )} ); }