added video URL change interaction with database

pull/3/head
Simon Huang 5 years ago
parent ceb90cf140
commit accaeaeac3

@ -9,8 +9,14 @@ const collection = {
messages: { messages: {
messageId: { messageId: {
createdAt: 'timestamp', createdAt: 'timestamp',
senderId: 'userId',
content: 'Message content', content: 'Message content',
senderId: 'userId',
},
},
playlist: {
videoId: {
createdAt: 'timestamp',
url: 'https://youtube.com',
}, },
}, },
}, },

@ -1,21 +1,36 @@
import { IonFabButton, IonIcon, IonInput, IonTitle, IonToolbar } from '@ionic/react'; import { IonFabButton, IonIcon, IonInput, IonTitle, IonToolbar } from '@ionic/react';
import { add } from 'ionicons/icons'; import { add } from 'ionicons/icons';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { db, timestamp } from '../services/firebase';
import './RoomHeader.css'; import './RoomHeader.css';
type VideoInputProps = { type VideoInputProps = {
changeUrl: (newUrl: string) => void; roomId: string;
userId: string;
ownerId: string;
videoId: string;
}; };
const VideoInput: React.FC<VideoInputProps> = ({ changeUrl }) => { const VideoInput: React.FC<VideoInputProps> = ({ roomId, userId, ownerId, videoId }) => {
const [url, setUrl] = useState(''); const [videoUrl, setVideoUrl] = useState('');
const onSubmit = () => { const onSubmit = async () => {
if (url !== '') { if (userId === ownerId) {
changeUrl(url); if (videoUrl !== '') {
await db.collection('rooms').doc(roomId).collection('playlist').doc(videoId).update({
url: videoUrl,
});
await db.collection('rooms').doc(roomId).collection('messages').add({
createdAt: timestamp,
senderId: userId,
content: 'changed the video',
type: 'system',
});
} }
setUrl(''); setVideoUrl('');
}
}; };
return ( return (
@ -23,19 +38,25 @@ const VideoInput: React.FC<VideoInputProps> = ({ changeUrl }) => {
<IonTitle slot="start" class="title"> <IonTitle slot="start" class="title">
Turtle Turtle
</IonTitle> </IonTitle>
{userId === ownerId ? (
<>
<IonInput <IonInput
slot="end" slot="end"
type="url" type="url"
inputmode="search" inputmode="search"
class="input-bar" class="input-bar"
placeholder="Upload new video by URL" placeholder="Upload new video by URL"
onIonChange={(e) => setUrl(e.detail.value!)} onIonChange={(e) => setVideoUrl(e.detail.value!)}
value={url} value={videoUrl}
onSubmit={onSubmit} onSubmit={onSubmit}
></IonInput> ></IonInput>
<IonFabButton slot="end" size="small" onClick={onSubmit}> <IonFabButton slot="end" size="small" onClick={onSubmit}>
<IonIcon icon={add}></IonIcon> <IonIcon icon={add}></IonIcon>
</IonFabButton> </IonFabButton>
</>
) : (
<></>
)}
</IonToolbar> </IonToolbar>
); );
}; };

@ -1,4 +1,4 @@
import React, { useRef, useState, useEffect } from 'react'; import React, { useEffect, useRef, useState } from 'react';
import ReactPlayer from 'react-player'; import ReactPlayer from 'react-player';
import { db, timestamp } from '../services/firebase'; import { db, timestamp } from '../services/firebase';
import { secondsToTimestamp, timestampToSeconds } from '../services/utilities'; import { secondsToTimestamp, timestampToSeconds } from '../services/utilities';
@ -7,12 +7,12 @@ type VideoPlayerProps = {
ownerId: string; ownerId: string;
userId: string; userId: string;
roomId: string; roomId: string;
url: string;
}; };
const VideoPlayer: React.FC<VideoPlayerProps> = ({ ownerId, userId, roomId, url }) => { const VideoPlayer: React.FC<VideoPlayerProps> = ({ ownerId, userId, roomId }) => {
const player = useRef<ReactPlayer>(null); const player = useRef<ReactPlayer>(null);
const [playing, setPlaying] = useState(false); const [playing, setPlaying] = useState(false);
const [videoUrl, setVideoUrl] = useState('');
// Send video playing message to database when owner plays video // Send video playing message to database when owner plays video
const onPlay = async () => { const onPlay = async () => {
@ -83,10 +83,27 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({ ownerId, userId, roomId, url
}; };
}, [roomId, userId]); }, [roomId, userId]);
// Listen for video URL changes
useEffect(() => {
const urlRef = db.collection('rooms').doc(roomId).collection('playlist');
const urlUnsubscribe = urlRef.onSnapshot((querySnapshot) => {
const changes = querySnapshot.docChanges();
for (const change of changes) {
const data = change.doc.data();
setVideoUrl(data.url);
}
});
return () => {
urlUnsubscribe();
};
}, [roomId]);
return ( return (
<ReactPlayer <ReactPlayer
ref={player} ref={player}
url={url} url={videoUrl}
width="100%" width="100%"
height="100%" height="100%"
controls={true} controls={true}

@ -1,9 +1,9 @@
import { IonButton, IonContent, IonGrid, IonHeader, IonPage, IonRow, IonTitle, IonToolbar } from '@ionic/react'; import { IonButton, IonContent, IonGrid, IonHeader, IonPage, IonRow, IonTitle, IonToolbar } from '@ionic/react';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { db, timestamp, auth, rtdb } from '../services/firebase'; import { auth, db, rtdb, timestamp } from '../services/firebase';
import './Home.css';
import { generateAnonName } from '../services/utilities'; import { generateAnonName } from '../services/utilities';
import './Home.css';
const Home: React.FC = () => { const Home: React.FC = () => {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
@ -18,6 +18,11 @@ const Home: React.FC = () => {
ownerId: userId, ownerId: userId,
}); });
await db.collection('rooms').doc(roomId.id).collection('playlist').add({
createdAt: timestamp,
url: 'https://www.youtube.com/watch?v=ksHOjnopT_U',
});
await rtdb.ref('/rooms/' + roomId.id).set({ userCount: 0 }); await rtdb.ref('/rooms/' + roomId.id).set({ userCount: 0 });
await rtdb.ref('/available/' + roomId.id).set({ name: 'Room Name', createdAt: new Date().toISOString() }); await rtdb.ref('/available/' + roomId.id).set({ name: 'Room Name', createdAt: new Date().toISOString() });
const path = '/room/' + roomId.id; const path = '/room/' + roomId.id;

@ -14,24 +14,30 @@ const Room: React.FC<RouteComponentProps<{ roomId: string }>> = ({ match }) => {
const [validRoom, setValidRoom] = useState(false); const [validRoom, setValidRoom] = useState(false);
const [userId, setUserId] = useState(''); const [userId, setUserId] = useState('');
const [ownerId, setOwnerId] = useState(''); const [ownerId, setOwnerId] = useState('undefined');
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [userCount, setUserCount] = useState(0); const [userCount, setUserCount] = useState(0);
const [url, setUrl] = useState('https://www.youtube.com/watch?v=ysz5S6PUM-U'); const [videoId, setVideoId] = useState('');
// Verify that the roomId exists in db // Verify that the roomId exists in db
useEffect(() => { useEffect(() => {
const fetchRoom = async () => { const fetchRoomAndVid = async () => {
const room = await db.collection('rooms').doc(roomId).get(); const roomRef = db.collection('rooms').doc(roomId);
const room = await roomRef.get();
if (!room.exists) { if (!room.exists) {
history.push('/'); history.push('/');
} else { } else {
setValidRoom(true); setValidRoom(true);
setOwnerId(room.data()?.ownerId); setOwnerId(room.data()?.ownerId);
// Set videoId for RoomHeader component
const playlistSnapshot = await roomRef.collection('playlist').get();
const vidId = playlistSnapshot.docs[0].id;
setVideoId(vidId);
} }
}; };
fetchRoom(); fetchRoomAndVid();
}, [history, roomId]); }, [history, roomId]);
// Handle logging in // Handle logging in
@ -128,15 +134,10 @@ const Room: React.FC<RouteComponentProps<{ roomId: string }>> = ({ match }) => {
} }
}, [userId, validRoom, roomId, loading, userCount]); }, [userId, validRoom, roomId, loading, userCount]);
// Function passed as prop to VideoInput component
const changeUrl = (newUrl: string) => {
setUrl(newUrl);
};
return ( return (
<IonPage> <IonPage>
<IonHeader> <IonHeader>
<RoomHeader changeUrl={changeUrl}></RoomHeader> <RoomHeader roomId={roomId} videoId={videoId} ownerId={ownerId} userId={userId}></RoomHeader>
</IonHeader> </IonHeader>
{loading ? ( {loading ? (
<IonContent className="ion-padding">Loading...</IonContent> <IonContent className="ion-padding">Loading...</IonContent>
@ -144,7 +145,7 @@ const Room: React.FC<RouteComponentProps<{ roomId: string }>> = ({ match }) => {
<IonGrid class="room-grid"> <IonGrid class="room-grid">
<IonRow class="room-row"> <IonRow class="room-row">
<IonCol size="12" sizeLg="9" class="player-col"> <IonCol size="12" sizeLg="9" class="player-col">
<VideoPlayer ownerId={ownerId} userId={userId} roomId={roomId} url={url}></VideoPlayer> <VideoPlayer ownerId={ownerId} userId={userId} roomId={roomId}></VideoPlayer>
</IonCol> </IonCol>
<IonCol size="12" sizeLg="3" class="chat-col"> <IonCol size="12" sizeLg="3" class="chat-col">
<Chat roomId={roomId} userId={userId}></Chat> <Chat roomId={roomId} userId={userId}></Chat>

Loading…
Cancel
Save