diff --git a/client/chat.js b/client/chat.js index 29001cf..094fd60 100644 --- a/client/chat.js +++ b/client/chat.js @@ -37,7 +37,11 @@ async function message(e) { e.preventDefault(); const msg = document.getElementById("msg").value; if (!msg) return; - window.socket.emit("send_message", { name: window.name, message: msg }); + window.socket.emit("send_message", { + name: window.name, + message: msg, + thread: window.currentThreadId, + }); document.getElementById("msg").value = ""; const el = document.createElement("div"); el.classList.add("message"); @@ -50,6 +54,29 @@ function swap() { document.getElementById("chat").classList.remove("hidden"); } +function startThreadPicker() { + document.getElementById("chat").classList.add("hidden"); + document.getElementById("threads").classList.remove("hidden"); + window.socket.emit("list_threads"); +} + +function chooseThread(thread) { + window.currentThreadId = thread.id; + window.earliestMessage = null; + document.getElementById("loadmore").classList.remove("hidden"); + document.getElementById("chat").classList.remove("hidden"); + document.getElementById("messages").innerHTML = ""; + document.getElementById("threadname").innerHTML = thread.name; + document.getElementById("threads").classList.add("hidden"); +} + +function createThread(e) { + e.preventDefault(); + window.socket.emit("create_thread", { + name: document.getElementById("newthreadname").value, + }); +} + async function loadKeys(keys) { const priv = await openpgp.readKey({ armoredKey: keys.privateKey }); const pub = await openpgp.readKey({ armoredKey: keys.publicKey }); @@ -60,14 +87,18 @@ async function loadKeys(keys) { async function loadMessages() { window.socket.emit( "get_history", - window.earliestMessage ? { before: window.earliestMessage } : {} + window.earliestMessage + ? { before: window.earliestMessage, thread: window.currentThreadId } + : { thread: window.currentThreadId } ); } window.onload = () => { + window.currentThreadId = 1; window.socket = io(); window.socket.on("create_user", auth); window.socket.on("new_message", (msg) => { + if (msg.thread !== window.currentThreadId) return; const el = document.createElement("div"); el.classList.add("message"); el.innerHTML = `${msg.name}: ${msg.message}`; @@ -89,7 +120,29 @@ window.onload = () => { } if (!msg.more) document.getElementById("loadmore").classList.add("hidden"); }); - window.socket.on("authenticate", swap); + window.socket.on("authenticate", (msg) => { + if (msg.success) swap(); + }); + window.socket.on("list_threads", (msg) => { + document.getElementById("threadlist").innerHTML = ""; + for (let thread of msg.threads) { + const el = document.createElement("div"); + el.classList.add("thread"); + el.innerHTML = thread.name; + const btn = document.createElement("button"); + btn.innerHTML = "choose"; + btn.onclick = () => chooseThread(thread); + el.appendChild(btn); + document.getElementById("threadlist").appendChild(el); + } + }); + window.socket.on("create_thread", (msg) => { + chooseThread({ + name: document.getElementById("newthreadname").value, + id: msg.id, + }); + document.getElementById("newthreadname").value = ""; + }); const keys = localStorage.getItem("keys"); if (keys) { window.name = localStorage.getItem("name"); @@ -98,4 +151,6 @@ window.onload = () => { document.getElementById("registerform").onsubmit = register; document.getElementById("msginput").onsubmit = message; document.getElementById("loadmore").onclick = loadMessages; + document.getElementById("change").onclick = startThreadPicker; + document.getElementById("createthread").onsubmit = createThread; }; diff --git a/client/index.html b/client/index.html index ea30c88..36f214b 100644 --- a/client/index.html +++ b/client/index.html @@ -27,6 +27,9 @@ #loadmore { margin-bottom: 10px; } + .channel { + font-weight: normal; + } @@ -46,6 +49,10 @@ + diff --git a/src/create_thread.js b/src/create_thread.js index 3899458..05dc846 100644 --- a/src/create_thread.js +++ b/src/create_thread.js @@ -1,4 +1,5 @@ const db = require("../db"); +const authwrap = require("./authwrap"); const create_thread = async (msg, respond) => { // validate inputs @@ -20,4 +21,4 @@ const create_thread = async (msg, respond) => { }); }; -module.exports = create_thread; +module.exports = authwrap(create_thread);