<!DOCTYPE html>
<html>
  <head>
    <title>Chat!</title>

    <meta charset="utf-8" />

    <script>
      'use strict'

      window.onload = () => {
        let conn = null

        const log = (msg) => {
          div_log.innerHTML += msg + '<br>'
          div_log.scroll(0, div_log.scrollTop + 1000)
        }

        const connect = () => {
          disconnect()

          const wsUri =
            (window.location.protocol === 'https:' ? 'wss://' : 'ws://') +
            window.location.host +
            '/ws/'

          conn = new WebSocket(wsUri)
          log('Connecting...')

          conn.onopen = function () {
            log('Connected.')
            update_ui()
          }

          conn.onmessage = function (e) {
            log('Received: ' + e.data)
          }

          conn.onclose = function () {
            log('Disconnected.')
            conn = null

            update_ui()
          }
        }

        const disconnect = () => {
          if (conn) {
            log('Disconnecting...')
            conn.close()
            conn = null

            update_ui()
          }
        }

        const update_ui = () => {
          if (!conn) {
            span_status.textContent = 'disconnected'
            btn_connect.textContent = 'Connect'
          } else {
            span_status.textContent = `connected (${conn.protocol})`
            btn_connect.textContent = 'Disconnect'
          }
        }

        btn_connect.onclick = () => {
          if (!conn) {
            connect()
          } else {
            disconnect()
          }

          update_ui()
        }

        btn_send.onclick = () => {
          if (!conn) return

          const text = input_text.value
          log('Sending: ' + text)
          conn.send(text)

          input_text.value = ''
          input_text.focus()
        }

        input_text.onkeyup = (e) => {
          if (e.key === 'Enter') {
            btn_send.click()
          }
        }
      }
    </script>
  </head>

  <body>
    <h3>Chat!</h3>
    <div>
      <button id="btn_connect">Connect</button>
      Status: <span id="span_status">disconnected</span>
    </div>

    <div
      id="div_log"
      style="width: 20em; height: 15em; overflow: auto; border: 1px solid black"
    ></div>

    <input id="input_text" type="text" />
    <input id="btn_send" type="button" value="Send" />
  </body>
</html>