chatterbox-frenzy / script.js
authorizedcabal's picture
can you add previous images shared in the chat messages and change the color schema to a modern minimalist black and white?
698d36a verified
document.addEventListener('DOMContentLoaded', function() {
// Mock data for contacts and messages
const contacts = [
{
id: 1,
name: 'Alex Johnson',
avatar: 'http://static.photos/people/200x200/1',
lastMessage: 'Hey, how are you doing?',
time: '10:30 AM',
messages: [
{ text: 'Hey there!', sent: false, time: '10:20 AM' },
{ text: 'Hey, how are you doing?', sent: false, time: '10:30 AM' },
{ type: 'image', content: 'http://static.photos/minimal/320x240/1', sent: false, time: '10:32 AM' }
]
},
{
id: 2,
name: 'Sarah Miller',
avatar: 'http://static.photos/people/200x200/2',
lastMessage: 'Can we meet tomorrow?',
time: 'Yesterday',
messages: [
{ text: 'Hi Sarah!', sent: true, time: 'Yesterday, 4:20 PM' },
{ type: 'image', content: 'http://static.photos/minimal/320x240/2', sent: true, time: 'Yesterday, 4:22 PM' },
{ text: 'Can we meet tomorrow?', sent: false, time: 'Yesterday, 4:25 PM' },
{ text: 'Sure, what time?', sent: true, time: 'Yesterday, 4:30 PM' }
]
},
{
id: 3,
name: 'Mark Williams',
avatar: 'http://static.photos/people/200x200/3',
lastMessage: 'I sent you the files',
time: 'Tuesday',
messages: [
{ text: 'Did you get the documents?', sent: false, time: 'Tuesday, 11:15 AM' },
{ text: 'Not yet, can you send them again?', sent: true, time: 'Tuesday, 11:30 AM' },
{ text: 'I sent you the files', sent: false, time: 'Tuesday, 11:45 AM' }
]
},
{
id: 4,
name: 'Emily Chen',
avatar: 'http://static.photos/people/200x200/4',
lastMessage: 'Thanks for your help!',
time: 'Monday',
messages: [
{ text: 'I need some advice', sent: false, time: 'Monday, 9:00 AM' },
{ text: 'Of course, what do you need?', sent: true, time: 'Monday, 9:30 AM' },
{ text: 'Thanks for your help!', sent: false, time: 'Monday, 10:15 AM' }
]
},
{
id: 5,
name: 'David Rodriguez',
avatar: 'http://static.photos/people/200x200/5',
lastMessage: 'See you at the meeting',
time: 'Last week',
messages: [
{ text: 'Are we still meeting tomorrow?', sent: true, time: 'Friday, 3:00 PM' },
{ text: 'Yes, at 2 PM', sent: false, time: 'Friday, 3:30 PM' },
{ text: 'See you at the meeting', sent: false, time: 'Friday, 4:00 PM' }
]
}
];
// DOM elements
const contactsList = document.getElementById('contacts-list');
const messagesContainer = document.getElementById('messages-container');
const messageInputContainer = document.getElementById('message-input-container');
const messageForm = document.getElementById('message-form');
const messageInput = document.getElementById('message-input');
const chatHeader = document.getElementById('chat-header');
const activeContactDetails = document.getElementById('active-contact-details');
const themeToggle = document.getElementById('theme-toggle');
// Current selected contact
let currentContact = null;
// Theme toggle functionality
themeToggle.addEventListener('click', function() {
const html = document.querySelector('html');
if (html.classList.contains('light')) {
html.classList.remove('light');
html.classList.add('dark');
feather.replace();
themeToggle.innerHTML = feather.icons['sun'].toSvg();
} else {
html.classList.remove('dark');
html.classList.add('light');
feather.replace();
themeToggle.innerHTML = feather.icons['moon'].toSvg();
}
});
// Render contacts list
function renderContacts() {
contactsList.innerHTML = '';
contacts.forEach(contact => {
const contactItem = document.createElement('div');
contactItem.className = 'contact-item p-4 flex items-center gap-3 cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700';
contactItem.dataset.contactId = contact.id;
contactItem.innerHTML = `
<img src="${contact.avatar}" alt="${contact.name}" class="w-12 h-12 rounded-full object-cover">
<div class="flex-1 min-w-0">
<h4 class="font-semibold text-gray-800 dark:text-white truncate">${contact.name}</h4>
<p class="text-sm text-gray-600 dark:text-gray-400 truncate">${contact.lastMessage}</p>
</div>
<span class="text-xs text-gray-500 dark:text-gray-400">${contact.time}</span>
`;
contactItem.addEventListener('click', () => selectContact(contact.id));
contactsList.appendChild(contactItem);
});
}
// Select a contact to chat with
function selectContact(contactId) {
currentContact = contacts.find(c => c.id === contactId);
if (!currentContact) return;
// Update active contact details
activeContactDetails.innerHTML = `
<div class="flex items-center gap-3">
<img src="${currentContact.avatar}" alt="${currentContact.name}" class="w-10 h-10 rounded-full object-cover">
<h3 class="text-lg font-semibold text-gray-800 dark:text-white">${currentContact.name}</h3>
</div>
`;
// Show message input
messageInputContainer.classList.remove('hidden');
// Render messages
renderMessages(currentContact.messages);
}
// Render messages for selected contact
function renderMessages(messages) {
messagesContainer.innerHTML = '';
messages.forEach(message => {
const messageElement = document.createElement('div');
messageElement.className = `message-bubble mb-4 p-3 ${
message.sent ? 'sent self-end' : 'received self-start'
}`;
if (message.type === 'image') {
messageElement.innerHTML = `
<img src="${message.content}" class="message-image" alt="Shared image">
<span class="text-xs opacity-70 block mt-1 ${
message.sent ? 'text-white/70' : 'text-black/70 dark:text-white/70'
}">${message.time}</span>
`;
} else {
messageElement.innerHTML = `
<p class="whitespace-pre-wrap">${message.text}</p>
<span class="text-xs opacity-70 block mt-1 ${
message.sent ? 'text-white/70' : 'text-black/70 dark:text-white/70'
}">${message.time}</span>
`;
messagesContainer.appendChild(messageElement);
});
// Scroll to bottom
messagesContainer.scrollTop = messagesContainer.scrollHeight;
}
// Send new message
messageForm.addEventListener('submit', function(e) {
e.preventDefault();
const messageText = messageInput.value.trim();
if (!messageText || !currentContact) return;
// Add message to current contact
const newMessage = {
text: messageText,
sent: true,
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
};
currentContact.messages.push(newMessage);
currentContact.lastMessage = messageText;
currentContact.time = 'Just now';
// Update UI
renderMessages(currentContact.messages);
renderContacts();
messageInput.value = '';
// Simulate reply after 1-3 seconds
setTimeout(() => {
const replies = [
"Sounds good!",
"I'll get back to you soon.",
"Thanks for letting me know.",
"Interesting, tell me more.",
"Can we talk about this later?"
];
const replyMessage = {
text: replies[Math.floor(Math.random() * replies.length)],
sent: false,
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
};
currentContact.messages.push(replyMessage);
currentContact.lastMessage = replyMessage.text;
currentContact.time = 'Just now';
renderMessages(currentContact.messages);
renderContacts();
}, 1000 + Math.random() * 2000);
});
// Initialize
renderContacts();
feather.replace();
});