| {% extends 'base.html' %} |
|
|
| {% load static %} |
|
|
| {% block title %} |
| Chat | Devnoms |
| {% endblock %} |
|
|
| {% block style %} |
| <link rel="stylesheet" href="{% static 'chat/css/chat.css' %}" /> |
| <script> |
| |
| function toggleMenu() { |
| const dropdown = document.getElementById('dropdown') |
| dropdown.classList.toggle('show') |
| } |
| |
| document.addEventListener('DOMContentLoaded', () => { |
| |
| window.addEventListener('resize', function () { |
| document.documentElement.style.setProperty('--vh', `${window.innerHeight * 0.01}px`) |
| }) |
| document.documentElement.style.setProperty('--vh', `${window.innerHeight * 0.01}px`) |
| |
| |
| function goBack() { |
| window.history.back() |
| } |
| |
| |
| document.addEventListener('click', (event) => { |
| const dropdown = document.getElementById('dropdown') |
| if (dropdown && !dropdown.contains(event.target) && !event.target.closest('.menu')) { |
| dropdown.classList.remove('show') |
| } |
| }) |
| |
| |
| const darkModeToggle = document.querySelector('.dark-mode-toggle') |
| if (darkModeToggle) { |
| darkModeToggle.addEventListener('click', () => { |
| const theme = document.documentElement.getAttribute('data-theme') |
| if (theme === 'light') { |
| darkModeToggle.innerHTML = 'Light Mode' |
| document.documentElement.setAttribute('data-theme', 'dark') |
| } else { |
| darkModeToggle.innerHTML = 'Dark Mode' |
| document.documentElement.setAttribute('data-theme', 'light') |
| } |
| }) |
| } |
| }) |
| </script> |
| {% endblock %} |
|
|
| {% block content %} |
| <div class="main_box"> |
| <div class="chat_box"> |
| |
| <div class="header"> |
| <button onclick="window.history.back();"><img src="https://pdf813.netlify.app/chat/img/icon/icons8-left-arrow-60.png" alt="Back" /></button> |
|
|
| <h1>{{ friend.username }}</h1> |
| <div class="menu"> |
| <button onclick="toggleMenu()"><img src="https://pdf813.netlify.app/chat/img/icon/icons8-menu-vertical-50.png" alt="Menu" /></button> |
| |
| <div class="dropdown-content" id="dropdown"> |
| <a class="username" href="{% url 'username' username=friend.username %}" onclick="overlayLoader(event)">Profile</a> |
| <a href="/" onclick="overlayLoader(event)">home</a> |
| <a href="/logout" onclick="overlayLoader(event)">Logout</a> |
| <a href="#" class="dark-mode-toggle">Light Mode</a> |
| </div> |
| </div> |
| </div> |
| |
| <div class="chat-area" id="chat-area"> |
| {% for message in messages %} |
| {% if curr_user == message.sender_name %} |
| <div class="chat-message sent"> |
| <div class="message-text">{{ message.description }}</div> |
| <div class="timestamp">{{ message.time }}</div> |
| </div> |
| {% else %} |
| <div class="chat-message received"> |
| <div class="message-text">{{ message.description }}</div> |
| <div class="timestamp">{{ message.time }}</div> |
| </div> |
| {% endif %} |
| {% endfor %} |
| </div> |
|
|
| |
| <form method="post" class="form-group" id="chat-box"> |
| <div class="input-area"> |
| <textarea type="text" class="message-input" placeholder="Send a message..." name="message" id="msg_field" required></textarea> |
| <button type="submit" name="send" class="send-button" id="send_btn">➤</button> |
| </div> |
| </form> |
| </div> |
| </div> |
| <script> |
| document.addEventListener('DOMContentLoaded', () => { |
| const chatArea = document.getElementById('chat-area') |
| const messageInput = document.getElementById('msg_field') |
| const sendButton = document.getElementById('send_btn') |
| |
| |
| const scrollToBottom = () => { |
| chatArea.scrollTop = chatArea.scrollHeight |
| } |
| |
| |
| if (messageInput) { |
| messageInput.addEventListener('input', () => { |
| messageInput.style.height = 'auto' |
| messageInput.style.height = `${messageInput.scrollHeight - 4}px` |
| }) |
| } |
| |
| scrollToBottom() |
| |
| const currUser = '{{ curr_user.username }}' |
| const roomName = '{{ relation_key }}' |
| const receiver = '{{ friend.username }}' |
| |
| |
| const chatSocket = new WebSocket((window.location.protocol === 'https:' ? 'wss://' : 'ws://') + window.location.host + '/ws/chat/' + roomName + '/') |
| |
| chatSocket.onmessage = function (e) { |
| const data = JSON.parse(e.data) |
| const message = data.message |
| const sender = data.sender |
| |
| |
| const currentTime = new Date().toLocaleTimeString([], { |
| hour: '2-digit', |
| minute: '2-digit', |
| hour12: true |
| }) |
| |
| const messageDiv = document.createElement('div') |
| messageDiv.classList.add('chat-message', sender === currUser ? 'sent' : 'received') |
| |
| const textDiv = document.createElement('div') |
| textDiv.classList.add('message-text') |
| textDiv.innerHTML = message.replace(/\n/g, '<br>') |
| |
| const timestampDiv = document.createElement('div') |
| timestampDiv.classList.add('timestamp') |
| timestampDiv.textContent = currentTime |
| |
| messageDiv.appendChild(textDiv) |
| messageDiv.appendChild(timestampDiv) |
| chatArea.appendChild(messageDiv) |
| |
| scrollToBottom() |
| } |
| |
| chatSocket.onclose = function () { |
| console.error('WebSocket closed unexpectedly') |
| } |
| |
| const chatForm = document.querySelector('#chat-box') |
| if (chatForm) { |
| chatForm.onsubmit = function (e) { |
| e.preventDefault() |
| const message = messageInput.value |
| |
| chatSocket.send( |
| JSON.stringify({ |
| message: message, |
| sender_name: currUser, |
| receiver_name: receiver |
| }) |
| ) |
| messageInput.value = '' |
| messageInput.style.height = '46px' |
| messageInput.focus() |
| } |
| } |
| }) |
| </script> |
| {% endblock %} |
|
|