converted slug into reusable components

Signed-off-by: heyhiru <hirentimbadiya74@gmail.com>
Este commit está contenido en:
heyhiru
2023-11-14 18:09:24 +05:30
padre a733da9c1e
commit 6fac7c6321
Se han modificado 5 ficheros con 94 adiciones y 49 borrados

Ver fichero

@@ -1,6 +1,7 @@
import { useSocket } from '@/context/SocketProvider'; import { useSocket } from '@/context/SocketProvider';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import React, { useCallback, useEffect, useState } from 'react' import React, { useCallback, useEffect, useState } from 'react';
import VideoCallIcon from '@mui/icons-material/VideoCall';
const LobbyScreen = () => { const LobbyScreen = () => {
const [email, setEmail] = useState(""); const [email, setEmail] = useState("");
@@ -29,7 +30,12 @@ const LobbyScreen = () => {
return ( return (
<div className='flex flex-col items-center justify-center h-screen bg-gray-100'> <div className='flex flex-col items-center justify-center h-screen bg-gray-100'>
<h1 className='text-3xl font-semibold mb-5 mt-5 '>Lobby</h1> <h1 className='text-5xl font-[15px] mb-5 mt-5 text-center font-josefin italic'>Video<VideoCallIcon sx={{ fontSize: 70, color: 'rgb(30,220,30)' }} />Peers</h1>
<p className='text-2xl mt-2 mb-4 text-center md:max-w-[400px] max-w-[300px] text-gray-600'>
Peer-to-Peer video calls, powered by <b>WebRTC!</b>
<br />
Bring People Closer Together.
</p>
<div className='bg-white p-6 rounded shadow-md'> <div className='bg-white p-6 rounded shadow-md'>
<form className='flex flex-col items-center justify-center' <form className='flex flex-col items-center justify-center'
onSubmit={handleSubmitForm} onSubmit={handleSubmitForm}
@@ -38,6 +44,7 @@ const LobbyScreen = () => {
<input <input
type="email" type="email"
id='email' id='email'
required
value={email} value={email}
autoComplete='off' autoComplete='off'
onChange={(e) => setEmail(e.target.value)} onChange={(e) => setEmail(e.target.value)}
@@ -45,14 +52,15 @@ const LobbyScreen = () => {
<br /> <br />
<label htmlFor="room">Room Number</label> <label htmlFor="room">Room Number</label>
<input <input
type="text" type="number"
id='room' id='room'
required
autoComplete='off' autoComplete='off'
value={room} value={room}
onChange={(e) => setRoom(e.target.value)} onChange={(e) => setRoom(e.target.value)}
/> />
<br /> <br />
<button className='bg-blue-500 hover:bg-blue-600'> <button className='bg-blue-500 hover:bg-blue-600'>
Join Join
</button> </button>
</form> </form>

Ver fichero

@@ -0,0 +1,23 @@
import ReactPlayer from 'react-player';
const VideoPlayer = ({ stream, isAudioMute, name }) => (
<div className={`flex flex-col w-full ${name === "My Stream" ? "flex-1" : "items-center justify-center"}`}>
<div className={`${name === "My Stream" ? "absolute top-2 right-3 z-10" : "px-2"}`}>
<h1 className='text-xl font-poppins font-semibold md:text-2xl mb-1 text-center'>
{name === 'My Stream' ? 'My Stream' : 'Remote Stream'}
</h1>
<div className={`relative rounded-[30px] overflow-hidden
${name === "My Stream" ? "mmd:w-[140px] md:w-[200px] lg:w-[280px]" : "md:w-[600px]"}`}>
<ReactPlayer
url={stream}
playing
muted={isAudioMute}
height="auto"
width="auto"
/>
</div>
</div>
</div>
);
export default VideoPlayer;

Ver fichero

@@ -1,5 +1,4 @@
import LobbyScreen from '@/components/Lobby'; import LobbyScreen from '@/components/Lobby';
import SocketProvider from '@/context/SocketProvider';
export default function Home() { export default function Home() {
return ( return (

Ver fichero

@@ -2,6 +2,10 @@ import { useSocket } from '@/context/SocketProvider';
import React, { useCallback, useEffect, useState } from 'react' import React, { useCallback, useEffect, useState } from 'react'
import ReactPlayer from 'react-player'; import ReactPlayer from 'react-player';
import peer from '@/service/peer'; import peer from '@/service/peer';
import CallIcon from '@mui/icons-material/Call';
import VideoCallIcon from '@mui/icons-material/VideoCall';
import VideoPlayer from '@/components/VideoPlayer';
import CallHandleButtons from '@/components/CallHandleButtons';
const RoomPage = () => { const RoomPage = () => {
const socket = useSocket(); const socket = useSocket();
@@ -194,66 +198,50 @@ const RoomPage = () => {
}, [myStream, remoteSocketId, socket]); }, [myStream, remoteSocketId, socket]);
return ( return (
<div className='flex flex-col items-center justify-center h-screen'> <div className='flex flex-col items-center justify-center h-screen overflow-hidden'>
<h1 className='font-bold text-7xl md:text-5xl p-3'>RoomPage</h1> <h1 className='absolute top-0 left-0 text-5xl font-semibold
<h4 className='font-bold text-4xl md:text-xl p-3 mb-4'>{remoteSocketId ? "Connected" : "No One In Room"}</h4> text-center font-josefin italic mt-5 ml-5 mmd:text-xl mxs:text-sm'>Video
<VideoCallIcon sx={{ fontSize: 50, color: 'rgb(30,220,30)' }} />
Peers
</h1>
<h4 className='font-bold text-xl md:text-2xl mb-4
mmd:text-sm mt-5'>
{remoteSocketId ? "Connected With Remote User!" : "No One In Room"}
</h4>
{(remoteStream && remoteSocketId && isSendButtonVisible) && {(remoteStream && remoteSocketId && isSendButtonVisible) &&
<button className='bg-green-500 hover:bg-green-600' onClick={sendStreams}> <button className='bg-green-500 hover:bg-green-600' onClick={sendStreams}>
Send Stream Send Stream
</button> </button>
} }
{(remoteSocketId && callButton) && {(remoteSocketId && callButton) &&
<button className='bg-green-500 hover:bg-green-600' onClick={handleCallUser}> (
CALL <button className='text-xl bg-green-500 hover:bg-green-600 rounded-3xl animate-pulse'
</button> onClick={handleCallUser}
style={{ display: !remoteStream ? 'block' : 'none' }}>
Call <CallIcon fontSize='medium' />
</button>
)
} }
<div className="flex flex-row items-center justify-center space-x-4 mt-4"> <div className="flex flex-col w-full items-center justify-center mt-4">
{ {
myStream && myStream &&
<div className='flex flex-col items-center justify-center'> <VideoPlayer stream={myStream} name={"My Stream"} isAudioMute={isAudioMute} />
<h1 className='font-bold text-5xl md:text-3xl p-5'>
My Stream
</h1>
<ReactPlayer
url={myStream}
playing
muted={isAudioMute}
height={300}
width={500}
/>
</div>
} }
{ {
remoteStream && remoteStream &&
<div className='flex flex-col items-center justify-center'> <VideoPlayer stream={remoteStream} name={"Remote Stream"} isAudioMute={isAudioMute} />
<h1 className='font-bold text-5xl md:text-3xl p-5'>
Remote Stream
</h1>
<ReactPlayer
url={remoteStream}
playing
height={300}
width={500}
/>
</div>
} }
</div> </div>
{myStream && {myStream &&
( (
<div className='flex space-x-4 mt-4 h-20 items-center <CallHandleButtons
justify-center w-96 rounded-md bg-gray-100'> isAudioMute={isAudioMute}
<div className='flex w-[100%] justify-evenly'> isVideoOnHold={isVideoOnHold}
<button className="bg-purple-500 hover:bg-purple-700" onClick={handleToggleAudio}> onToggleAudio={handleToggleAudio}
{isAudioMute ? "Unmute" : "Mute"} onToggleVideo={handleToggleVideo}
</button> onEndCall={handleEndCall}
<button className="bg-purple-500 hover:bg-purple-700" onClick={handleToggleVideo}> />
{isVideoOnHold ? "Resume Video" : "Hold Video"}
</button>
<button className="bg-purple-500 hover:bg-purple-700" onClick={handleEndCall}>
End Call
</button>
</div>
</div>
)} )}
</div> </div>
) )

Ver fichero

@@ -1,3 +1,5 @@
@import url('https://fonts.googleapis.com/css2?family=Poppins&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@500&display=swap');
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@@ -37,4 +39,29 @@ button{
outline: 2px solid transparent; outline: 2px solid transparent;
outline-offset: 2px; outline-offset: 2px;
} }
}
.callButtons{
border-width: 1px;
font-weight: 500;
border-radius: 9999px;
font-size: 0.875rem;
line-height: 1.25rem;
padding: 0.625rem;
text-align: center;
display: inline-flex;
align-items: center;
&:hover{
color: white;
}
&:focus{
outline: 2px solid transparent;
outline-offset: 2px;
}
}
video{
object-fit: cover;
} }