Spaces:
Running
Running
File size: 6,219 Bytes
3ec3239 6b9ac3a 3ec3239 6b9ac3a 3ec3239 f215f7a 6b9ac3a 3ec3239 f215f7a 3ec3239 6b9ac3a 3ec3239 6b9ac3a 3ec3239 6b9ac3a 3ec3239 6b9ac3a 3ec3239 f57d350 3ec3239 f57d350 3ec3239 f57d350 3ec3239 f57d350 3ec3239 f57d350 3ec3239 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
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 = `
<div class="max-w-xs lg:max-w-md bg-gray-900 text-white rounded-lg p-3">
<p>${decryptedContent}</p>
<p class="text-xs text-indigo-200 mt-1">${msg.timestamp}</p>
</div>
<div class="w-8 h-8 rounded-full bg-gray-900 flex items-center justify-center text-white text-xs ml-2">
ME
</div>
`;
} else {
messageDiv.innerHTML = `
<div class="w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-gray-600 text-xs mr-2">
JD
</div>
<div class="max-w-xs lg:max-w-md bg-gray-200 rounded-lg p-3">
<p>${msg.content}</p>
<p class="text-xs text-gray-500 mt-1">${msg.timestamp}</p>
</div>
`;
}
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 = `
<div class="max-w-xs lg:max-w-md bg-indigo-500 text-white rounded-lg p-3">
<p>${decryptedContent}</p>
<p class="text-xs text-indigo-200 mt-1">${timestamp}</p>
</div>
<div class="w-8 h-8 rounded-full bg-indigo-500 flex items-center justify-center text-white text-xs ml-2">
ME
</div>
`;
} else {
messageDiv.innerHTML = `
<div class="w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-gray-600 text-xs mr-2">
JD
</div>
<div class="max-w-xs lg:max-w-md bg-gray-200 rounded-lg p-3">
<p>${decryptedContent}</p>
<p class="text-xs text-gray-500 mt-1">${timestamp}</p>
</div>
`;
}
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 = '<i data-feather="trash-2"></i>';
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();
}); |