Secure Private Business Chat App

Secure Private Business Chat

Real-time, persistent messaging for your team.

Online Users

Loading users...

Your User Information

Share your User ID with colleagues so they can identify you in the chat.

Your User ID:

Loading...

${timestamp}

`; }).join(''); chatMessages.scrollTop = chatMessages.scrollHeight; } function renderUsers(users) { if (users.length === 0) { userList.innerHTML = `

No other users online.

`; return; } userList.innerHTML = users.map(user => `

${user.id === currentUserId ? 'You' : 'User'}

${user.id}

`).join(''); } // --- FIRESTORE ACTIONS --- async function setUserOnline() { const userRef = doc(db, `/artifacts/${appId}/public/data/users`, currentUserId); try { await setDoc(userRef, { online: true }); } catch (error) { console.error("Failed to set user online status:", error); } } async function sendMessage(text) { if (!text.trim()) return; const messagesRef = collection(db, `/artifacts/${appId}/public/data/messages`); try { await addDoc(messagesRef, { text: text, senderId: currentUserId, timestamp: serverTimestamp() }); } catch (error) { console.error("Error sending message:", error); } } // --- EVENT HANDLERS --- function handleMessageSubmit(e) { e.preventDefault(); sendMessage(messageInput.value); messageInput.value = ''; } function generatePdf() { const { jsPDF } = window.jspdf; const pdfContent = document.getElementById('pdf-content'); const pdfTitleEl = document.getElementById('pdf-title'); if (!pdfContent) return; const date = new Date().toLocaleDateString('en-US'); pdfTitleEl.textContent = `Chat Transcript - ${date}`; html2canvas(pdfContent, { scale: 2, useCORS: true, logging: false }) .then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const ratio = canvas.width / canvas.height; const imgHeight = (pdfWidth - 20) / ratio; pdf.addImage(imgData, 'PNG', 10, 10, pdfWidth - 20, imgHeight); pdf.save(`Chat-Transcript-${date}.pdf`); pdfTitleEl.textContent = ''; }); } function addEventListeners() { tabButtons.forEach(button => { button.addEventListener('click', () => { const tab = button.dataset.tab; tabButtons.forEach(btn => btn.classList.toggle('active', btn.dataset.tab === tab)); tabContents.forEach(content => content.classList.toggle('active', content.id.startsWith(tab))); }); }); messageForm.addEventListener('submit', handleMessageSubmit); downloadPdfBtn.addEventListener('click', generatePdf); } // --- START THE APP --- initialize();
Scroll to Top