document.addEventListener('DOMContentLoaded', function() {
// Encryption functions
const secretKey = 'chatty-secret-key'; // In production, use a secure key management system
const encryptMessage = (message) => {
return btoa(unescape(encodeURIComponent(message))); // Simple base64 encoding for demo
};
const decryptMessage = (message) => {
try {
return decodeURIComponent(escape(atob(message)));
} catch {
return message; // Fallback if decryption fails (e.g., old unencrypted messages)
}
};
// Initialize message storage
const messageStorage = JSON.parse(localStorage.getItem('chatMessages')) || [];
// Load saved messages
function loadMessages() {
const messagesContainer = document.getElementById('messages');
messagesContainer.querySelector('.space-y-4').innerHTML = '';
messageStorage.forEach(msg => {
const messageDiv = document.createElement('div');
messageDiv.className = `flex items-start ${msg.isOutgoing ? 'justify-end' : ''} message`;
const decryptedContent = decryptMessage(msg.content);
if (msg.isOutgoing) {
messageDiv.innerHTML = `
${decryptedContent}
${msg.timestamp}
ME
`;
} else {
messageDiv.innerHTML = `
JD
${msg.content}
${msg.timestamp}
`;
}
messagesContainer.querySelector('.space-y-4').appendChild(messageDiv);
});
messagesContainer.scrollTop = messagesContainer.scrollHeight;
}
// Load any existing messages
loadMessages();
// Function to add a new message
function addMessage(content, isOutgoing = true) {
const messagesContainer = document.getElementById('messages');
const messageDiv = document.createElement('div');
messageDiv.className = `flex items-start ${isOutgoing ? 'justify-end' : ''} message`;
const timestamp = new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
// Save message to storage
messageStorage.push({
content: encryptMessage(content),
isOutgoing,
timestamp
});
localStorage.setItem('chatMessages', JSON.stringify(messageStorage));
if (isOutgoing) {
messageDiv.innerHTML = `
${decryptedContent}
${timestamp}
ME
`;
} else {
messageDiv.innerHTML = `
JD
${decryptedContent}
${timestamp}
`;
}
messagesContainer.querySelector('.space-y-4').appendChild(messageDiv);
messagesContainer.scrollTop = messagesContainer.scrollHeight;
}
// Message form handling
const messageForm = document.getElementById('messageForm');
const messageInput = document.getElementById('messageInput');
function handleMessageSubmit(e) {
e.preventDefault();
if (messageInput.value.trim() !== '') {
addMessage(messageInput.value.trim());
messageInput.value = '';
// Simulate reply after 1-3 seconds
setTimeout(() => {
const replies = [
"That's interesting!",
"Tell me more about that.",
"I see what you mean.",
"Sounds good to me!",
"What else is new?",
"I agree with you.",
"Thanks for the update!",
"Let's discuss this later.",
"Interesting perspective!",
"What do you think about...?"
];
const randomReply = replies[Math.floor(Math.random() * replies.length)];
addMessage(randomReply, false);
}, 1000 + Math.random() * 2000);
}
messageInput.focus();
}
// Form submission
messageForm.addEventListener('submit', handleMessageSubmit);
// Keyboard shortcuts
messageInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
messageForm.dispatchEvent(new Event('submit'));
}
});
// Clear chat button
const clearButton = document.createElement('button');
clearButton.className = 'ml-2 bg-red-500 text-white p-2 rounded-full hover:bg-red-600';
clearButton.innerHTML = '';
clearButton.addEventListener('click', function() {
localStorage.removeItem('chatMessages');
messageStorage.length = 0;
loadMessages();
});
document.querySelector('.border-t.border-gray-200.p-4 .flex').appendChild(clearButton);
feather.replace();
});