Merge branch 'develop' into feat/add-formating-buttons-to-wysiwyg
This commit is contained in:
commit
a557c7f583
17 changed files with 1300 additions and 485 deletions
|
@ -31,6 +31,9 @@ export function getLocalNotificationAccountDataEventType(deviceId: string): stri
|
|||
}
|
||||
|
||||
export async function createLocalNotificationSettingsIfNeeded(cli: MatrixClient): Promise<void> {
|
||||
if (cli.isGuest()) {
|
||||
return;
|
||||
}
|
||||
const eventType = getLocalNotificationAccountDataEventType(cli.deviceId);
|
||||
const event = cli.getAccountData(eventType);
|
||||
// New sessions will create an account data event to signify they support
|
||||
|
|
|
@ -14,42 +14,20 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
import React, { useState } from "react";
|
||||
import React from "react";
|
||||
|
||||
import {
|
||||
VoiceBroadcastInfoState,
|
||||
VoiceBroadcastRecordingBody,
|
||||
VoiceBroadcastRecordingsStore,
|
||||
VoiceBroadcastRecording,
|
||||
VoiceBroadcastRecordingEvent,
|
||||
} from "..";
|
||||
import { IBodyProps } from "../../components/views/messages/IBodyProps";
|
||||
import { MatrixClientPeg } from "../../MatrixClientPeg";
|
||||
import { useTypedEventEmitter } from "../../hooks/useEventEmitter";
|
||||
|
||||
export const VoiceBroadcastBody: React.FC<IBodyProps> = ({ mxEvent }) => {
|
||||
const client = MatrixClientPeg.get();
|
||||
const room = client.getRoom(mxEvent.getRoomId());
|
||||
const recording = VoiceBroadcastRecordingsStore.instance().getByInfoEvent(mxEvent, client);
|
||||
const [recordingState, setRecordingState] = useState(recording.getState());
|
||||
|
||||
useTypedEventEmitter(
|
||||
recording,
|
||||
VoiceBroadcastRecordingEvent.StateChanged,
|
||||
(state: VoiceBroadcastInfoState, _recording: VoiceBroadcastRecording) => {
|
||||
setRecordingState(state);
|
||||
},
|
||||
);
|
||||
|
||||
const stopVoiceBroadcast = () => {
|
||||
if (recordingState !== VoiceBroadcastInfoState.Started) return;
|
||||
recording.stop();
|
||||
};
|
||||
|
||||
return <VoiceBroadcastRecordingBody
|
||||
onClick={stopVoiceBroadcast}
|
||||
live={recordingState === VoiceBroadcastInfoState.Started}
|
||||
sender={mxEvent.sender}
|
||||
roomName={room.name}
|
||||
recording={recording}
|
||||
/>;
|
||||
};
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
/*
|
||||
Copyright 2022 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.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -14,28 +11,26 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
import React, { MouseEventHandler } from "react";
|
||||
import { RoomMember } from "matrix-js-sdk/src/matrix";
|
||||
import React from "react";
|
||||
|
||||
import { VoiceBroadcastHeader } from "../..";
|
||||
import { useVoiceBroadcastRecording, VoiceBroadcastHeader, VoiceBroadcastRecording } from "../..";
|
||||
|
||||
interface VoiceBroadcastRecordingBodyProps {
|
||||
live: boolean;
|
||||
onClick: MouseEventHandler<HTMLDivElement>;
|
||||
roomName: string;
|
||||
sender: RoomMember;
|
||||
recording: VoiceBroadcastRecording;
|
||||
}
|
||||
|
||||
export const VoiceBroadcastRecordingBody: React.FC<VoiceBroadcastRecordingBodyProps> = ({
|
||||
live,
|
||||
onClick,
|
||||
roomName,
|
||||
sender,
|
||||
}) => {
|
||||
export const VoiceBroadcastRecordingBody: React.FC<VoiceBroadcastRecordingBodyProps> = ({ recording }) => {
|
||||
const {
|
||||
live,
|
||||
roomName,
|
||||
sender,
|
||||
stopRecording,
|
||||
} = useVoiceBroadcastRecording(recording);
|
||||
|
||||
return (
|
||||
<div
|
||||
className="mx_VoiceBroadcastRecordingBody"
|
||||
onClick={onClick}
|
||||
onClick={stopRecording}
|
||||
>
|
||||
<VoiceBroadcastHeader
|
||||
live={live}
|
||||
|
|
51
src/voice-broadcast/hooks/useVoiceBroadcastRecording.ts
Normal file
51
src/voice-broadcast/hooks/useVoiceBroadcastRecording.ts
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
Copyright 2022 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.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
import {
|
||||
VoiceBroadcastInfoState,
|
||||
VoiceBroadcastRecording,
|
||||
VoiceBroadcastRecordingEvent,
|
||||
VoiceBroadcastRecordingsStore,
|
||||
} from "..";
|
||||
import { useTypedEventEmitter } from "../../hooks/useEventEmitter";
|
||||
import { MatrixClientPeg } from "../../MatrixClientPeg";
|
||||
|
||||
export const useVoiceBroadcastRecording = (recording: VoiceBroadcastRecording) => {
|
||||
const client = MatrixClientPeg.get();
|
||||
const room = client.getRoom(recording.infoEvent.getRoomId());
|
||||
const stopRecording = () => {
|
||||
recording.stop();
|
||||
VoiceBroadcastRecordingsStore.instance().clearCurrent();
|
||||
};
|
||||
|
||||
const [live, setLive] = useState(recording.getState() === VoiceBroadcastInfoState.Started);
|
||||
useTypedEventEmitter(
|
||||
recording,
|
||||
VoiceBroadcastRecordingEvent.StateChanged,
|
||||
(state: VoiceBroadcastInfoState, _recording: VoiceBroadcastRecording) => {
|
||||
setLive(state === VoiceBroadcastInfoState.Started);
|
||||
},
|
||||
);
|
||||
|
||||
return {
|
||||
live,
|
||||
roomName: room.name,
|
||||
sender: recording.infoEvent.sender,
|
||||
stopRecording,
|
||||
};
|
||||
};
|
|
@ -30,6 +30,7 @@ export * from "./models/VoiceBroadcastRecording";
|
|||
export * from "./stores/VoiceBroadcastRecordingsStore";
|
||||
export * from "./utils/shouldDisplayAsVoiceBroadcastTile";
|
||||
export * from "./utils/startNewVoiceBroadcastRecording";
|
||||
export * from "./hooks/useVoiceBroadcastRecording";
|
||||
|
||||
export const VoiceBroadcastInfoEventType = "io.element.voice_broadcast_info";
|
||||
export const VoiceBroadcastChunkEventType = "io.element.voice_broadcast_chunk";
|
||||
|
|
|
@ -50,6 +50,13 @@ export class VoiceBroadcastRecordingsStore extends TypedEventEmitter<VoiceBroadc
|
|||
return this.current;
|
||||
}
|
||||
|
||||
public clearCurrent(): void {
|
||||
if (this.current === null) return;
|
||||
|
||||
this.current = null;
|
||||
this.emit(VoiceBroadcastRecordingsStoreEvent.CurrentChanged, null);
|
||||
}
|
||||
|
||||
public getByInfoEvent(infoEvent: MatrixEvent, client: MatrixClient): VoiceBroadcastRecording {
|
||||
const infoEventId = infoEvent.getId();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue