diff --git a/src/Notifier.ts b/src/Notifier.ts index 42909a2632e..7b0519689ab 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -505,7 +505,7 @@ export const Notifier = { * Some events require special handling such as showing in-app toasts */ _performCustomEventHandling: function (ev: MatrixEvent) { - if (ElementCall.CALL_EVENT_TYPE.names.includes(ev.getType()) && SettingsStore.getValue("feature_group_calls")) { + if (ElementCall.CALL_EVENT_TYPE.names.includes(ev.getType())) { ToastStore.sharedInstance().addOrReplaceToast({ key: getIncomingCallToastKey(ev.getStateKey()), priority: 100, diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 8d85b54df72..8ca5f6ee910 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -506,10 +506,7 @@ export class RoomView extends React.Component { }; private getMainSplitContentType = (room: Room): MainSplitContentType => { - if ( - (SettingsStore.getValue("feature_group_calls") && this.context.roomViewStore.isViewingCall()) || - isVideoRoom(room) - ) { + if (this.context.roomViewStore.isViewingCall() || isVideoRoom(room)) { return MainSplitContentType.Call; } if (this.context.widgetLayoutStore.hasMaximisedWidget(room)) { @@ -1931,10 +1928,7 @@ export class RoomView extends React.Component { } const myMembership = this.state.room.getMyMembership(); - if ( - isVideoRoom(this.state.room) && - !(SettingsStore.getValue("feature_video_rooms") && myMembership === "join") - ) { + if (isVideoRoom(this.state.room) && myMembership !== "join") { return (
@@ -1944,7 +1938,6 @@ export class RoomView extends React.Component { onRejectButtonClicked={this.onRejectButtonClicked} />
- ;
); } diff --git a/src/components/views/context_menus/RoomContextMenu.tsx b/src/components/views/context_menus/RoomContextMenu.tsx index 03914b329ec..f3f311c3f79 100644 --- a/src/components/views/context_menus/RoomContextMenu.tsx +++ b/src/components/views/context_menus/RoomContextMenu.tsx @@ -50,6 +50,7 @@ import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; import SettingsStore from "../../../settings/SettingsStore"; import DevtoolsDialog from "../dialogs/DevtoolsDialog"; import { SdkContextClass } from "../../../contexts/SDKContext"; +import { isVideoRoom as calcIsVideoRoom } from "../../../utils/video-rooms"; interface IProps extends IContextMenuProps { room: Room; @@ -107,10 +108,7 @@ const RoomContextMenu: React.FC = ({ room, onFinished, ...props }) => { } const isDm = DMRoomMap.shared().getUserIdForRoomId(room.roomId); - const videoRoomsEnabled = useFeatureEnabled("feature_video_rooms"); - const elementCallVideoRoomsEnabled = useFeatureEnabled("feature_element_call_video_rooms"); - const isVideoRoom = - videoRoomsEnabled && (room.isElementVideoRoom() || (elementCallVideoRoomsEnabled && room.isCallRoom())); + const isVideoRoom = calcIsVideoRoom(room); let inviteOption: JSX.Element; if (room.canInvite(cli.getUserId()!) && !isDm) { diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index 7e1974f9621..e78aaaa954d 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -51,6 +51,7 @@ import ExportDialog from "../dialogs/ExportDialog"; import RightPanelStore from "../../../stores/right-panel/RightPanelStore"; import PosthogTrackers from "../../../PosthogTrackers"; import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; +import { isVideoRoom as calcIsVideoRoom } from "../../../utils/video-rooms"; interface IProps { room: Room; @@ -284,10 +285,7 @@ const RoomSummaryCard: React.FC = ({ room, onClose }) => { const isRoomEncrypted = useIsEncrypted(cli, room); const roomContext = useContext(RoomContext); const e2eStatus = roomContext.e2eStatus; - const videoRoomsEnabled = useFeatureEnabled("feature_video_rooms"); - const elementCallVideoRoomsEnabled = useFeatureEnabled("feature_element_call_video_rooms"); - const isVideoRoom = - videoRoomsEnabled && (room.isElementVideoRoom() || (elementCallVideoRoomsEnabled && room.isCallRoom())); + const isVideoRoom = calcIsVideoRoom(room); const alias = room.getCanonicalAlias() || room.getAltAliases()[0] || ""; const header = ( diff --git a/src/components/views/rooms/RoomHeader.tsx b/src/components/views/rooms/RoomHeader.tsx index 4dbec26caf6..2171325ea3c 100644 --- a/src/components/views/rooms/RoomHeader.tsx +++ b/src/components/views/rooms/RoomHeader.tsx @@ -28,7 +28,6 @@ import { _t } from "../../../languageHandler"; import defaultDispatcher from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import { UserTab } from "../dialogs/UserTab"; -import SettingsStore from "../../../settings/SettingsStore"; import RoomHeaderButtons from "../right_panel/RoomHeaderButtons"; import E2EIcon from "./E2EIcon"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; @@ -247,8 +246,7 @@ const CallButtons: FC = ({ room }) => { const [busy, setBusy] = useState(false); const showButtons = useSettingValue("showCallButtonsInComposer"); const groupCallsEnabled = useFeatureEnabled("feature_group_calls"); - const videoRoomsEnabled = useFeatureEnabled("feature_video_rooms"); - const isVideoRoom = useMemo(() => videoRoomsEnabled && calcIsVideoRoom(room), [videoRoomsEnabled, room]); + const isVideoRoom = useMemo(() => calcIsVideoRoom(room), [room]); const useElementCallExclusively = useMemo(() => { return SdkConfig.get("element_call").use_exclusively ?? DEFAULTS.element_call.use_exclusively; }, []); @@ -336,7 +334,7 @@ const CallButtons: FC = ({ room }) => { ); } - } else if (hasLegacyCall || hasJitsiWidget) { + } else if (hasLegacyCall || hasJitsiWidget || hasGroupCall) { return ( <> {makeVoiceCallButton(new DisabledWithReason(_t("Ongoing call")))} @@ -717,7 +715,7 @@ export default class RoomHeader extends React.Component { } public render(): JSX.Element { - const isVideoRoom = SettingsStore.getValue("feature_video_rooms") && calcIsVideoRoom(this.props.room); + const isVideoRoom = calcIsVideoRoom(this.props.room); let roomAvatar: JSX.Element | null = null; if (this.props.room) { diff --git a/src/components/views/rooms/RoomInfoLine.tsx b/src/components/views/rooms/RoomInfoLine.tsx index 18b5b1c766a..6296e0d10e3 100644 --- a/src/components/views/rooms/RoomInfoLine.tsx +++ b/src/components/views/rooms/RoomInfoLine.tsx @@ -24,9 +24,9 @@ import RightPanelStore from "../../../stores/right-panel/RightPanelStore"; import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePhases"; import { useAsyncMemo } from "../../../hooks/useAsyncMemo"; import { useRoomState } from "../../../hooks/useRoomState"; -import { useFeatureEnabled } from "../../../hooks/useSettings"; import { useRoomMemberCount, useMyRoomMembership } from "../../../hooks/useRoomMembers"; import AccessibleButton from "../elements/AccessibleButton"; +import { isVideoRoom } from "../../../utils/video-rooms"; interface IProps { room: Room; @@ -46,12 +46,9 @@ const RoomInfoLine: FC = ({ room }) => { const membership = useMyRoomMembership(room); const memberCount = useRoomMemberCount(room); - const elementCallVideoRoomsEnabled = useFeatureEnabled("feature_element_call_video_rooms"); - const isVideoRoom = room.isElementVideoRoom() || (elementCallVideoRoomsEnabled && room.isCallRoom()); - let iconClass: string; let roomType: string; - if (isVideoRoom) { + if (isVideoRoom(room)) { iconClass = "mx_RoomInfoLine_video"; roomType = _t("Video room"); } else if (joinRule === JoinRule.Public) { diff --git a/src/components/views/rooms/RoomPreviewCard.tsx b/src/components/views/rooms/RoomPreviewCard.tsx index 4c0a016f85d..8c136eea6f2 100644 --- a/src/components/views/rooms/RoomPreviewCard.tsx +++ b/src/components/views/rooms/RoomPreviewCard.tsx @@ -25,7 +25,6 @@ import { UserTab } from "../dialogs/UserTab"; import { EffectiveMembership, getEffectiveMembership } from "../../../utils/membership"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { useDispatcher } from "../../../hooks/useDispatcher"; -import { useFeatureEnabled } from "../../../hooks/useSettings"; import { useRoomState } from "../../../hooks/useRoomState"; import { useMyRoomMembership } from "../../../hooks/useRoomMembers"; import AccessibleButton from "../elements/AccessibleButton"; @@ -37,6 +36,7 @@ import RoomAvatar from "../avatars/RoomAvatar"; import MemberAvatar from "../avatars/MemberAvatar"; import { BetaPill } from "../beta/BetaCard"; import RoomInfoLine from "./RoomInfoLine"; +import { isVideoRoom } from "../../../utils/video-rooms"; interface IProps { room: Room; @@ -50,9 +50,6 @@ interface IProps { // and viewing invite reasons to achieve parity with the default invite screen. const RoomPreviewCard: FC = ({ room, onJoinButtonClicked, onRejectButtonClicked }) => { const cli = useContext(MatrixClientContext); - const videoRoomsEnabled = useFeatureEnabled("feature_video_rooms"); - const elementCallVideoRoomsEnabled = useFeatureEnabled("feature_element_call_video_rooms"); - const isVideoRoom = room.isElementVideoRoom() || (elementCallVideoRoomsEnabled && room.isCallRoom()); const myMembership = useMyRoomMembership(room); useDispatcher(defaultDispatcher, (payload) => { if (payload.action === Action.JoinRoomError && payload.roomId === room.roomId) { @@ -158,7 +155,7 @@ const RoomPreviewCard: FC = ({ room, onJoinButtonClicked, onRejectButton } let avatarRow: JSX.Element; - if (isVideoRoom) { + if (isVideoRoom(room)) { avatarRow = ( <> @@ -177,17 +174,6 @@ const RoomPreviewCard: FC = ({ room, onJoinButtonClicked, onRejectButton notice = _t("To view %(roomName)s, you need an invite", { roomName: room.name, }); - } else if (isVideoRoom && !videoRoomsEnabled) { - notice = - myMembership === "join" - ? _t("To view, please enable video rooms in Labs first") - : _t("To join, please enable video rooms in Labs first"); - - joinButtons = ( - - {_t("Show Labs settings")} - - ); } return ( diff --git a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx index 6800fbffbb1..f35f13ee8fa 100644 --- a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx @@ -245,7 +245,7 @@ export default class RolesRoomSettingsTab extends React.Component { const plContent = plEvent ? plEvent.getContent() || {} : {}; const canChangeLevels = room.currentState.mayClientSendStateEvent(EventType.RoomPowerLevels, client); - const plEventsToLabels = { + const plEventsToLabels: { [eventType: string]: string | null } = { // These will be translated for us later. [EventType.RoomAvatar]: isSpaceRoom ? _td("Change space avatar") : _td("Change room avatar"), [EventType.RoomName]: isSpaceRoom ? _td("Change space name") : _td("Change room name"), @@ -265,16 +265,13 @@ export default class RolesRoomSettingsTab extends React.Component { // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) "im.vector.modular.widgets": isSpaceRoom ? null : _td("Modify widgets"), [VoiceBroadcastInfoEventType]: _td("Voice broadcasts"), + [ElementCall.CALL_EVENT_TYPE.name]: _td("Start %(brand)s calls"), + [ElementCall.MEMBER_EVENT_TYPE.name]: _td("Join %(brand)s calls"), }; if (SettingsStore.getValue("feature_pinning")) { plEventsToLabels[EventType.RoomPinnedEvents] = _td("Manage pinned events"); } - // MSC3401: Native Group VoIP signaling - if (SettingsStore.getValue("feature_group_calls")) { - plEventsToLabels[ElementCall.CALL_EVENT_TYPE.name] = _td("Start %(brand)s calls"); - plEventsToLabels[ElementCall.MEMBER_EVENT_TYPE.name] = _td("Join %(brand)s calls"); - } const powerLevelDescriptors: Record = { "users_default": { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f3768067cd3..dfd37f100c4 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1706,9 +1706,9 @@ "Remove messages sent by me": "Remove messages sent by me", "Modify widgets": "Modify widgets", "Voice broadcasts": "Voice broadcasts", - "Manage pinned events": "Manage pinned events", "Start %(brand)s calls": "Start %(brand)s calls", "Join %(brand)s calls": "Join %(brand)s calls", + "Manage pinned events": "Manage pinned events", "Default role": "Default role", "Send messages": "Send messages", "Invite users": "Invite users", @@ -2088,9 +2088,6 @@ "Leave": "Leave", " invites you": " invites you", "To view %(roomName)s, you need an invite": "To view %(roomName)s, you need an invite", - "To view, please enable video rooms in Labs first": "To view, please enable video rooms in Labs first", - "To join, please enable video rooms in Labs first": "To join, please enable video rooms in Labs first", - "Show Labs settings": "Show Labs settings", "Appearance": "Appearance", "Show rooms with unread messages first": "Show rooms with unread messages first", "Show previews of messages": "Show previews of messages", diff --git a/src/models/Call.ts b/src/models/Call.ts index 3fefeb3f09e..a40cd977140 100644 --- a/src/models/Call.ts +++ b/src/models/Call.ts @@ -331,7 +331,7 @@ export class JitsiCall extends Call { public static get(room: Room): JitsiCall | null { // Only supported in video rooms - if (SettingsStore.getValue("feature_video_rooms") && room.isElementVideoRoom()) { + if (room.isElementVideoRoom()) { const apps = WidgetStore.instance.getApps(room.roomId); // The isVideoChannel field differentiates rich Jitsi calls from bare Jitsi widgets const jitsiWidget = apps.find((app) => WidgetType.JITSI.matches(app.type) && app.data?.isVideoChannel); @@ -700,32 +700,19 @@ export class ElementCall extends Call { } public static get(room: Room): ElementCall | null { - // Only supported in the new group call experience or in video rooms - if ( - SettingsStore.getValue("feature_group_calls") || - (SettingsStore.getValue("feature_video_rooms") && - SettingsStore.getValue("feature_element_call_video_rooms") && - room.isCallRoom()) - ) { - const groupCall = room.client.groupCallEventHandler!.groupCalls.get(room.roomId); - if (groupCall !== undefined) return new ElementCall(groupCall, room.client); - } + const groupCall = room.client.groupCallEventHandler!.groupCalls.get(room.roomId); + if (groupCall !== undefined) return new ElementCall(groupCall, room.client); return null; } public static async create(room: Room): Promise { - const isVideoRoom = - SettingsStore.getValue("feature_video_rooms") && - SettingsStore.getValue("feature_element_call_video_rooms") && - room.isCallRoom(); - const groupCall = new GroupCall( room.client, room, GroupCallType.Video, false, - isVideoRoom ? GroupCallIntent.Room : GroupCallIntent.Prompt, + room.isCallRoom() ? GroupCallIntent.Room : GroupCallIntent.Prompt, ); await groupCall.create(); diff --git a/src/utils/video-rooms.ts b/src/utils/video-rooms.ts index 6d6fcaccc0d..e0c63b7246e 100644 --- a/src/utils/video-rooms.ts +++ b/src/utils/video-rooms.ts @@ -15,7 +15,5 @@ limitations under the License. */ import type { Room } from "matrix-js-sdk/src/models/room"; -import SettingsStore from "../settings/SettingsStore"; -export const isVideoRoom = (room: Room): boolean => - room.isElementVideoRoom() || (SettingsStore.getValue("feature_element_call_video_rooms") && room.isCallRoom()); +export const isVideoRoom = (room: Room): boolean => room.isElementVideoRoom() || room.isCallRoom();