Files
echo-mvp/resource/static/js/room.js
2025-06-11 03:31:59 +12:00

148 lines
4.6 KiB
JavaScript

const socket = io();
let originalTitle = document.title;
let notificationActive = false;
let notificationInterval = null;
// The 'room' variable is now directly available from the template,
// so you don't need to get it from the URL.
function getUsername(roomCode) {
const allUsernames = JSON.parse(localStorage.getItem('usernames') || '{}');
let storedUsername = allUsernames[roomCode];
// If a username exists and is not just whitespace, return it
if (storedUsername && storedUsername.trim()) {
return storedUsername;
}
// If no stored username, or it's empty, prompt the user
let newUsername = prompt("Please enter your name:");
// If the user cancels the prompt or enters only whitespace
if (newUsername === null || !newUsername.trim()) {
return null; // Indicates user didn't provide a valid name
}
newUsername = newUsername.trim();
// Store for future use
allUsernames[roomCode] = newUsername;
localStorage.setItem('usernames', JSON.stringify(allUsernames));
return newUsername;
}
// Use the 'room' variable provided by the template directly
const name = getUsername(room); // 'room' is now defined by your template script
if (!name) {
// If the user cancels or provides no name, redirect them
window.location.href = '/';
} else {
socket.emit('join', { room, sender: name });
loadMessages();
}
socket.on('message', (data) => {
const chatBox = document.getElementById('chat-box');
const msgElem = document.createElement('p');
msgElem.textContent = `${data.sender}: ${data.text}`;
if (data.sender === 'System') {
msgElem.style.fontStyle = 'italic';
msgElem.style.color = 'gray';
}
chatBox.appendChild(msgElem);
chatBox.scrollTop = chatBox.scrollHeight;
showNotification("Echo | New Message", `${data.sender}: ${data.text}`);
});
function showNotification(title, body) {
const notificationSetting = localStorage.getItem('notification-setting') || 'off';
if (notificationSetting === 'off') {
return;
}
if (notificationSetting === 'system') {
if (document.hasFocus()) return;
if (Notification.permission === 'granted') {
new Notification(title, { body });
} else if (Notification.permission !== 'denied') {
Notification.requestPermission().then(permission => {
if (permission === 'granted') {
new Notification(title, { body });
}
});
}
} else if (notificationSetting === 'tab') {
if (!document.hasFocus() && !notificationActive) {
originalTitle = document.title;
notificationInterval = setInterval(() => {
document.title = document.title === originalTitle
? "Echo | New Message!"
: originalTitle;
}, 1000);
notificationActive = true;
if (!window.hasNotificationListener) {
const returnToNormal = () => {
clearInterval(notificationInterval);
document.title = originalTitle;
notificationActive = false;
};
window.addEventListener('focus', returnToNormal);
window.hasNotificationListener = true;
}
}
}
}
document.getElementById('send-button').onclick = () => {
const text = document.getElementById('chat-input').value;
const allUsernames = JSON.parse(localStorage.getItem('usernames') || '{}');
const sender = allUsernames[room] || 'Anonymous';
if (text.trim()) {
socket.emit('message', {
room,
text,
sender
});
document.getElementById('chat-input').value = '';
}
};
document.getElementById('chat-input').addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
document.getElementById('send-button').click();
}
});
function loadMessages() {
fetch(`/api/room/${room}/messages`)
.then(res => res.json())
.then(data => {
const chatBox = document.getElementById('chat-box');
chatBox.innerHTML = '';
if (Array.isArray(data)) {
data.forEach(msg => {
const msgElem = document.createElement('p');
msgElem.textContent = `${msg.sender}: ${msg.text}`;
chatBox.appendChild(msgElem);
});
chatBox.scrollTop = chatBox.scrollHeight;
}
});
}
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
loadMessages();
}
});