mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
101 lines
4.1 KiB
JavaScript
101 lines
4.1 KiB
JavaScript
import { injectNavbar } from '../modules/front_end_components/Navbar.js';
|
|
import { toast } from '../modules/front_end_components/Toast.js';
|
|
import { UserUtility } from '../modules/utility/UserUtility.js';
|
|
import { ENVIRONMENTS, PRIMITIVES } from '../config/globals.js';
|
|
|
|
const join = () => {
|
|
injectNavbar();
|
|
const splitUrl = window.location.pathname.split('/join/');
|
|
const accessCode = splitUrl[1];
|
|
if (/^[a-zA-Z0-9]+$/.test(accessCode) && accessCode.length === PRIMITIVES.ACCESS_CODE_LENGTH) {
|
|
document.getElementById('game-code').innerText = accessCode;
|
|
document.getElementById('game-time').innerText =
|
|
decodeURIComponent((new URL(document.location)).searchParams.get('timer'));
|
|
document.getElementById('game-player-count').innerText =
|
|
decodeURIComponent((new URL(document.location)).searchParams.get('playerCount')) + ' Players';
|
|
const form = document.getElementById('join-game-form');
|
|
form.onsubmit = joinHandler;
|
|
} else {
|
|
window.location = '/not-found?reason=' + encodeURIComponent('invalid-access-code');
|
|
}
|
|
};
|
|
|
|
const joinHandler = (e) => {
|
|
const splitUrl = window.location.pathname.split('/join/');
|
|
const accessCode = splitUrl[1];
|
|
e.preventDefault();
|
|
const name = document.getElementById('player-new-name').value;
|
|
if (validateName(name)) {
|
|
sendJoinRequest(e, name, accessCode)
|
|
.then((res) => {
|
|
if (!res.ok && !(res.status === 304)) {
|
|
switch (res.status) {
|
|
case 404:
|
|
toast('Game not found', 'error', true);
|
|
break;
|
|
case 400:
|
|
res.text().then(text => {
|
|
toast(text, 'error', true);
|
|
});
|
|
break;
|
|
default:
|
|
toast('There was a problem joining the game', 'error', true);
|
|
break;
|
|
}
|
|
resetJoinButtonState(e, joinHandler);
|
|
} else {
|
|
res.json().then(json => {
|
|
UserUtility.setAnonymousUserId(json.cookie, json.environment);
|
|
resetJoinButtonState(e, joinHandler);
|
|
window.location = '/game/' + accessCode;
|
|
});
|
|
}
|
|
}).catch(() => {
|
|
toast('Problems with the server are preventing your request to join the game.', 'error', true);
|
|
resetJoinButtonState(e, joinHandler);
|
|
});
|
|
} else {
|
|
toast('Name must be between 1 and ' + PRIMITIVES.MAX_PERSON_NAME_LENGTH + ' characters.', 'error', true, true, 'long');
|
|
}
|
|
};
|
|
|
|
function sendJoinRequest (e, name, accessCode) {
|
|
document.getElementById('join-game-form').onsubmit = null;
|
|
document.getElementById('join-submit').classList.add('submitted');
|
|
document.getElementById('join-submit').setAttribute('value', '...');
|
|
|
|
return fetch(
|
|
'/api/games/' + accessCode + '/players',
|
|
{
|
|
method: 'PATCH',
|
|
mode: 'cors',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({
|
|
playerName: name,
|
|
accessCode: accessCode,
|
|
sessionCookie: UserUtility.validateAnonUserSignature(ENVIRONMENTS.LOCAL),
|
|
localCookie: UserUtility.validateAnonUserSignature(ENVIRONMENTS.PRODUCTION),
|
|
joinAsSpectator: document.getElementById('join-as-spectator').checked
|
|
})
|
|
}
|
|
);
|
|
}
|
|
|
|
function resetJoinButtonState (e, joinHandler) {
|
|
document.getElementById('join-game-form').onsubmit = joinHandler;
|
|
e.submitter.classList.remove('submitted');
|
|
e.submitter.setAttribute('value', 'Join');
|
|
}
|
|
|
|
function validateName (name) {
|
|
return typeof name === 'string' && name.length > 0 && name.length <= PRIMITIVES.MAX_PERSON_NAME_LENGTH;
|
|
}
|
|
|
|
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
|
|
module.exports = join;
|
|
} else {
|
|
join();
|
|
}
|