@@ -40,6 +40,10 @@ export default function RoomPage() {
4040 subscribeToVideoUpdates,
4141 subscribeToVideoSync,
4242 syncVideoState,
43+ addToPlaylist,
44+ subscribeToPlaylistUpdates,
45+ nextVideo,
46+ videoEnded,
4347 } = useSocket ( ) ;
4448
4549 const [ messages , setMessages ] = useState < Message [ ] > ( [ ] ) ;
@@ -52,6 +56,9 @@ export default function RoomPage() {
5256 } ) ;
5357 const [ createdAt , setCreatedAt ] = useState ( '' ) ;
5458 const [ elapsedTime , setElapsedTime ] = useState ( '' ) ;
59+ const [ playlist , setPlaylist ] = useState < string [ ] > ( [ ] ) ;
60+ const [ currentVideoIndex , setCurrentVideoIndex ] = useState ( 0 ) ;
61+ const [ isPlayingFromPlaylist , setIsPlayingFromPlaylist ] = useState ( false ) ;
5562
5663 const playerRef = useRef < YouTubePlayer | null > ( null ) ;
5764 const playerInitializedRef = useRef ( false ) ;
@@ -77,9 +84,12 @@ export default function RoomPage() {
7784 type : 'video-pause' ,
7885 timestamp : currentTime ,
7986 } ) ;
87+ } else if ( playerState === 0 ) {
88+ videoEnded ( roomId ) ;
89+ // nextVideo(roomId);
8090 }
8191 } ,
82- [ roomId , syncVideoState ]
92+ [ roomId , syncVideoState , videoEnded ]
8393 ) ;
8494
8595 useEffect ( ( ) => {
@@ -90,12 +100,10 @@ export default function RoomPage() {
90100 const roomData = ( await joinRoom ( roomId ) ) as RoomData ;
91101 if ( roomData ) {
92102 setMessages ( roomData . messages || [ ] ) ;
93- if ( roomData . videoUrl ) {
94- setVideoUrl ( roomData . videoUrl ) ;
95- }
96- if ( roomData . createdAt ) {
97- setCreatedAt ( roomData . createdAt ) ;
98- }
103+ setVideoUrl ( roomData . videoUrl || '' ) ;
104+ setCreatedAt ( roomData . createdAt ) ;
105+ setPlaylist ( roomData . playlist || [ ] ) ;
106+ setCurrentVideoIndex ( roomData . currentVideoIndex ) ;
99107 }
100108 } catch ( error ) {
101109 console . error ( 'Error joining room:' , error ) ;
@@ -131,6 +139,7 @@ export default function RoomPage() {
131139 if ( url && typeof url === 'string' ) {
132140 setVideoUrl ( url ) ;
133141 playerInitializedRef . current = false ;
142+ setIsPlayingFromPlaylist ( false ) ;
134143 }
135144 } ) ;
136145
@@ -259,18 +268,30 @@ export default function RoomPage() {
259268 ) ;
260269 } ;
261270
262- // Update immediately
263271 updateElapsedTime ( ) ;
264272
265- // Update every minute
266273 const interval = setInterval ( updateElapsedTime , 60000 ) ;
267274
268275 return ( ) => clearInterval ( interval ) ;
269276 } , [ createdAt ] ) ;
270277
278+ useEffect ( ( ) => {
279+ if ( ! isConnected ) return ;
280+
281+ const unsubscribe = subscribeToPlaylistUpdates ( ( data ) => {
282+ setPlaylist ( data . playlist ) ;
283+ setCurrentVideoIndex ( data . currentVideoIndex ) ;
284+ } ) ;
285+
286+ return unsubscribe ;
287+ } , [ isConnected , subscribeToPlaylistUpdates ] ) ;
288+
271289 return (
272290 < div className = "flex flex-col min-h-screen" >
273- < RoomHeader participants = { participants } roomId = { roomId } />
291+ < RoomHeader
292+ participants = { participants }
293+ onAddVideo = { ( url ) => addToPlaylist ( roomId , url ) }
294+ />
274295 < main className = "flex-1 grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-0 relative mt-16" >
275296 < div className = "flex flex-col overflow-y-auto" >
276297 < div
@@ -290,7 +311,31 @@ export default function RoomPage() {
290311 < div className = "flex items-center gap-2 mt-2" >
291312 < p className = "text-sm text-gray-500" > { videoMetadata . creator } </ p >
292313 < span className = "text-sm text-gray-500" > •</ span >
293- < p className = "text-sm text-gray-500" > { elapsedTime } </ p >
314+ < p className = "text-sm text-gray-500" > Created { elapsedTime } </ p >
315+ </ div >
316+ </ div >
317+ ) }
318+
319+ { playlist . length > 0 && (
320+ < div className = "p-4 border-t" >
321+ < h2 className = "font-semibold mb-4" >
322+ Playlist ({ playlist . length } videos)
323+ </ h2 >
324+ < div className = "space-y-2" >
325+ { playlist . map ( ( videoUrl , index ) => (
326+ < div
327+ key = { videoUrl }
328+ className = { `p-2 rounded ${
329+ index === currentVideoIndex && isPlayingFromPlaylist
330+ ? 'bg-accent'
331+ : 'hover:bg-accent/50'
332+ } `}
333+ >
334+ < p className = "text-sm" >
335+ { index + 1 } . { videoUrl }
336+ </ p >
337+ </ div >
338+ ) ) }
294339 </ div >
295340 </ div >
296341 ) }
0 commit comments