shift/main.js

301 lines
8.1 KiB
JavaScript
Raw Permalink Normal View History

const startTime = Date.now();
2024-07-08 00:00:09 +01:00
2024-07-14 15:57:05 +01:00
var conversation = null;
class Conversation {
constructor(name) {
2024-07-14 15:57:05 +01:00
this.messages = [];
2025-04-26 21:38:17 +01:00
this.name = name;
2025-04-25 00:07:15 +01:00
this.score = 1.0;
2024-07-14 15:57:05 +01:00
}
2024-10-06 18:30:58 +01:00
setInteractive(isInteractive) {
const children = document.getElementById("textbox").children;
for (let i = 0; i < children.length; i++) {
children[i].disabled = !isInteractive;
}
}
initialize(initialMessages) {
document.title = this.name;
document.getElementById("header-title").innerHTML = this.name;
2024-07-14 15:57:05 +01:00
this.messages = initialMessages;
2024-07-14 15:57:05 +01:00
}
// for the user to send their own messages
sendUserMessage(text) {
2025-04-25 00:07:15 +01:00
const message = new UserMessage(text);
2025-04-26 21:38:17 +01:00
message.updateStatus("envoy&eacute");
2025-04-25 00:07:15 +01:00
2024-07-14 15:57:05 +01:00
setTimeout(() => {
2025-04-26 21:38:17 +01:00
message.updateStatus("livr&eacute");
this.render();
2025-04-25 01:03:58 +01:00
setTimeout(() => {
message.updateStatus("lu");
this.render();
2025-04-26 21:38:17 +01:00
setTimeout(()=> {
setTimeout(() => {
this.messages.push(new AgentMessage("merde alors"));
this.render();
}, 2000);
}, 500);
}, 3000);
}, 1000);
//this.messages.push(message);
this.messages.push(message);
2025-04-26 21:38:17 +01:00
//this.messages.push(new AgentMessage(messageText));
this.render();
}
// update the current HTML based on messages
render() {
// clear stale HTML
getMessageList().innerHTML = "";
2024-10-07 01:44:26 +01:00
// if there are multiple 'read' messages, we only want the last one to display
// the status. the other ones must have been read, so clear their statuses.
let foundReadMessage = false;
for (let i = this.messages.length - 1; i >= 0; i--) {
const message = this.messages[i];
if (!message.getIsOurs())
continue;
// if we haven't found a read message yet, let's check to see if we have now
if (!foundReadMessage) {
2025-04-25 01:03:58 +01:00
if (message.status == "lu") {
2024-10-07 01:44:26 +01:00
foundReadMessage = true;
continue;
}
} else {
// we have found a read message, which means all messages above it should
// have empty status
message.updateStatus("");
}
}
// 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 15:57:05 +01:00
}
}
}
function getMessageList() {
return document.getElementById("messages");
}
class AgentMessage {
constructor(text, senderName) {
this.text = text;
this.senderName = senderName;
2024-07-14 15:57:05 +01:00
}
getIsOurs() {
return false;
}
getElement() {
const liElem = document.createElement("li");
2024-10-06 18:30:58 +01:00
liElem.className = "message";
2024-07-14 15:57:05 +01:00
const contentElem = document.createElement("span");
contentElem.className = "message-content rounded-rectangle theirs";
liElem.appendChild(contentElem);
if (this.senderName) {
const nameElem = document.createElement("h3");
2025-04-26 21:38:17 +01:00
nameElem.innerHTML = this.senderName;
contentElem.appendChild(nameElem);
}
const textElem = document.createElement("span");
textElem.className = "message-text";
2025-04-26 21:38:17 +01:00
textElem.innerHTML = this.text;
contentElem.appendChild(textElem);
return liElem;
}
}
class UserMessage {
constructor(text) {
this.createdTime = Date.now();
2025-04-26 21:38:17 +01:00
this.text = text;
this.status = "";
}
2024-07-14 15:57:05 +01:00
getIsOurs() {
return true;
}
getElement() {
const liElem = document.createElement("li");
2024-10-06 18:30:58 +01:00
liElem.className = "message";
2024-07-14 15:57:05 +01: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-10-06 18:30:58 +01:00
class SystemMessage {
constructor(text) {
2025-04-26 21:38:17 +01:00
this.text = text;
2024-10-07 01:44:26 +01:00
}
getIsOurs() {
return false;
2024-10-06 18:30:58 +01:00
}
getElement() {
const liElem = document.createElement("li");
liElem.className = "system-message";
liElem.innerHTML = this.text;
return liElem;
}
}
2024-07-09 21:51:28 +01:00
function setTypingIndicator(isTyping) {
document.getElementById("typing-indicator").innerHTML = isTyping
2024-10-02 01:13:37 +01:00
? `${conversation.contactName} is typing...`
2024-07-09 21:51:28 +01:00
: "";
}
2024-07-08 00:00:09 +01:00
2024-07-09 21:51:28 +01:00
// add the message at the index to the displayed messages
2024-07-14 15:57:05 +01:00
function addMessage(message) {
getMessageList().innerHTML += message.getHtml();
2024-07-10 14:16:33 +01:00
// scroll as far as we can so that messages aren't hidden
window.scrollTo(0, document.body.scrollHeight);
2024-07-08 00:00:09 +01:00
}
function updatePings() {
const title = conversation.name;
2024-07-14 15:57:05 +01:00
let newTitle = conversation.pings > 0
? `(${conversation.pings}) ${title}`
2024-07-08 00:00:09 +01:00
: title;
document.title = newTitle;
}
function clearPings() {
2024-07-14 15:57:05 +01:00
conversation.pings = 0;
2024-07-08 00:00:09 +01:00
updatePings();
}
// returns a decimal value between min and max
function getRandomInRange(min, max) {
2024-07-09 21:51:28 +01:00
const range = max - min;
return min + Math.random() * range;
}
2024-07-14 15:57:05 +01:00
function updateChat(message) {
addMessage(message);
const previewText = conversation.getTypedMessageText();
document.getElementById("textbox-input").value = previewText;
updatePings();
}
function pressSendButton() {
2024-10-07 01:44:26 +01:00
const textBox = document.getElementById("textbox-input");
2025-04-25 00:07:15 +01:00
// get the content of the text box
const text = textBox.value;
if (!text)
return;
if (event.type == "keydown" && event.key != "Enter")
2024-10-07 01:44:26 +01:00
{
2025-04-26 21:38:17 +01:00
textBox.value = text;
return;
2024-10-07 01:44:26 +01:00
}
// we have interacted with the page so remove all pings
clearPings();
textBox.value = "";
conversation.sendUserMessage(text);
conversation.render();
// TODO: start process of receiving next message from server (or fake it for now)
}
2024-07-14 15:57:05 +01:00
function onMessageReceived(message) {
updateChat(message);
setTypingIndicator(false);
}
function onMessageSent(message) {
updateChat(message);
}
function readConversationJson(path, callback) {
fetch(path)
.then(response => response.json())
.then(json => callback(json));
}
2024-10-05 18:35:24 +01:00
function showConversation(path) {
const mainPanel = document.getElementById("main-panel");
const conversationListElem = document.getElementById("side-panel");
readConversationJson(path, json => {
2024-10-06 16:31:26 +01:00
conversation = new Conversation(json.title);
const jsonMessages = json.messages;
const participants = json.characters;
let initialMessages = [];
for (let i = 0; i < jsonMessages.length; i++) {
const data = jsonMessages[i];
const text = data.text;
2024-10-06 18:30:58 +01:00
if (data.character == -1) {
const message = new SystemMessage(text);
initialMessages.push(message);
} else if (data.character == 0) {
const message = new UserMessage(text);
2025-04-25 01:03:58 +01:00
message.updateStatus("lu");
initialMessages.push(message);
} else {
const message = participants.length > 2
? new AgentMessage(text, participants[data.character])
: new AgentMessage(text);
initialMessages.push(message);
2024-10-05 18:35:24 +01:00
}
}
2024-10-05 18:35:24 +01:00
conversation.initialize(initialMessages);
2024-10-06 18:30:58 +01:00
conversation.setInteractive(json.interactive);
conversation.render();
});
2024-10-05 18:35:24 +01:00
}
setTypingIndicator(false);
2025-04-25 01:03:58 +01:00
showConversation("sncf.json");