diff --git a/src/ConferenceCallManagerHooks.js b/src/ConferenceCallManagerHooks.js index cbb418e1..e72b04f7 100644 --- a/src/ConferenceCallManagerHooks.js +++ b/src/ConferenceCallManagerHooks.js @@ -221,11 +221,22 @@ export function useVideoRoom(manager, roomId, timeout = 5000) { }, timeout); } + function onLeaveCall() { + setState((prevState) => ({ + ...prevState, + videoMuted: manager.videoMuted, + micMuted: manager.micMuted, + })); + } + + manager.on("left", onLeaveCall); + return () => { manager.client.removeListener("Room", roomCallback); manager.removeListener("participants_changed", onParticipantsChanged); clearTimeout(timeoutId); manager.leaveCall(); + manager.removeListener("left", onLeaveCall); }; }, [manager, roomId]); diff --git a/src/Room.jsx b/src/Room.jsx index eca7c0f7..19d39eca 100644 --- a/src/Room.jsx +++ b/src/Room.jsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useMemo, useState, useRef } from "react"; import styles from "./Room.module.css"; import { useParams, useLocation } from "react-router-dom"; import { useVideoRoom } from "./ConferenceCallManagerHooks"; @@ -95,17 +95,15 @@ export function Room({ manager }) { )} {error &&
{error.message}
} {!loading && room && !joined && ( -
-

Members:

- - -
+ )} {!loading && room && joined && participants.length === 0 && (
@@ -126,3 +124,56 @@ export function Room({ manager }) {
); } + +function JoinRoom({ + joining, + joinCall, + manager, + toggleMuteVideo, + toggleMuteMic, + videoMuted, + micMuted, +}) { + const videoRef = useRef(); + const [hasPermissions, setHasPermissions] = useState(false); + const [needsPermissions, setNeedsPermissions] = useState(false); + + useEffect(() => { + manager.client + .getLocalVideoStream() + .then((stream) => { + if (videoRef.current) { + videoRef.current.srcObject = stream; + videoRef.current.play(); + setHasPermissions(true); + } + }) + .catch(() => { + if (videoRef.current) { + setNeedsPermissions(true); + } + }); + }, [manager]); + + return ( +
+
+ {needsPermissions && ( +

+ Webcam permissions needed to join the call. +

+ )} +
+ {hasPermissions && ( +
+ + +
+ )} + +
+ ); +} diff --git a/src/Room.module.css b/src/Room.module.css index 08c945d2..32253f4b 100644 --- a/src/Room.module.css +++ b/src/Room.module.css @@ -30,9 +30,45 @@ limitations under the License. flex: 1; } -.joinRoom ul { - margin-top: 0; - padding-left: 0; +.preview { + position: relative; + max-width: 400px; + border-radius: 24px; + overflow: hidden; + background-color: #444; + margin: 40px 20px 20px 20px; +} + +.preview video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.webcamPermissions { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + margin: 0; + font-size: 13px; + font-weight: 600; +} + +.previewButtons { + position: relative; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 20px; +} + +.previewButtons > * { + margin-right: 30px; +} + +.previewButtons > :last-child { + margin-right: 0px; } .centerMessage {