Basic session creation flow #2
					 7 changed files with 128 additions and 6 deletions
				
			
		
							
								
								
									
										52
									
								
								frontend/create.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								frontend/create.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|     <title>watch party :D</title> | ||||
|     <link rel="stylesheet" href="/styles.css?v=3" /> | ||||
|   </head> | ||||
| 
 | ||||
|   <body> | ||||
|     <noscript> | ||||
|       This site will <em>not</em> work without JavaScript, and there's not | ||||
|       really any way around that :( | ||||
|     </noscript> | ||||
| 
 | ||||
|     <div id="create-controls"> | ||||
|       <form id="create-session-form"> | ||||
|         <h2>Create a session</h2> | ||||
| 
 | ||||
|         <label for="create-session-video">Video:</label> | ||||
|         <input | ||||
|           type="text" | ||||
|           id="create-session-video" | ||||
|           placeholder="https://video.example.com/example.mp4" | ||||
|           required | ||||
|         /> | ||||
| 
 | ||||
|         <!-- TODO: Ability to add multiple subtitles for different languages --> | ||||
|         <label for="create-session-subs">Subtitles:</label> | ||||
|         <input | ||||
|           type="text" | ||||
|           id="create-session-subs" | ||||
|           placeholder="https://video.example.com/example.vtt" | ||||
|         /> | ||||
| 
 | ||||
|         <label for="create-session-subs-name">Subtitle track name:</label> | ||||
|         <input | ||||
|           type="text" | ||||
|           id="create-session-subs-name" | ||||
|           placeholder="English" | ||||
|         /> | ||||
|         <button>Create</button> | ||||
|       </form> | ||||
| 
 | ||||
|       <p> | ||||
|         Already have a session? | ||||
|         <a href="/">Join your session</a> instead. | ||||
|       </p> | ||||
|     </div> | ||||
| 
 | ||||
|     <script type="module" src="/create.mjs?v=1"></script> | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										11
									
								
								frontend/create.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								frontend/create.mjs
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | |||
| import { setupCreateSessionForm } from "./lib/create-session.mjs"; | ||||
| 
 | ||||
| const main = () => { | ||||
|   setupCreateSessionForm(); | ||||
| }; | ||||
| 
 | ||||
| if (document.readyState === "complete") { | ||||
|   main(); | ||||
| } else { | ||||
|   document.addEventListener("DOMContentLoaded", main); | ||||
| } | ||||
|  | @ -3,7 +3,7 @@ | |||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|     <title>watch party :D</title> | ||||
|     <link rel="stylesheet" href="/styles.css?v=2" /> | ||||
|     <link rel="stylesheet" href="/styles.css?v=3" /> | ||||
|   </head> | ||||
| 
 | ||||
|   <body> | ||||
|  | @ -16,7 +16,12 @@ | |||
|       <form id="join-session-form"> | ||||
|         <h2>Join a session</h2> | ||||
| 
 | ||||
|         <label for="nickname">Nickname:</label> | ||||
|         <p id="post-create-message"> | ||||
|           Your session has been created successfully. Copy the current url or | ||||
|           the Session ID below and share it with your friends. :) | ||||
|         </p> | ||||
| 
 | ||||
|         <label for="join-session-nickname">Nickname:</label> | ||||
|         <input | ||||
|           type="text" | ||||
|           id="join-session-nickname" | ||||
|  | @ -24,7 +29,7 @@ | |||
|           required | ||||
|         /> | ||||
| 
 | ||||
|         <label for="session-id">Session ID:</label> | ||||
|         <label for="join-session-id">Session ID:</label> | ||||
|         <input | ||||
|           type="text" | ||||
|           id="join-session-id" | ||||
|  |  | |||
							
								
								
									
										18
									
								
								frontend/lib/create-session.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								frontend/lib/create-session.mjs
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| import { createSession } from "./watch-session.mjs?v=3"; | ||||
| 
 | ||||
| export const setupCreateSessionForm = () => { | ||||
|   const form = document.querySelector("#create-session-form"); | ||||
|   const videoUrl = form.querySelector("#create-session-video"); | ||||
|   const subsUrl = form.querySelector("#create-session-subs"); | ||||
|   const subsName = form.querySelector("#create-session-subs-name"); | ||||
| 
 | ||||
|   form.addEventListener("submit", (event) => { | ||||
|     event.preventDefault(); | ||||
| 
 | ||||
|     let subs = []; | ||||
|     if (subsUrl.value) { | ||||
|       subs.push({ url: subsUrl.value, name: subsName.value || "default" }); | ||||
|     } | ||||
|     createSession(videoUrl.value, subs); | ||||
|   }); | ||||
| }; | ||||
|  | @ -1,4 +1,4 @@ | |||
| import { joinSession } from "./watch-session.mjs?v=2"; | ||||
| import { joinSession } from "./watch-session.mjs?v=3"; | ||||
| 
 | ||||
| /** | ||||
|  * @param {HTMLInputElement} field | ||||
|  | @ -23,7 +23,17 @@ const saveNickname = (field) => { | |||
|   } | ||||
| }; | ||||
| 
 | ||||
| const displayPostCreateMessage = () => { | ||||
|   const params = new URLSearchParams(window.location.search); | ||||
|   if (params.get("created") == "true") { | ||||
|     document.querySelector("#post-create-message").style["display"] = "block"; | ||||
|     window.history.replaceState({}, document.title, `/${window.location.hash}`); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| export const setupJoinSessionForm = () => { | ||||
|   displayPostCreateMessage(); | ||||
| 
 | ||||
|   const form = document.querySelector("#join-session-form"); | ||||
|   const nickname = form.querySelector("#join-session-nickname"); | ||||
|   const sessionId = form.querySelector("#join-session-id"); | ||||
|  |  | |||
|  | @ -167,3 +167,20 @@ export const joinSession = async (nickname, sessionId) => { | |||
|     console.error(err); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} videoUrl | ||||
|  * @param {Array} subtitleTracks | ||||
|  */ | ||||
| export const createSession = async (videoUrl, subtitleTracks) => { | ||||
|   const { id } = await fetch("/start_session", { | ||||
|     method: "POST", | ||||
|     headers: { "Content-Type": "application/json" }, | ||||
|     body: JSON.stringify({ | ||||
|       video_url: videoUrl, | ||||
|       subtitle_tracks: subtitleTracks, | ||||
|     }), | ||||
|   }).then((r) => r.json()); | ||||
| 
 | ||||
|   window.location = `/?created=true#${id}`; | ||||
| }; | ||||
|  |  | |||
|  | @ -106,16 +106,25 @@ button.small-button { | |||
|   margin-right: 1ch !important; | ||||
| } | ||||
| 
 | ||||
| #pre-join-controls { | ||||
| #pre-join-controls, | ||||
| #create-controls { | ||||
|   width: 60%; | ||||
|   margin: 0 auto; | ||||
|   margin-top: 4em; | ||||
| } | ||||
| 
 | ||||
| #join-session-form { | ||||
| #join-session-form, | ||||
| #create-session-form { | ||||
|   margin-bottom: 4em; | ||||
| } | ||||
| 
 | ||||
| #post-create-message { | ||||
|   display: none; | ||||
|   width: 500px; | ||||
|   max-width: 100%; | ||||
|   font-size: 0.85em; | ||||
| } | ||||
| 
 | ||||
| #chatbox-container { | ||||
|   display: none; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue