From 9efb9dcd47c4054c2c17a75195eba8ea9af0b66b Mon Sep 17 00:00:00 2001 From: Charles Gould Date: Thu, 2 Feb 2017 02:25:32 -0500 Subject: [PATCH 1/3] Vueify the web client --- server/src/main/resources/static/client.js | 230 +++++++++----------- server/src/main/resources/static/index.html | 33 ++- server/src/main/resources/static/style.css | 20 +- 3 files changed, 128 insertions(+), 155 deletions(-) diff --git a/server/src/main/resources/static/client.js b/server/src/main/resources/static/client.js index 78d65bc..06ea55a 100644 --- a/server/src/main/resources/static/client.js +++ b/server/src/main/resources/static/client.js @@ -12,14 +12,11 @@ var myGuess; var myGuesses; var myProgress; var myResults; -var myUsername; var opponentScore = 0; var opponentResults; var opponentUsername; var lastWord; -var appDiv = document.getElementById('appDiv'); -var canvasDiv = document.getElementById('canvasDiv'); var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); @@ -30,11 +27,18 @@ var vm = new Vue({ el: '#vue-app', data: { games: [], - gameId: null + gameId: null, + messages: [], + username: null, + usernameError: '' }, computed: { inGame: function() { return this.gameId !== null; + }, + inStartedGame: function() { + var game = getGame(this.gameId); + return game !== null && game.started === true; } }, methods: { @@ -49,6 +53,49 @@ var vm = new Vue({ }, leaveGame: function(event) { client.send('/app/leaveGame'); + }, + onCanvasKeydown: function(event) { + if (event.which === KEYCODE_BACKSPACE) { + event.preventDefault(); + myGuess = myGuess.substr(0, myGuess.length - 1); + repaint(); + } + else if (event.which === KEYCODE_RETURN) { + if (myGuess.length === 5) { + client.send("/app/guess", {}, myGuess); + myGuess = ''; + repaint(); + } + } + }, + onCanvasKeypress: function(event) { + var charCode = event.charCode; + if (isCharacter(charCode)) { + if (isCharacterLowercase(charCode)) { + charCode = charCode - 32; + } + var char = String.fromCharCode(charCode); + if (myGuess.length < 5) { + myGuess += char; + repaint(); + } + } + }, + onChatKeypress: function(event) { + var messageInput = event.target; + if (event.which === KEYCODE_RETURN) { + // Shift+Enter -> new line + if (!event.shiftKey) { + event.preventDefault(); + var text = messageInput.value.trim(); + if (text.length === 0) { + return; + } + messageInput.value = ''; + client.send('/app/chat', {}, text); + addChatMessage(vm.username, text); + } + } } } }); @@ -70,8 +117,6 @@ function main() { client = Stomp.over(new SockJS('/stomp')); client.connect({}, afterConnected); - var usernameDiv = document.getElementById('usernameDiv'); - var usernameError = document.getElementById('usernameError'); var usernameInput = document.getElementById('nicknameInput'); var usernameTopic = '/user/topic/sessionUsername'; @@ -80,26 +125,23 @@ function main() { var response = JSON.parse(message.body); if (response.success === true) { console.log('Username: ' + response.username); - myUsername = response.username; + vm.username = response.username; start(); - usernameDiv.classList.add('hidden'); - appDiv.classList.remove('hidden'); } else { - usernameError.innerHTML = response.errorMessage; + vm.usernameError = response.errorMessage; } }; - usernameInput.focus(); usernameInput.addEventListener('keydown', function(e) { - if (e.keyCode === KEYCODE_RETURN) { - e.preventDefault(); + if (event.keyCode === KEYCODE_RETURN) { + event.preventDefault(); if (sessionId === null) { - usernameError.innerHTML = 'Not connected to server'; + vm.usernameError = 'Not connected to server'; return; } var usernameValue = usernameInput.value.trim(); if (usernameValue.length === 0) { - usernameError.innerHTML = 'Name cannot be empty'; + vm.usernameError = 'Name cannot be empty'; return; } if (usernameSubscription === null) { @@ -115,7 +157,7 @@ function main() { } var usernameValue = usernameInput.value.trim(); if (usernameValue.length !== 0) { - usernameError.innerHTML = ''; + vm.usernameError = ''; } }); } @@ -125,10 +167,6 @@ function start() { ctx.textBaseline = 'middle'; ctx.textAlign = 'center'; - addKeydownListener(); - addKeypressListener(); - addChatMessageListener(); - reset(); repaint(); @@ -158,89 +196,23 @@ function start() { client.subscribe('/user/topic/playerReports', onPlayerReport); } -// special keys -function addKeydownListener() { - canvasDiv.addEventListener('keydown', function(e) { - if (e.which === KEYCODE_BACKSPACE) { - e.preventDefault(); - myGuess = myGuess.substr(0, myGuess.length - 1); - repaint(); - } - else if (e.which === KEYCODE_RETURN) { - if (myGuess.length === 5) { - client.send("/app/guess", {}, myGuess); - myGuess = ''; - repaint(); - } - } - }); -} - -// characters -function addKeypressListener() { - canvasDiv.addEventListener('keypress', function(e) { - var charCode = e.charCode; - if (isCharacter(charCode)) { - if (isCharacterLowercase(charCode)) { - charCode = charCode - 32; - } - var char = String.fromCharCode(charCode); - if (myGuess.length < 5) { - myGuess += char; - repaint(); - } - } - }); -} - -function addChatMessageListener() { - var messageInput = document.getElementById('messageInput'); - messageInput.addEventListener('keypress', function(e) { - if (e.which === KEYCODE_RETURN) { - // Shift+Enter -> new line - if (!e.shiftKey) { - e.preventDefault(); - var text = messageInput.value.trim(); - if (text.length === 0) { - return; - } - messageInput.value = ''; - client.send('/app/chat', {}, text); - addChatMessage(myUsername, text); - } - } - }); +function addChatAnnouncement(body) { + addMessageItem({ + body: body + }) } function addChatMessage(sender, body) { - var messageList = document.getElementById('messageList'); - var usernameNode = document.createElement('strong'); - var usernameTextNode = document.createTextNode(sender); - usernameNode.appendChild(usernameTextNode); - var messageTextNode = document.createTextNode(' ' + body); - var messageItem = document.createElement('div'); - messageItem.classList.add('message-item'); - messageItem.appendChild(usernameNode); - messageItem.appendChild(messageTextNode); - addMessageItem(messageList, messageItem); -} - -function addChatAnnouncement(body) { - var messageList = document.getElementById('messageList'); - var messageTextNode = document.createTextNode(body); - var messageItem = document.createElement('div'); - messageItem.classList.add('message-item'); - messageItem.classList.add('log'); - messageItem.appendChild(messageTextNode); - addMessageItem(messageList, messageItem); + addMessageItem({ + sender: sender, + body: body + }) } // Auto-scrolls the message list -function addMessageItem(messageList, messageItem) { - if (!messageList.hasChildNodes()) { - messageItem.classList.add('first'); - } - messageList.appendChild(messageItem); +function addMessageItem(messageItem) { + vm.messages.push(messageItem); + var messageList = document.getElementById('messageList'); messageList.scrollTop = messageList.scrollHeight; } @@ -258,7 +230,7 @@ function doHttpGet(url, callback) { function drawMyBoard() { var x = 25, y = MARGIN_TOP; - drawUsername(x, y, myUsername); + drawUsername(x, y, vm.username); drawScore(x, y, myScore); drawInput(x, y, myGuess); var yStart = drawGuesses(x, y, myGuesses, myResults); @@ -395,6 +367,15 @@ function isValidResult(result) { return true; } +function getGame(gameId) { + for (var i = 0; i < vm.games.length; i++) { + if (vm.games[i].id === gameId) { + return vm.games[i]; + } + } + return null; +} + function removeGame(gameId) { var indexToRemove = null; for (var i = 0; i < vm.games.length; i++) { @@ -431,28 +412,13 @@ function reset(firstLetter, clearScore) { } } -function toggleView() { - var lobbyColumn = document.getElementById('lobbyColumn'); - var gameColumn = document.getElementById('gameColumn') - if (lobbyColumn.classList.contains('primary')) { - lobbyColumn.classList.remove('primary'); - } else { - lobbyColumn.classList.add('primary'); - } - if (gameColumn.classList.contains('primary')) { - gameColumn.classList.remove('primary'); - } else { - gameColumn.classList.add('primary'); - } -} - function onChat(message) { var chatMessage = JSON.parse(message.body); var messageSender = chatMessage.username; var messageBody = chatMessage.message; if (messageSender === null) { addChatAnnouncement(messageBody); - } else if (messageSender === myUsername) { + } else if (messageSender === vm.username) { // Ignore messages sent by yourself } else { console.log('Message from ' + messageSender + ": " + messageBody); @@ -464,10 +430,10 @@ function onGameClosed(message) { var game = JSON.parse(message.body); var gameId = game.id; var playerOne = game.playerOne.username; - if (playerOne === myUsername) { + console.log(playerOne + ' closed Game ' + gameId); + if (playerOne === vm.username) { vm.gameId = null; } - console.log(playerOne + ' closed Game ' + gameId); removeGame(gameId); } @@ -475,11 +441,15 @@ function onGameHosted(message) { var game = JSON.parse(message.body); var gameId = game.id; var playerOne = game.playerOne.username; - if (playerOne === myUsername) { + console.log(playerOne + ' hosted Game ' + gameId); + vm.games.push({ + id: gameId, + playerOne: playerOne, + started: false + }); + if (playerOne === vm.username) { vm.gameId = gameId; } - console.log(playerOne + ' hosted Game ' + gameId); - vm.games.push({ id: gameId, playerOne: playerOne, started: false }); } function onGameJoined(message) { @@ -487,9 +457,6 @@ function onGameJoined(message) { var gameId = game.id; var playerOne = game.playerOne.username; var playerTwo = game.playerTwo.username; - if (playerTwo === myUsername) { - vm.gameId = gameId; - } console.log(playerTwo + ' joined ' + playerOne + "'s game"); for (var i = 0; i < vm.games.length; i++) { if (vm.games[i].id === gameId) { @@ -498,8 +465,8 @@ function onGameJoined(message) { break; } } - if (playerOne === myUsername || playerTwo === myUsername) { - toggleView(); + if (playerTwo === vm.username) { + vm.gameId = gameId; } } @@ -509,6 +476,7 @@ function onGameLeft(message) { var gameId = game.id; var playerOne = game.playerOne.username; var gameLeaver = report.gameLeaver.username; + console.log(gameLeaver + ' left ' + playerOne + "'s game"); var previousPlayers = []; for (var i = 0; i < vm.games.length; i++) { if (vm.games[i].id === gameId) { @@ -520,13 +488,11 @@ function onGameLeft(message) { break; } } - console.log(gameLeaver + ' left ' + playerOne + "'s game"); - if (gameLeaver === myUsername) { + if (gameLeaver === vm.username) { vm.gameId = null; } - if (previousPlayers.indexOf(myUsername) != -1) { + if (previousPlayers.indexOf(vm.username) != -1) { onOpponentLeft(); - toggleView(); } } @@ -534,9 +500,9 @@ function onGameStarted(message) { var report = JSON.parse(message.body); var playerOne = report[0]; var playerTwo = report[1]; - if (playerOne === myUsername) { + if (playerOne === vm.username) { addChatAnnouncement('You are playing with ' + playerTwo); - } else if (playerTwo === myUsername) { + } else if (playerTwo === vm.username) { addChatAnnouncement('You are playing with ' + playerOne); } else { addChatAnnouncement(playerOne + ' is playing with ' + playerTwo); @@ -549,14 +515,12 @@ function onOpponentJoined(message) { opponentUsername = report[1]; console.log('Opponent username: ' + opponentUsername); reset(firstLetter, true); - canvasDiv.classList.remove('hidden'); repaint(); } function onOpponentLeft(message) { opponentUsername = null; lastWord = null; - canvasDiv.classList.add('hidden'); repaint(); } @@ -613,7 +577,7 @@ function onUserJoined(message) { var report = JSON.parse(message.body); var username = report[0]; var numUsers = report[1]; - if (username === myUsername) { + if (username === vm.username) { addChatAnnouncement('Welcome to Lingo!'); if (numUsers === 1) { addChatAnnouncement('You are the only player online'); diff --git a/server/src/main/resources/static/index.html b/server/src/main/resources/static/index.html index 496bff6..390e993 100644 --- a/server/src/main/resources/static/index.html +++ b/server/src/main/resources/static/index.html @@ -8,19 +8,19 @@ -
+
Lingo
-
+

What is your name?

- -

+ +

{{ usernameError }}

-