Implement VoiceBroadcastBody update (#9439)
* Implement VoiceBroadcastBody updat * Add doc in VoiceBroadcastBody-testpull/28217/head
parent
372720ec8b
commit
ca8b1b04ef
|
@ -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}
|
||||||
|
|
|
@ -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");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue