forked from lavender/watch-party
Improve global state handling
This commit is contained in:
parent
9a2ac1c432
commit
40b20b2157
6 changed files with 51 additions and 49 deletions
|
@ -5,7 +5,8 @@ import {
|
|||
} from "./watch-session.mjs?v=048af96";
|
||||
import { emojify, findEmojis } from "./emojis.mjs?v=048af96";
|
||||
import { linkify } from "./links.mjs?v=048af96";
|
||||
import { joinNewSession } from "./watch-session.mjs?v=048af96";
|
||||
import { joinSession } from "./watch-session.mjs?v=048af96";
|
||||
import { state } from "./state.mjs";
|
||||
|
||||
function setCaretPosition(elem, caretPos) {
|
||||
if (elem.createTextRange) {
|
||||
|
@ -191,7 +192,8 @@ const setupChatboxEvents = (socket) => {
|
|||
handled = true;
|
||||
break;
|
||||
case "/join":
|
||||
joinNewSession(args);
|
||||
state().sessionId = args;
|
||||
joinSession();
|
||||
handled = true;
|
||||
break;
|
||||
case "/help":
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { joinSession } from "./watch-session.mjs?v=048af96";
|
||||
import { state } from "./state.mjs";
|
||||
|
||||
/**
|
||||
* @param {HTMLInputElement} field
|
||||
|
@ -80,11 +81,10 @@ export const setupJoinSessionForm = () => {
|
|||
saveNickname(nickname);
|
||||
saveColour(colour);
|
||||
try {
|
||||
await joinSession(
|
||||
nickname.value,
|
||||
sessionId.value,
|
||||
colour.value.replace(/^#/, "")
|
||||
);
|
||||
state().nickname = nickname.value;
|
||||
state().sessionId = sessionId.value;
|
||||
state().colour = colour.value.replace(/^#/, "");
|
||||
await joinSession();
|
||||
} catch (e) {
|
||||
alert(e.message);
|
||||
button.disabled = false;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { joinNewSession } from "./watch-session.mjs?v=048af96";
|
||||
import { joinSession } from "./watch-session.mjs?v=048af96";
|
||||
import { state } from "./state.mjs";
|
||||
|
||||
export async function linkify(
|
||||
text,
|
||||
|
@ -34,7 +35,8 @@ export async function linkify(
|
|||
textContent: "Join Session",
|
||||
className: "chip join-chip",
|
||||
onclick: () => {
|
||||
joinNewSession(url.hash.substring(1));
|
||||
state().sessionId = url.hash.substring(1);
|
||||
joinSession();
|
||||
},
|
||||
})
|
||||
);
|
||||
|
|
7
frontend/lib/state.mjs
Normal file
7
frontend/lib/state.mjs
Normal file
|
@ -0,0 +1,7 @@
|
|||
let instance = null;
|
||||
export const state = () => {
|
||||
if (!instance) {
|
||||
instance = {};
|
||||
}
|
||||
return instance;
|
||||
};
|
|
@ -51,7 +51,12 @@ const saveCaptionsTrack = (track) => {
|
|||
* @param {{name: string, url: string}[]} subtitles
|
||||
*/
|
||||
const createVideoElement = (videoUrl, subtitles) => {
|
||||
const oldVideo = document.getElementById("video");
|
||||
if (oldVideo) {
|
||||
oldVideo.remove();
|
||||
}
|
||||
const video = document.createElement("video");
|
||||
video.id = "video";
|
||||
video.controls = true;
|
||||
video.autoplay = false;
|
||||
video.volume = loadVolume();
|
||||
|
|
|
@ -6,17 +6,18 @@ import {
|
|||
printChatMessage,
|
||||
} from "./chat.mjs?v=048af96";
|
||||
import ReconnectingWebSocket from "./reconnecting-web-socket.mjs";
|
||||
import { state } from "./state.mjs";
|
||||
|
||||
/**
|
||||
* @param {string} sessionId
|
||||
* @param {string} nickname
|
||||
* @returns {ReconnectingWebSocket}
|
||||
*/
|
||||
const createWebSocket = (sessionId, nickname, colour) => {
|
||||
const createWebSocket = () => {
|
||||
const wsUrl = new URL(
|
||||
`/sess/${sessionId}/subscribe` +
|
||||
`?nickname=${encodeURIComponent(nickname)}` +
|
||||
`&colour=${encodeURIComponent(colour)}`,
|
||||
`/sess/${state().sessionId}/subscribe` +
|
||||
`?nickname=${encodeURIComponent(state().nickname)}` +
|
||||
`&colour=${encodeURIComponent(state().colour)}`,
|
||||
window.location.href
|
||||
);
|
||||
wsUrl.protocol = "ws" + window.location.protocol.slice(4);
|
||||
|
@ -167,49 +168,29 @@ const setupOutgoingEvents = (video, socket) => {
|
|||
});
|
||||
};
|
||||
|
||||
let socket = null;
|
||||
let video = null;
|
||||
export const joinSession = async () => {
|
||||
if (state().activeSession) {
|
||||
if (state().activeSession === state().sessionId) {
|
||||
// we are already in this session, dont rejoin
|
||||
return;
|
||||
}
|
||||
// we are joining a new session from an existing session
|
||||
const messageContent = document.createElement("span");
|
||||
messageContent.appendChild(document.createTextNode("joining new session "));
|
||||
messageContent.appendChild(document.createTextNode(state().sessionId));
|
||||
|
||||
export const joinNewSession = async (sessionId) => {
|
||||
const messageContent = document.createElement("span");
|
||||
messageContent.appendChild(document.createTextNode("joining new session "));
|
||||
messageContent.appendChild(document.createTextNode(sessionId));
|
||||
|
||||
printChatMessage("join-session", "watch-party", "#fffff", messageContent);
|
||||
|
||||
// clean up previous session
|
||||
// TODO: this most likely isnt properly working yet when using the /join command to join a new session
|
||||
if (socket != null) {
|
||||
socket.close();
|
||||
socket = null;
|
||||
printChatMessage("join-session", "watch-party", "#fffff", messageContent);
|
||||
}
|
||||
if (video != null) {
|
||||
video.remove();
|
||||
video = null;
|
||||
}
|
||||
|
||||
joinSession(window.nickname, sessionId, sColour);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} nickname
|
||||
* @param {string} sessionId
|
||||
* @param {string} colour
|
||||
*/
|
||||
export const joinSession = async (nickname, sessionId, colour) => {
|
||||
// TODO: we are getting to a point with our features where some kind of
|
||||
// state store for the various info that is needed in a lot of places would probably make sense
|
||||
window.nickname = nickname;
|
||||
window.colour = colour;
|
||||
state().activeSession = state().sessionId;
|
||||
|
||||
// try { // we are handling errors in the join form.
|
||||
const genericConnectionError = new Error(
|
||||
"There was an issue getting the session information."
|
||||
);
|
||||
window.location.hash = sessionId;
|
||||
window.location.hash = state().sessionId;
|
||||
let response, video_url, subtitle_tracks, current_time_ms, is_playing;
|
||||
try {
|
||||
response = await fetch(`/sess/${sessionId}`);
|
||||
response = await fetch(`/sess/${state().sessionId}`);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
throw genericConnectionError;
|
||||
|
@ -233,9 +214,14 @@ export const joinSession = async (nickname, sessionId, colour) => {
|
|||
throw genericConnectionError;
|
||||
}
|
||||
|
||||
socket = createWebSocket(sessionId, nickname, colour);
|
||||
if (state().socket) {
|
||||
state().socket.close();
|
||||
state().socket = null;
|
||||
}
|
||||
const socket = createWebSocket();
|
||||
state().socket = socket;
|
||||
socket.addEventListener("open", async () => {
|
||||
video = await setupVideo(
|
||||
const video = await setupVideo(
|
||||
video_url,
|
||||
subtitle_tracks,
|
||||
current_time_ms,
|
||||
|
|
Loading…
Reference in a new issue