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:
-
- {room.getMembers().map((member) => (
- - {member.name}
- ))}
-
-
-
+
)}
{!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 {