Implement VoiceBroadcastBody update (#9439)

* Implement VoiceBroadcastBody updat

* Add doc in VoiceBroadcastBody-test
pull/28217/head
Michael Weimann 2022-10-17 21:43:04 +02:00 committed by GitHub
parent 372720ec8b
commit ca8b1b04ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 18 deletions

View File

@ -14,8 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import React from "react"; import React, { useEffect, useState } from "react";
import { MatrixEvent } from "matrix-js-sdk/src/matrix"; import { MatrixEvent, RelationType } from "matrix-js-sdk/src/matrix";
import { import {
VoiceBroadcastRecordingBody, VoiceBroadcastRecordingBody,
@ -28,17 +28,34 @@ import {
} from ".."; } from "..";
import { IBodyProps } from "../../components/views/messages/IBodyProps"; import { IBodyProps } from "../../components/views/messages/IBodyProps";
import { MatrixClientPeg } from "../../MatrixClientPeg"; import { MatrixClientPeg } from "../../MatrixClientPeg";
import { getReferenceRelationsForEvent } from "../../events"; import { RelationsHelper, RelationsHelperEvent } from "../../events/RelationsHelper";
export const VoiceBroadcastBody: React.FC<IBodyProps> = ({ mxEvent }) => { export const VoiceBroadcastBody: React.FC<IBodyProps> = ({ mxEvent }) => {
const client = MatrixClientPeg.get(); const client = MatrixClientPeg.get();
const relations = getReferenceRelationsForEvent(mxEvent, VoiceBroadcastInfoEventType, client); const [infoState, setInfoState] = useState(mxEvent.getContent()?.state || VoiceBroadcastInfoState.Stopped);
const relatedEvents = relations?.getRelations();
const state = !relatedEvents?.find((event: MatrixEvent) => {
return event.getContent()?.state === VoiceBroadcastInfoState.Stopped;
}) ? VoiceBroadcastInfoState.Started : VoiceBroadcastInfoState.Stopped;
if (shouldDisplayAsVoiceBroadcastRecordingTile(state, client, mxEvent)) { useEffect(() => {
const onInfoEvent = (event: MatrixEvent) => {
if (event.getContent()?.state === VoiceBroadcastInfoState.Stopped) {
// only a stopped event can change the tile state
setInfoState(VoiceBroadcastInfoState.Stopped);
}
};
const relationsHelper = new RelationsHelper(
mxEvent,
RelationType.Reference,
VoiceBroadcastInfoEventType,
client,
);
relationsHelper.on(RelationsHelperEvent.Add, onInfoEvent);
return () => {
relationsHelper.destroy();
};
});
if (shouldDisplayAsVoiceBroadcastRecordingTile(infoState, client, mxEvent)) {
const recording = VoiceBroadcastRecordingsStore.instance().getByInfoEvent(mxEvent, client); const recording = VoiceBroadcastRecordingsStore.instance().getByInfoEvent(mxEvent, client);
return <VoiceBroadcastRecordingBody return <VoiceBroadcastRecordingBody
recording={recording} recording={recording}

View File

@ -15,7 +15,7 @@ limitations under the License.
*/ */
import React from "react"; import React from "react";
import { render, screen } from "@testing-library/react"; import { act, render, screen } from "@testing-library/react";
import { mocked } from "jest-mock"; import { mocked } from "jest-mock";
import { MatrixClient, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { MatrixClient, MatrixEvent } from "matrix-js-sdk/src/matrix";
@ -26,12 +26,12 @@ import {
VoiceBroadcastRecordingBody, VoiceBroadcastRecordingBody,
VoiceBroadcastRecordingsStore, VoiceBroadcastRecordingsStore,
VoiceBroadcastRecording, VoiceBroadcastRecording,
shouldDisplayAsVoiceBroadcastRecordingTile,
VoiceBroadcastPlaybackBody, VoiceBroadcastPlaybackBody,
VoiceBroadcastPlayback, VoiceBroadcastPlayback,
VoiceBroadcastPlaybacksStore, VoiceBroadcastPlaybacksStore,
} from "../../../src/voice-broadcast"; } from "../../../src/voice-broadcast";
import { mkEvent, stubClient } from "../../test-utils"; import { mkEvent, stubClient } from "../../test-utils";
import { RelationsHelper } from "../../../src/events/RelationsHelper";
jest.mock("../../../src/voice-broadcast/components/molecules/VoiceBroadcastRecordingBody", () => ({ jest.mock("../../../src/voice-broadcast/components/molecules/VoiceBroadcastRecordingBody", () => ({
VoiceBroadcastRecordingBody: jest.fn(), VoiceBroadcastRecordingBody: jest.fn(),
@ -41,9 +41,7 @@ jest.mock("../../../src/voice-broadcast/components/molecules/VoiceBroadcastPlayb
VoiceBroadcastPlaybackBody: jest.fn(), VoiceBroadcastPlaybackBody: jest.fn(),
})); }));
jest.mock("../../../src/voice-broadcast/utils/shouldDisplayAsVoiceBroadcastRecordingTile", () => ({ jest.mock("../../../src/events/RelationsHelper");
shouldDisplayAsVoiceBroadcastRecordingTile: jest.fn(),
}));
describe("VoiceBroadcastBody", () => { describe("VoiceBroadcastBody", () => {
const roomId = "!room:example.com"; const roomId = "!room:example.com";
@ -111,22 +109,38 @@ describe("VoiceBroadcastBody", () => {
describe("when displaying a voice broadcast recording", () => { describe("when displaying a voice broadcast recording", () => {
beforeEach(() => { beforeEach(() => {
mocked(shouldDisplayAsVoiceBroadcastRecordingTile).mockReturnValue(true); renderVoiceBroadcast();
}); });
it("should render a voice broadcast recording body", () => { it("should render a voice broadcast recording body", () => {
renderVoiceBroadcast();
screen.getByTestId("voice-broadcast-recording-body"); screen.getByTestId("voice-broadcast-recording-body");
}); });
describe("and the recordings ends", () => {
beforeEach(() => {
const stoppedEvent = mkVoiceBroadcastInfoEvent(VoiceBroadcastInfoState.Stopped);
// get the RelationsHelper instanced used in VoiceBroadcastBody
const relationsHelper = mocked(RelationsHelper).mock.instances[5];
act(() => {
// invoke the callback of the VoiceBroadcastBody hook to simulate an ended broadcast
// @ts-ignore
mocked(relationsHelper.on).mock.calls[0][1](stoppedEvent);
});
});
it("should render a voice broadcast playback body", () => {
screen.getByTestId("voice-broadcast-playback-body");
});
});
}); });
describe("when displaying a voice broadcast playback", () => { describe("when displaying a voice broadcast playback", () => {
beforeEach(() => { beforeEach(() => {
mocked(shouldDisplayAsVoiceBroadcastRecordingTile).mockReturnValue(false); mocked(client).getUserId.mockReturnValue("@other:example.com");
renderVoiceBroadcast();
}); });
it("should render a voice broadcast playback body", () => { it("should render a voice broadcast playback body", () => {
renderVoiceBroadcast();
screen.getByTestId("voice-broadcast-playback-body"); screen.getByTestId("voice-broadcast-playback-body");
}); });
}); });