|
@@ -16,13 +16,15 @@ import {
|
|
ParticipantEvent,
|
|
ParticipantEvent,
|
|
Track,
|
|
Track,
|
|
} from "livekit-client";
|
|
} from "livekit-client";
|
|
-import { useEffect, useState } from "react";
|
|
|
|
|
|
+import { useEffect, useRef, useState } from "react";
|
|
|
|
|
|
|
|
+import callingMp3 from "@/assets/audios/calling.mp3";
|
|
import OIMAvatar from "@/components/OIMAvatar";
|
|
import OIMAvatar from "@/components/OIMAvatar";
|
|
import { CustomType } from "@/constants";
|
|
import { CustomType } from "@/constants";
|
|
|
|
|
|
import { AuthData, InviteData } from "./data";
|
|
import { AuthData, InviteData } from "./data";
|
|
import { RtcControl } from "./RtcControl";
|
|
import { RtcControl } from "./RtcControl";
|
|
|
|
+
|
|
import { ShrinkOutlined, ArrowsAltOutlined } from '@ant-design/icons';
|
|
import { ShrinkOutlined, ArrowsAltOutlined } from '@ant-design/icons';
|
|
|
|
|
|
const localVideoClasses =
|
|
const localVideoClasses =
|
|
@@ -39,21 +41,21 @@ interface IRtcLayoutProps {
|
|
connectRtc: (data?: AuthData) => void;
|
|
connectRtc: (data?: AuthData) => void;
|
|
}
|
|
}
|
|
export const RtcLayout = ({
|
|
export const RtcLayout = ({
|
|
- connect,
|
|
|
|
- isConnected,
|
|
|
|
- isRecv,
|
|
|
|
- inviteData,
|
|
|
|
- connectRtc,
|
|
|
|
- sendCustomSignal,
|
|
|
|
- closeOverlay,
|
|
|
|
-}: IRtcLayoutProps) => {
|
|
|
|
|
|
+ connect,
|
|
|
|
+ isConnected,
|
|
|
|
+ isRecv,
|
|
|
|
+ inviteData,
|
|
|
|
+ connectRtc,
|
|
|
|
+ sendCustomSignal,
|
|
|
|
+ closeOverlay,
|
|
|
|
+ }: IRtcLayoutProps) => {
|
|
const isVideoCall = inviteData?.invitation?.mediaType === "video";
|
|
const isVideoCall = inviteData?.invitation?.mediaType === "video";
|
|
const tracks = useTracks([Track.Source.Camera]);
|
|
const tracks = useTracks([Track.Source.Camera]);
|
|
const remoteParticipant = tracks.find((track) => !isLocal(track.participant));
|
|
const remoteParticipant = tracks.find((track) => !isLocal(track.participant));
|
|
const isWaiting = !connect && !isConnected;
|
|
const isWaiting = !connect && !isConnected;
|
|
const [isRemoteVideoMuted, setIsRemoteVideoMuted] = useState(false);
|
|
const [isRemoteVideoMuted, setIsRemoteVideoMuted] = useState(false);
|
|
const [isShrink, setIsShrink] = useState(false);
|
|
const [isShrink, setIsShrink] = useState(false);
|
|
-
|
|
|
|
|
|
+ const callingRef = useRef<HTMLAudioElement>(null);
|
|
const connectState = useConnectionState();
|
|
const connectState = useConnectionState();
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
@@ -77,13 +79,33 @@ export const RtcLayout = ({
|
|
);
|
|
);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ if (isWaiting) {
|
|
|
|
+ handlePlay();
|
|
|
|
+ } else {
|
|
|
|
+ handlePause();
|
|
|
|
+ }
|
|
|
|
+ }, [isWaiting]);
|
|
|
|
+
|
|
|
|
+ const handlePlay = () => {
|
|
|
|
+ if (callingRef.current) {
|
|
|
|
+ callingRef.current.play();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const handlePause = () => {
|
|
|
|
+ if (callingRef.current) {
|
|
|
|
+ callingRef.current.pause();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
const setShrinkStatus = () => {
|
|
const setShrinkStatus = () => {
|
|
setIsShrink(!isShrink)
|
|
setIsShrink(!isShrink)
|
|
}
|
|
}
|
|
|
|
|
|
return (
|
|
return (
|
|
<Spin spinning={connectState === ConnectionState.Connecting}>
|
|
<Spin spinning={connectState === ConnectionState.Connecting}>
|
|
- <div className={`rtc-modal-content ${isShrink?'small':''}`}>
|
|
|
|
|
|
+ <div className={`rtc-modal-content ${isShrink ? "small" : ""}`}>
|
|
<div
|
|
<div
|
|
className={clsx(
|
|
className={clsx(
|
|
"flex h-full flex-col items-center justify-between bg-[#262729]",
|
|
"flex h-full flex-col items-center justify-between bg-[#262729]",
|
|
@@ -91,7 +113,7 @@ export const RtcLayout = ({
|
|
)}
|
|
)}
|
|
>
|
|
>
|
|
<div className="rtc-modal-scale" onClick={setShrinkStatus}>
|
|
<div className="rtc-modal-scale" onClick={setShrinkStatus}>
|
|
- {isShrink ? <ArrowsAltOutlined/> : <ShrinkOutlined/>}
|
|
|
|
|
|
+ {isShrink ? <ArrowsAltOutlined /> : <ShrinkOutlined />}
|
|
</div>
|
|
</div>
|
|
{renderContent()}
|
|
{renderContent()}
|
|
<RtcControl
|
|
<RtcControl
|
|
@@ -125,6 +147,7 @@ export const RtcLayout = ({
|
|
)}
|
|
)}
|
|
</div>
|
|
</div>
|
|
<RoomAudioRenderer />
|
|
<RoomAudioRenderer />
|
|
|
|
+ <audio controls={false} ref={callingRef} src={callingMp3} loop={true} />
|
|
</Spin>
|
|
</Spin>
|
|
);
|
|
);
|
|
};
|
|
};
|