Check connection before starting broadcast (#9857)

This commit is contained in:
Michael Weimann 2023-01-09 16:08:30 +01:00 committed by GitHub
parent fbfa174ad0
commit be972bc913
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 88 additions and 14 deletions

View file

@ -650,6 +650,8 @@
"You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.": "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.", "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.": "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.",
"You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.": "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.", "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.": "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.",
"Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.": "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.", "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.": "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.",
"Connection error": "Connection error",
"Unfortunately we're unable to start a recording right now. Please try again later.": "Unfortunately we're unable to start a recording right now. Please try again later.",
"Cant start a call": "Cant start a call", "Cant start a call": "Cant start a call",
"You cant start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.": "You cant start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.", "You cant start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.": "You cant start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.",
"You ended a <a>voice broadcast</a>": "You ended a <a>voice broadcast</a>", "You ended a <a>voice broadcast</a>": "You ended a <a>voice broadcast</a>",

View file

@ -16,6 +16,7 @@ limitations under the License.
import React from "react"; import React from "react";
import { MatrixClient, Room } from "matrix-js-sdk/src/matrix"; import { MatrixClient, Room } from "matrix-js-sdk/src/matrix";
import { SyncState } from "matrix-js-sdk/src/sync";
import { hasRoomLiveVoiceBroadcast, VoiceBroadcastInfoEventType, VoiceBroadcastRecordingsStore } from ".."; import { hasRoomLiveVoiceBroadcast, VoiceBroadcastInfoEventType, VoiceBroadcastRecordingsStore } from "..";
import InfoDialog from "../../components/views/dialogs/InfoDialog"; import InfoDialog from "../../components/views/dialogs/InfoDialog";
@ -67,6 +68,14 @@ const showOthersAlreadyRecordingDialog = () => {
}); });
}; };
const showNoConnectionDialog = (): void => {
Modal.createDialog(InfoDialog, {
title: _t("Connection error"),
description: <p>{_t("Unfortunately we're unable to start a recording right now. Please try again later.")}</p>,
hasCloseButton: true,
});
};
export const checkVoiceBroadcastPreConditions = async ( export const checkVoiceBroadcastPreConditions = async (
room: Room, room: Room,
client: MatrixClient, client: MatrixClient,
@ -86,6 +95,11 @@ export const checkVoiceBroadcastPreConditions = async (
return false; return false;
} }
if (client.getSyncState() === SyncState.Error) {
showNoConnectionDialog();
return false;
}
const { hasBroadcast, startedByUser } = await hasRoomLiveVoiceBroadcast(client, room, currentUserId); const { hasBroadcast, startedByUser } = await hasRoomLiveVoiceBroadcast(client, room, currentUserId);
if (hasBroadcast && startedByUser) { if (hasBroadcast && startedByUser) {

View file

@ -0,0 +1,24 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`setUpVoiceBroadcastPreRecording when trying to start a broadcast if there is no connection should show an info dialog and not set up a pre-recording 1`] = `
[MockFunction] {
"calls": [
[
[Function],
{
"description": <p>
Unfortunately we're unable to start a recording right now. Please try again later.
</p>,
"hasCloseButton": true,
"title": "Connection error",
},
],
],
"results": [
{
"type": "return",
"value": undefined,
},
],
}
`;

View file

@ -91,3 +91,26 @@ exports[`startNewVoiceBroadcastRecording when the current user is not allowed to
], ],
} }
`; `;
exports[`startNewVoiceBroadcastRecording when trying to start a broadcast if there is no connection should show an info dialog and not start a recording 1`] = `
[MockFunction] {
"calls": [
[
[Function],
{
"description": <p>
Unfortunately we're unable to start a recording right now. Please try again later.
</p>,
"hasCloseButton": true,
"title": "Connection error",
},
],
],
"results": [
{
"type": "return",
"value": undefined,
},
],
}
`;

View file

@ -16,9 +16,10 @@ limitations under the License.
import { mocked } from "jest-mock"; import { mocked } from "jest-mock";
import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix";
import { SyncState } from "matrix-js-sdk/src/sync";
import Modal from "../../../src/Modal";
import { import {
checkVoiceBroadcastPreConditions,
VoiceBroadcastInfoState, VoiceBroadcastInfoState,
VoiceBroadcastPlayback, VoiceBroadcastPlayback,
VoiceBroadcastPlaybacksStore, VoiceBroadcastPlaybacksStore,
@ -30,7 +31,7 @@ import { setUpVoiceBroadcastPreRecording } from "../../../src/voice-broadcast/ut
import { mkRoomMemberJoinEvent, stubClient } from "../../test-utils"; import { mkRoomMemberJoinEvent, stubClient } from "../../test-utils";
import { mkVoiceBroadcastInfoStateEvent } from "./test-utils"; import { mkVoiceBroadcastInfoStateEvent } from "./test-utils";
jest.mock("../../../src/voice-broadcast/utils/checkVoiceBroadcastPreConditions"); jest.mock("../../../src/Modal");
describe("setUpVoiceBroadcastPreRecording", () => { describe("setUpVoiceBroadcastPreRecording", () => {
const roomId = "!room:example.com"; const roomId = "!room:example.com";
@ -86,20 +87,19 @@ describe("setUpVoiceBroadcastPreRecording", () => {
playbacksStore = new VoiceBroadcastPlaybacksStore(recordingsStore); playbacksStore = new VoiceBroadcastPlaybacksStore(recordingsStore);
}); });
describe("when the preconditions fail", () => { describe("when trying to start a broadcast if there is no connection", () => {
beforeEach(async () => { beforeEach(async () => {
mocked(checkVoiceBroadcastPreConditions).mockResolvedValue(false); mocked(client.getSyncState).mockReturnValue(SyncState.Error);
await setUpPreRecording(); await setUpPreRecording();
}); });
itShouldNotCreateAPreRecording(); it("should show an info dialog and not set up a pre-recording", () => {
expect(preRecordingStore.getCurrent()).toBeNull();
expect(Modal.createDialog).toMatchSnapshot();
});
}); });
describe("when the preconditions pass", () => { describe("when setting up a pre-recording", () => {
beforeEach(() => {
mocked(checkVoiceBroadcastPreConditions).mockResolvedValue(true);
});
describe("and there is no user id", () => { describe("and there is no user id", () => {
beforeEach(async () => { beforeEach(async () => {
mocked(client.getUserId).mockReturnValue(null); mocked(client.getUserId).mockReturnValue(null);
@ -120,17 +120,15 @@ describe("setUpVoiceBroadcastPreRecording", () => {
}); });
describe("and there is a room member and listening to another broadcast", () => { describe("and there is a room member and listening to another broadcast", () => {
beforeEach(() => { beforeEach(async () => {
playbacksStore.setCurrent(playback); playbacksStore.setCurrent(playback);
room.currentState.setStateEvents([mkRoomMemberJoinEvent(userId, roomId)]); room.currentState.setStateEvents([mkRoomMemberJoinEvent(userId, roomId)]);
setUpPreRecording(); await setUpPreRecording();
}); });
it("should pause the current playback and create a voice broadcast pre-recording", () => { it("should pause the current playback and create a voice broadcast pre-recording", () => {
expect(playback.pause).toHaveBeenCalled(); expect(playback.pause).toHaveBeenCalled();
expect(playbacksStore.getCurrent()).toBeNull(); expect(playbacksStore.getCurrent()).toBeNull();
expect(checkVoiceBroadcastPreConditions).toHaveBeenCalledWith(room, client, recordingsStore);
expect(preRecording).toBeInstanceOf(VoiceBroadcastPreRecording); expect(preRecording).toBeInstanceOf(VoiceBroadcastPreRecording);
}); });
}); });

View file

@ -16,6 +16,7 @@ limitations under the License.
import { mocked } from "jest-mock"; import { mocked } from "jest-mock";
import { EventType, ISendEventResponse, MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { EventType, ISendEventResponse, MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix";
import { SyncState } from "matrix-js-sdk/src/sync";
import Modal from "../../../src/Modal"; import Modal from "../../../src/Modal";
import { import {
@ -103,6 +104,18 @@ describe("startNewVoiceBroadcastRecording", () => {
jest.clearAllMocks(); jest.clearAllMocks();
}); });
describe("when trying to start a broadcast if there is no connection", () => {
beforeEach(async () => {
mocked(client.getSyncState).mockReturnValue(SyncState.Error);
result = await startNewVoiceBroadcastRecording(room, client, playbacksStore, recordingsStore);
});
it("should show an info dialog and not start a recording", () => {
expect(result).toBeNull();
expect(Modal.createDialog).toMatchSnapshot();
});
});
describe("when the current user is allowed to send voice broadcast info state events", () => { describe("when the current user is allowed to send voice broadcast info state events", () => {
beforeEach(() => { beforeEach(() => {
mocked(room.currentState.maySendStateEvent).mockReturnValue(true); mocked(room.currentState.maySendStateEvent).mockReturnValue(true);