"use client" | |
import * as React from "react" | |
import { | |
ICameraVideoTrack, | |
ILocalVideoTrack, | |
IMicrophoneAudioTrack, | |
VideoPlayerConfig, | |
} from "agora-rtc-sdk-ng" | |
export interface StreamPlayerProps { | |
videoTrack?: ICameraVideoTrack | ILocalVideoTrack | |
audioTrack?: IMicrophoneAudioTrack | |
style?: React.CSSProperties | |
fit?: "cover" | "contain" | "fill" | |
onClick?: () => void | |
mute?: boolean | |
} | |
export const LocalStreamPlayer = React.forwardRef( | |
(props: StreamPlayerProps, ref) => { | |
const { | |
videoTrack, | |
audioTrack, | |
mute = false, | |
style = {}, | |
fit = "cover", | |
onClick = () => {}, | |
} = props | |
const vidDiv = React.useRef(null) | |
React.useLayoutEffect(() => { | |
const config = { fit } as VideoPlayerConfig | |
if (mute) { | |
videoTrack?.stop() | |
} else { | |
if (!videoTrack?.isPlaying) { | |
videoTrack?.play(vidDiv.current!, config) | |
} | |
} | |
return () => { | |
videoTrack?.stop() | |
} | |
}, [videoTrack, fit, mute]) | |
// local audio track need not to be played | |
// useLayoutEffect(() => {}, [audioTrack, localAudioMute]) | |
return ( | |
<div | |
className="relative h-full w-full overflow-hidden" | |
style={style} | |
ref={vidDiv} | |
onClick={onClick} | |
/> | |
) | |
}, | |
) | |