shift/main.js

208 lines
5.1 KiB
JavaScript
Raw Normal View History

const startTime = Date.now();
2024-07-08 01:00:09 +02:00
2024-07-14 16:57:05 +02:00
var conversation = null;
class Conversation {
constructor(name) {
2024-07-14 16:57:05 +02:00
this.messages = [];
this.name = name;
2024-07-14 16:57:05 +02:00
}
initialize(initialMessages) {
document.title = this.name;
document.getElementById("header-title").innerHTML = this.name;
2024-07-14 16:57:05 +02:00
this.messages = initialMessages;
2024-07-14 16:57:05 +02:00
}
// for the user to send their own messages
sendUserMessage(text) {
const message = new UserMessage(text);
message.updateStatus("sent");
2024-07-14 16:57:05 +02:00
setTimeout(() => {
message.updateStatus("delivered");
this.render();
}, 1000);
this.messages.push(message);
}
// update the current HTML based on messages
render() {
// clear stale HTML
getMessageList().innerHTML = "";
// render message elements
for (let i = 0; i < this.messages.length; i++)
{
const messageRoot = document.getElementById("messages");
const newMessage = this.messages[i];
messageRoot.appendChild(newMessage.getElement());
2024-07-14 16:57:05 +02:00
}
}
}
function getMessageList() {
return document.getElementById("messages");
}
class AgentMessage {
constructor(text) {
this.text = text;
2024-07-14 16:57:05 +02:00
}
getIsOurs() {
return false;
}
getElement() {
const liElem = document.createElement("li");
2024-07-14 16:57:05 +02:00
const contentElem = document.createElement("span");
contentElem.className = "message-content rounded-rectangle theirs";
liElem.appendChild(contentElem);
const textElem = document.createElement("span");
textElem.className = "message-text";
textElem.innerHTML = this.text;
contentElem.appendChild(textElem);
return liElem;
}
}
class UserMessage {
constructor(text) {
this.createdTime = Date.now();
this.text = text;
this.status = "";
}
2024-07-14 16:57:05 +02:00
getIsOurs() {
return true;
}
getElement() {
const liElem = document.createElement("li");
2024-07-14 16:57:05 +02:00
const contentElem = document.createElement("span");
contentElem.className = "message-content rounded-rectangle ours";
liElem.appendChild(contentElem);
const textElem = document.createElement("span");
textElem.className = "message-text";
textElem.innerHTML = this.text;
contentElem.appendChild(textElem);
const statusElem = document.createElement("p");
statusElem.className = "message-status";
statusElem.innerHTML = this.status;
liElem.appendChild(statusElem);
return liElem;
}
updateStatus(newStatus) {
this.status = newStatus;
}
}
2024-07-09 22:51:28 +02:00
function setTypingIndicator(isTyping) {
document.getElementById("typing-indicator").innerHTML = isTyping
2024-10-02 02:13:37 +02:00
? `${conversation.contactName} is typing...`
2024-07-09 22:51:28 +02:00
: "";
}
2024-07-08 01:00:09 +02:00
2024-07-09 22:51:28 +02:00
// add the message at the index to the displayed messages
2024-07-14 16:57:05 +02:00
function addMessage(message) {
getMessageList().innerHTML += message.getHtml();
2024-07-10 15:16:33 +02:00
// scroll as far as we can so that messages aren't hidden
window.scrollTo(0, document.body.scrollHeight);
2024-07-08 01:00:09 +02:00
}
function updatePings() {
const title = conversation.name;
2024-07-14 16:57:05 +02:00
let newTitle = conversation.pings > 0
? `(${conversation.pings}) ${title}`
2024-07-08 01:00:09 +02:00
: title;
document.title = newTitle;
}
function clearPings() {
2024-07-14 16:57:05 +02:00
conversation.pings = 0;
2024-07-08 01:00:09 +02:00
updatePings();
}
// returns a decimal value between min and max
function getRandomInRange(min, max) {
2024-07-09 22:51:28 +02:00
const range = max - min;
return min + Math.random() * range;
}
2024-07-14 16:57:05 +02:00
function updateChat(message) {
addMessage(message);
const previewText = conversation.getTypedMessageText();
document.getElementById("textbox-input").value = previewText;
updatePings();
}
function pressSendButton() {
if (event.type == "keydown" && event.key != "Enter")
return;
// we have interacted with the page so remove all pings
clearPings();
// get the content of the text box
const textBox = document.getElementById("textbox-input");
const text = textBox.value;
if (!text)
return;
textBox.value = "";
conversation.sendUserMessage(text);
conversation.render();
// TODO: start process of receiving next message from server (or fake it for now)
}
2024-07-14 16:57:05 +02:00
function onMessageReceived(message) {
updateChat(message);
setTypingIndicator(false);
}
function onMessageSent(message) {
updateChat(message);
}
function init(messagesData) {
conversation = new Conversation("Caesar");
let initialMessages = [];
for (let i = 0; i < messagesData.length; i++) {
const data = messagesData[i];
const text = data.text;
if (data.character == 0) {
const message = new UserMessage(text);
message.updateStatus("delivered");
initialMessages.push(message);
} else {
const message = new AgentMessage(text);
initialMessages.push(message);
}
}
conversation.initialize(initialMessages);
conversation.render();
setTypingIndicator(false);
2024-07-08 01:00:09 +02:00
}
2024-10-05 17:20:40 +02:00
fetch("lorem.json")
.then(response => response.json())
.then(json => init(json));