Merge branch 'main' into hide-invite
This commit is contained in:
		
				commit
				
					
						684defdc19
					
				
			
		
					 3 changed files with 26 additions and 18 deletions
				
			
		| 
						 | 
					@ -29,6 +29,8 @@ export interface UrlParams {
 | 
				
			||||||
  preload: boolean;
 | 
					  preload: boolean;
 | 
				
			||||||
  // Whether to hide the room header when in a call
 | 
					  // Whether to hide the room header when in a call
 | 
				
			||||||
  hideHeader: boolean;
 | 
					  hideHeader: boolean;
 | 
				
			||||||
 | 
					  // Whether to hide the screen-sharing button
 | 
				
			||||||
 | 
					  hideScreensharing: boolean;
 | 
				
			||||||
  // Whether to start a walkie-talkie call instead of a video call
 | 
					  // Whether to start a walkie-talkie call instead of a video call
 | 
				
			||||||
  isPtt: boolean;
 | 
					  isPtt: boolean;
 | 
				
			||||||
  // Whether to use end-to-end encryption
 | 
					  // Whether to use end-to-end encryption
 | 
				
			||||||
| 
						 | 
					@ -84,6 +86,7 @@ export const getUrlParams = (
 | 
				
			||||||
    isEmbedded: hasParam("embed"),
 | 
					    isEmbedded: hasParam("embed"),
 | 
				
			||||||
    preload: hasParam("preload"),
 | 
					    preload: hasParam("preload"),
 | 
				
			||||||
    hideHeader: hasParam("hideHeader"),
 | 
					    hideHeader: hasParam("hideHeader"),
 | 
				
			||||||
 | 
					    hideScreensharing: hasParam("hideScreensharing"),
 | 
				
			||||||
    isPtt: hasParam("ptt"),
 | 
					    isPtt: hasParam("ptt"),
 | 
				
			||||||
    e2eEnabled: getParam("enableE2e") !== "false", // Defaults to true
 | 
					    e2eEnabled: getParam("enableE2e") !== "false", // Defaults to true
 | 
				
			||||||
    userId: getParam("userId"),
 | 
					    userId: getParam("userId"),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,7 @@ import { AudioContainer } from "../video-grid/AudioContainer";
 | 
				
			||||||
import { useAudioOutputDevice } from "../video-grid/useAudioOutputDevice";
 | 
					import { useAudioOutputDevice } from "../video-grid/useAudioOutputDevice";
 | 
				
			||||||
import { widget, ElementWidgetActions } from "../widget";
 | 
					import { widget, ElementWidgetActions } from "../widget";
 | 
				
			||||||
import { useJoinRule } from "./useJoinRule";
 | 
					import { useJoinRule } from "./useJoinRule";
 | 
				
			||||||
 | 
					import { useUrlParams } from "../UrlParams";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {});
 | 
					const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {});
 | 
				
			||||||
// There is currently a bug in Safari our our code with cloning and sending MediaStreams
 | 
					// There is currently a bug in Safari our our code with cloning and sending MediaStreams
 | 
				
			||||||
| 
						 | 
					@ -145,6 +146,8 @@ export function InCallView({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useAudioOutputDevice(audioRef, audioOutput);
 | 
					  useAudioOutputDevice(audioRef, audioOutput);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const { hideScreensharing } = useUrlParams();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    widget?.api.transport.send(
 | 
					    widget?.api.transport.send(
 | 
				
			||||||
      layout === "freedom"
 | 
					      layout === "freedom"
 | 
				
			||||||
| 
						 | 
					@ -333,12 +336,15 @@ export function InCallView({
 | 
				
			||||||
      <div className={styles.footer}>
 | 
					      <div className={styles.footer}>
 | 
				
			||||||
        <MicButton muted={microphoneMuted} onPress={toggleMicrophoneMuted} />
 | 
					        <MicButton muted={microphoneMuted} onPress={toggleMicrophoneMuted} />
 | 
				
			||||||
        <VideoButton muted={localVideoMuted} onPress={toggleLocalVideoMuted} />
 | 
					        <VideoButton muted={localVideoMuted} onPress={toggleLocalVideoMuted} />
 | 
				
			||||||
        {canScreenshare && !isSafari && !reducedControls && (
 | 
					        {canScreenshare &&
 | 
				
			||||||
          <ScreenshareButton
 | 
					          !hideScreensharing &&
 | 
				
			||||||
            enabled={isScreensharing}
 | 
					          !isSafari &&
 | 
				
			||||||
            onPress={toggleScreensharing}
 | 
					          !reducedControls && (
 | 
				
			||||||
          />
 | 
					            <ScreenshareButton
 | 
				
			||||||
        )}
 | 
					              enabled={isScreensharing}
 | 
				
			||||||
 | 
					              onPress={toggleScreensharing}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					          )}
 | 
				
			||||||
        {!reducedControls && (
 | 
					        {!reducedControls && (
 | 
				
			||||||
          <OverflowMenu
 | 
					          <OverflowMenu
 | 
				
			||||||
            inCall
 | 
					            inCall
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
				
			||||||
limitations under the License.
 | 
					limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React, { useEffect, useRef } from "react";
 | 
					import React, { FC, useEffect, useRef } from "react";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Participant } from "../room/InCallView";
 | 
					import { Participant } from "../room/InCallView";
 | 
				
			||||||
import { useCallFeed } from "./useCallFeed";
 | 
					import { useCallFeed } from "./useCallFeed";
 | 
				
			||||||
| 
						 | 
					@ -29,19 +29,22 @@ interface AudioForParticipantProps {
 | 
				
			||||||
  audioDestination: AudioNode;
 | 
					  audioDestination: AudioNode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function AudioForParticipant({
 | 
					export const AudioForParticipant: FC<AudioForParticipantProps> = ({
 | 
				
			||||||
  item,
 | 
					  item,
 | 
				
			||||||
  audioContext,
 | 
					  audioContext,
 | 
				
			||||||
  audioDestination,
 | 
					  audioDestination,
 | 
				
			||||||
}: AudioForParticipantProps): JSX.Element {
 | 
					}) => {
 | 
				
			||||||
  const { stream, localVolume, audioMuted } = useCallFeed(item.callFeed);
 | 
					  const { stream, localVolume } = useCallFeed(item.callFeed);
 | 
				
			||||||
  const [audioTrackCount] = useMediaStreamTrackCount(stream);
 | 
					  const [audioTrackCount] = useMediaStreamTrackCount(stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const gainNodeRef = useRef<GainNode>();
 | 
					  const gainNodeRef = useRef<GainNode>();
 | 
				
			||||||
  const sourceRef = useRef<MediaStreamAudioSourceNode>();
 | 
					  const sourceRef = useRef<MediaStreamAudioSourceNode>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    if (!item.isLocal && audioContext && !audioMuted && audioTrackCount > 0) {
 | 
					    // We don't compare the audioMuted flag of useCallFeed here, since unmuting
 | 
				
			||||||
 | 
					    // depends on to-device messages which may lag behind the audio actually
 | 
				
			||||||
 | 
					    // starting to flow over the network
 | 
				
			||||||
 | 
					    if (!item.isLocal && audioContext && audioTrackCount > 0) {
 | 
				
			||||||
      if (!gainNodeRef.current) {
 | 
					      if (!gainNodeRef.current) {
 | 
				
			||||||
        gainNodeRef.current = new GainNode(audioContext, {
 | 
					        gainNodeRef.current = new GainNode(audioContext, {
 | 
				
			||||||
          gain: localVolume,
 | 
					          gain: localVolume,
 | 
				
			||||||
| 
						 | 
					@ -68,12 +71,11 @@ export function AudioForParticipant({
 | 
				
			||||||
    audioDestination,
 | 
					    audioDestination,
 | 
				
			||||||
    stream,
 | 
					    stream,
 | 
				
			||||||
    localVolume,
 | 
					    localVolume,
 | 
				
			||||||
    audioMuted,
 | 
					 | 
				
			||||||
    audioTrackCount,
 | 
					    audioTrackCount,
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return null;
 | 
					  return null;
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface AudioContainerProps {
 | 
					interface AudioContainerProps {
 | 
				
			||||||
  items: Participant[];
 | 
					  items: Participant[];
 | 
				
			||||||
| 
						 | 
					@ -81,10 +83,7 @@ interface AudioContainerProps {
 | 
				
			||||||
  audioDestination: AudioNode;
 | 
					  audioDestination: AudioNode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function AudioContainer({
 | 
					export const AudioContainer: FC<AudioContainerProps> = ({ items, ...rest }) => {
 | 
				
			||||||
  items,
 | 
					 | 
				
			||||||
  ...rest
 | 
					 | 
				
			||||||
}: AudioContainerProps): JSX.Element {
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {items
 | 
					      {items
 | 
				
			||||||
| 
						 | 
					@ -94,4 +93,4 @@ export function AudioContainer({
 | 
				
			||||||
        ))}
 | 
					        ))}
 | 
				
			||||||
    </>
 | 
					    </>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue