Strictify voice-broadcast (#10393)
This commit is contained in:
parent
6d15b05b86
commit
aae9dfbb7d
7 changed files with 69 additions and 23 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -27,8 +27,8 @@ interface Props {
|
|||
}
|
||||
|
||||
export const VoiceBroadcastPlaybackControl: React.FC<Props> = ({ onClick, state }) => {
|
||||
let controlIcon: ReactElement;
|
||||
let controlLabel: string;
|
||||
let controlIcon: ReactElement | null = null;
|
||||
let controlLabel: string | null = null;
|
||||
let className = "";
|
||||
|
||||
switch (state) {
|
||||
|
@ -49,5 +49,11 @@ export const VoiceBroadcastPlaybackControl: React.FC<Props> = ({ onClick, state
|
|||
break;
|
||||
}
|
||||
|
||||
return <VoiceBroadcastControl className={className} label={controlLabel} icon={controlIcon} onClick={onClick} />;
|
||||
if (controlIcon && controlLabel) {
|
||||
return (
|
||||
<VoiceBroadcastControl className={className} label={controlLabel} icon={controlIcon} onClick={onClick} />
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -48,6 +48,12 @@ export const useVoiceBroadcastPlayback = (
|
|||
throw new Error(`Voice Broadcast room not found (event ${playback.infoEvent.getId()})`);
|
||||
}
|
||||
|
||||
const sender = playback.infoEvent.sender;
|
||||
|
||||
if (!sender) {
|
||||
throw new Error(`Voice Broadcast sender not found (event ${playback.infoEvent.getId()})`);
|
||||
}
|
||||
|
||||
const playbackToggle = (): void => {
|
||||
playback.toggle();
|
||||
};
|
||||
|
@ -87,7 +93,7 @@ export const useVoiceBroadcastPlayback = (
|
|||
liveness: liveness,
|
||||
playbackState,
|
||||
room: room,
|
||||
sender: playback.infoEvent.sender,
|
||||
sender,
|
||||
toggle: playbackToggle,
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -66,6 +66,12 @@ export const useVoiceBroadcastRecording = (
|
|||
throw new Error("Unable to find voice broadcast room with Id: " + roomId);
|
||||
}
|
||||
|
||||
const sender = recording.infoEvent.sender;
|
||||
|
||||
if (!sender) {
|
||||
throw new Error(`Voice Broadcast sender not found (event ${recording.infoEvent.getId()})`);
|
||||
}
|
||||
|
||||
const stopRecording = async (): Promise<void> => {
|
||||
const confirmed = await showStopBroadcastingDialog();
|
||||
|
||||
|
@ -99,7 +105,7 @@ export const useVoiceBroadcastRecording = (
|
|||
timeLeft,
|
||||
recordingState,
|
||||
room,
|
||||
sender: recording.infoEvent.sender,
|
||||
sender,
|
||||
stopRecording,
|
||||
toggleRecording: recording.toggle,
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -17,7 +17,12 @@ limitations under the License.
|
|||
import { MatrixClient, MatrixEvent } from "matrix-js-sdk/src/matrix";
|
||||
import { TypedEventEmitter } from "matrix-js-sdk/src/models/typed-event-emitter";
|
||||
|
||||
import { VoiceBroadcastInfoState, VoiceBroadcastRecording, VoiceBroadcastRecordingEvent } from "..";
|
||||
import {
|
||||
VoiceBroadcastInfoState,
|
||||
VoiceBroadcastRecording,
|
||||
VoiceBroadcastRecordingEvent,
|
||||
VoiceBroadcastRecordingState,
|
||||
} from "..";
|
||||
|
||||
export enum VoiceBroadcastRecordingsStoreEvent {
|
||||
CurrentChanged = "current_changed",
|
||||
|
@ -85,7 +90,7 @@ export class VoiceBroadcastRecordingsStore extends TypedEventEmitter<VoiceBroadc
|
|||
return recording;
|
||||
}
|
||||
|
||||
private onCurrentStateChanged = (state: VoiceBroadcastInfoState): void => {
|
||||
private onCurrentStateChanged = (state: VoiceBroadcastRecordingState): void => {
|
||||
if (state === VoiceBroadcastInfoState.Stopped) {
|
||||
this.clearCurrent();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -38,6 +38,12 @@ describe("<VoiceBroadcastPlaybackControl />", () => {
|
|||
expect(renderControl(state).result.container).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should not render for error state", () => {
|
||||
expect(renderControl(VoiceBroadcastPlaybackState.Error).result.asFragment()).toMatchInlineSnapshot(
|
||||
`<DocumentFragment />`,
|
||||
);
|
||||
});
|
||||
|
||||
describe("when clicking the control", () => {
|
||||
let onClick: () => void;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -233,15 +233,25 @@ describe("VoiceBroadcastPlaybackBody", () => {
|
|||
describe.each([
|
||||
[VoiceBroadcastPlaybackState.Paused, "not-live"],
|
||||
[VoiceBroadcastPlaybackState.Playing, "live"],
|
||||
])("when rendering a %s/%s broadcast", (state: VoiceBroadcastPlaybackState, liveness: VoiceBroadcastLiveness) => {
|
||||
beforeEach(() => {
|
||||
mocked(playback.getState).mockReturnValue(state);
|
||||
mocked(playback.getLiveness).mockReturnValue(liveness);
|
||||
renderResult = render(<VoiceBroadcastPlaybackBody playback={playback} />);
|
||||
});
|
||||
] satisfies [VoiceBroadcastPlaybackState, VoiceBroadcastLiveness][])(
|
||||
"when rendering a %s/%s broadcast",
|
||||
(state: VoiceBroadcastPlaybackState, liveness: VoiceBroadcastLiveness) => {
|
||||
beforeEach(() => {
|
||||
mocked(playback.getState).mockReturnValue(state);
|
||||
mocked(playback.getLiveness).mockReturnValue(liveness);
|
||||
renderResult = render(<VoiceBroadcastPlaybackBody playback={playback} />);
|
||||
});
|
||||
|
||||
it("should render as expected", () => {
|
||||
expect(renderResult.container).toMatchSnapshot();
|
||||
});
|
||||
it("should render as expected", () => {
|
||||
expect(renderResult.container).toMatchSnapshot();
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
it("when there is a broadcast without sender, it should raise an error", () => {
|
||||
infoEvent.sender = null;
|
||||
expect(() => {
|
||||
render(<VoiceBroadcastPlaybackBody playback={playback} />);
|
||||
}).toThrow(`Voice Broadcast sender not found (event ${playback.infoEvent.getId()})`);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2022-2023 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -77,4 +77,11 @@ describe("VoiceBroadcastRecordingBody", () => {
|
|||
expect(renderResult.container).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
it("when there is a broadcast without sender, it should raise an error", () => {
|
||||
infoEvent.sender = null;
|
||||
expect(() => {
|
||||
render(<VoiceBroadcastRecordingBody recording={recording} />);
|
||||
}).toThrow(`Voice Broadcast sender not found (event ${recording.infoEvent.getId()})`);
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue