From 5b27f5284fcff70d0bf1524688185faa539dbe2d Mon Sep 17 00:00:00 2001 From: emile Date: Thu, 8 Aug 2024 13:24:32 +0300 Subject: [PATCH] new --- osinaweb/db.sqlite3 | Bin 1916928 -> 1945600 bytes .../__pycache__/consumers.cpython-310.pyc | Bin 13690 -> 14044 bytes .../__pycache__/models.cpython-310.pyc | Bin 5656 -> 5656 bytes osinaweb/osichat/consumers.py | 25 +- .../templates/chat_templates/chat-room.html | 198 ++++++++-------- .../templates/chat_templates/chat-widget.html | 4 +- .../partials/new-chat-room.html | 4 +- .../chat_templates/partials/rooms.html | 110 +++++---- osinaweb/static/dist/output.css | 57 +++-- .../js/osichat-admin/inner-conversation.js | 213 +++++++++++------- osinaweb/static/js/osichat-admin/rooms.js | 63 +++++- osinaweb/static/js/osichat-admin/textarea.js | 27 ++- osinaweb/static/js/osichat/textarea.js | 10 +- 13 files changed, 453 insertions(+), 258 deletions(-) diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index ac7a6cb06e3a1d96329d287b9108905e0d876f88..bf5a2032e0503e58180c539e0a38b8ad70153953 100644 GIT binary patch delta 60161 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�>Ggp3u_4 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 diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc index 5c25643992feef57e7a5730b59ceca7cb8d82b62..b471c4ba5a45caf520bd1d184d2bc076ef7c3f74 100644 GIT binary patch delta 5101 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 SyucZsIb6OuJP_E{a`Znplfm@> diff --git a/osinaweb/osichat/__pycache__/models.cpython-310.pyc b/osinaweb/osichat/__pycache__/models.cpython-310.pyc index bc9650cf8cf777357529402528b59dfdf794c6bc..38bca7e054b940079acc115d5c42315d01c003ce 100644 GIT binary patch delta 20 acmbQCGed_vpO=@50SH#k-m;OKR}26&wgmnF delta 20 acmbQCGed_vpO=@50SJn9H*VzS6$1b;nFLn= diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index 5906a68c..439f2172 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -60,13 +60,19 @@ class OsitcomVisitor(WebsocketConsumer): 'visitors': visitors, } if self.client_type == 'mobile_admin': - visitor_data = [] + visitors_data = [] for visitor in visitors: - visitor_data = model_to_dict(visitor) - + visitor_dict = model_to_dict(visitor) + visitor_logs = VisitorLog.objects.filter(visitor=visitor) + + visitor_logs_data = [model_to_dict(log) for log in visitor_logs] + visitor_dict['visitor_logs'] = visitor_logs_data + + visitors_data.append(visitor_dict) + self.send(text_data=json.dumps({ 'event_type': 'get_visitors', - 'visitor_data': visitor_data, + 'visitors_data': visitors_data, }, cls=DjangoJSONEncoder)) @@ -147,6 +153,7 @@ class OsitcomChatRooms(WebsocketConsumer): chat_room = get_object_or_404(ChatRoom, id=event['chatroom_id']) user = get_object_or_404(User, id=self.user_id) number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=user).exclude(chatmessageseen__member=user).count() + last_message = ChatMessage.objects.filter(room=chat_room).last() context = { 'chat_room': chat_room, @@ -163,6 +170,7 @@ class OsitcomChatRooms(WebsocketConsumer): self.send(text_data=json.dumps({ 'event_type': 'new_update', 'chatroom_id': chat_room.id, + 'user': last_message.member.id if last_message and last_message.member else None, 'html': html, })) @@ -237,10 +245,6 @@ class OsitcomChatRoom(WebsocketConsumer): ) self.chat_room = chat_room self.group = f"{self.session_id}_{self.chat_room.id}" - event = { - 'type': 'start_conversation_handler', - 'chat_room_id': chat_room.id - } async_to_sync(self.channel_layer.group_discard)( self.group, self.channel_name ) @@ -251,6 +255,11 @@ class OsitcomChatRoom(WebsocketConsumer): self.group, event ) + event = { + 'type': 'start_conversation_handler', + 'chat_room_id': chat_room.id + } + if event_type == 'typing': event = { 'type': 'typing_handler', diff --git a/osinaweb/osinacore/templates/chat_templates/chat-room.html b/osinaweb/osinacore/templates/chat_templates/chat-room.html index 571ac787..6ee49f84 100644 --- a/osinaweb/osinacore/templates/chat_templates/chat-room.html +++ b/osinaweb/osinacore/templates/chat_templates/chat-room.html @@ -1,5 +1,19 @@ {% load static %} -
+ + + + +
@@ -9,113 +23,113 @@

{{chat_room.chatroomguest.visitor.name}}

- -
- {% for message in chat_room_messages %} - {% if message.member %} - {% if not message.chatmessageattachment %} -
-
-

{{message.content}}

-
-
- {% else %} - {% if message.chatmessageattachment.is_image %} +
+ +
+ {% for message in chat_room_messages %} + {% if message.member %} + {% if not message.chatmessageattachment %}
-
- +
+

{{message.content}}

-
+
{% else %} -
-
-
-
- - - - - -
-
- {{message.chatmessageattachment.file_name}} + {% if message.chatmessageattachment.is_image %} +
+
+ +
+
+ {% else %} +
+
+
+
+ + + + + +
+
+ {{message.chatmessageattachment.file_name}} +
-
+ {% endif %} {% endif %} - {% endif %} - {% else %} -
-
-
- -
-
- {% if not message.chatmessageattachment %} -
-

{{message.content}}

+ {% else %} +
+
+
+ +
- {% else %} - {% if message.chatmessageattachment.is_image %} + {% if not message.chatmessageattachment %}
- + class="max-w-[80%] bg-gray-50 px-4 py-3 rounded-r-3xl rounded-tl-3xl text-secondosiblue text-sm leading-6 bg-opacity-50 shadow-md border border-gray-100"> +

{{message.content}}

{% else %} -
-
-
- - - - - -
-
- {{message.chatmessageattachment.file_name}} + {% if message.chatmessageattachment.is_image %} +
+ +
+ {% else %} +
+
+
+ + + + + +
+
+ {{message.chatmessageattachment.file_name}} +
-
+ {% endif %} {% endif %} - {% endif %} -
- {% endif %} - {% endfor %} - - +
+ {% endif %} + {% endfor %} - -
+ +
- -
- {% csrf_token %} -
- -
-
- - - - - + + + {% csrf_token %} +
+ +
+
+ + + + + +
+
-
-
- + +
\ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/chat-widget.html b/osinaweb/osinacore/templates/chat_templates/chat-widget.html index 300c427e..838d79cd 100644 --- a/osinaweb/osinacore/templates/chat_templates/chat-widget.html +++ b/osinaweb/osinacore/templates/chat_templates/chat-widget.html @@ -4,11 +4,11 @@
-
+
-
+
diff --git a/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html b/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html index 1b524176..63855b16 100644 --- a/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html +++ b/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html @@ -2,8 +2,8 @@

{{chat_room.chatroomguest.visitor.ip_address}}

-
+
diff --git a/osinaweb/osinacore/templates/chat_templates/partials/rooms.html b/osinaweb/osinacore/templates/chat_templates/partials/rooms.html index 9be254ca..f48e1fd4 100644 --- a/osinaweb/osinacore/templates/chat_templates/partials/rooms.html +++ b/osinaweb/osinacore/templates/chat_templates/partials/rooms.html @@ -1,49 +1,65 @@ - -
-
- - - -

Chats

-
- - -
- - - - - -

Visitors

-
+ + -
- - {% for chat_room in chat_rooms %} -
-
-

{{chat_room.chatroomguest.visitor.ip_address}}

- -
-

{{chat_room.number_of_unread}}

-
-
- -

{{chat_room.chatmessage_set.all.last.content}}

- -

{{chat_room.last_updated}}

-
- {% endfor %} -
\ No newline at end of file + +
+
+ + + +

Chats

+
+ + +
+ + + + + +

Visitors

+
+
+ +
+ + {% for chat_room in chat_rooms %} +
+
+

{{chat_room.chatroomguest.visitor.ip_address}}

+ + +
+ +

{{chat_room.chatmessage_set.all.last.content}}

+ +

{{chat_room.last_updated}}

+
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/osinaweb/static/dist/output.css b/osinaweb/static/dist/output.css index 19e48c24..84dfc6cb 100644 --- a/osinaweb/static/dist/output.css +++ b/osinaweb/static/dist/output.css @@ -714,6 +714,10 @@ video { bottom: 4rem; } +.bottom-2 { + bottom: 0.5rem; +} + .bottom-20 { bottom: 5rem; } @@ -722,10 +726,18 @@ video { bottom: 6rem; } +.bottom-28 { + bottom: 7rem; +} + .bottom-3 { bottom: 0.75rem; } +.bottom-32 { + bottom: 8rem; +} + .bottom-5 { bottom: 1.25rem; } @@ -842,18 +854,6 @@ video { top: 14px; } -.bottom-2 { - bottom: 0.5rem; -} - -.bottom-28 { - bottom: 7rem; -} - -.bottom-32 { - bottom: 8rem; -} - .z-10 { z-index: 10; } @@ -1103,6 +1103,10 @@ video { height: 210px; } +.h-\[22px\] { + height: 22px; +} + .h-\[250px\] { height: 250px; } @@ -1200,10 +1204,6 @@ video { height: 100vh; } -.h-\[22px\] { - height: 22px; -} - .max-h-\[200px\] { max-height: 200px; } @@ -1332,6 +1332,10 @@ video { width: 220px; } +.w-\[22px\] { + width: 22px; +} + .w-\[240px\] { width: 240px; } @@ -1449,10 +1453,6 @@ video { width: 100%; } -.w-\[22px\] { - width: 22px; -} - .min-w-full { min-width: 100%; } @@ -1843,6 +1843,11 @@ video { border-top-right-radius: 0px; } +.rounded-l { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + .rounded-bl-md { border-bottom-left-radius: 0.375rem; } @@ -2196,6 +2201,10 @@ video { --tw-bg-opacity: 0.8; } +.bg-opacity-60 { + --tw-bg-opacity: 0.6; +} + .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); } @@ -3190,6 +3199,10 @@ video { } } */ +.hover\:pointer-events-none:hover { + pointer-events: none; +} + .hover\:scale-105:hover { --tw-scale-x: 1.05; --tw-scale-y: 1.05; @@ -3202,6 +3215,10 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +.hover\:overflow-hidden:hover { + overflow: hidden; +} + .hover\:bg-gray-100:hover { --tw-bg-opacity: 1; background-color: rgb(243 244 246 / var(--tw-bg-opacity)); diff --git a/osinaweb/static/js/osichat-admin/inner-conversation.js b/osinaweb/static/js/osichat-admin/inner-conversation.js index 096611d1..6db0a1e2 100644 --- a/osinaweb/static/js/osichat-admin/inner-conversation.js +++ b/osinaweb/static/js/osichat-admin/inner-conversation.js @@ -2,99 +2,154 @@ function handleChatRoomClick(event) { const sessionId = event.currentTarget.getAttribute('data-session'); const chatId = event.currentTarget.getAttribute('data-roomid'); - if (sessionId && chatId) { + if (sessionId && chatId && chatId !== currentChatId) { + showLoader(); openConversation(sessionId, chatId); - } else { - console.error('Session ID not found for this chat room.'); + currentChatId = chatId; } } - document.querySelectorAll('.chat-room').forEach(div => { div.addEventListener('click', handleChatRoomClick); }); - function appendTextAreaScript(domain, conversationContainer) { - if (!document.querySelector(`script[src="${protocol}://${admin_chat_domain}/static/js/osichat-admin/textarea.js"]`)) { - const textareaScript = document.createElement('script'); - textareaScript.type = 'text/javascript'; - textareaScript.src = `${protocol}://${admin_chat_domain}/static/js/osichat-admin/textarea.js`; - conversationContainer.appendChild(textareaScript); + + function markCurrentChatRead(chatid) { + const unreadElement = document.querySelector(`.unread[data-roomid='${chatid}']`); + if (unreadElement) { + unreadElement.classList.add('hidden'); } } + // FUNCTIONS TO SHOW & HIDE THE LOADER + function showLoader() { + const roomLoader = document.getElementById('roomLoader'); + if (roomLoader) { + roomLoader.classList.remove('hidden'); + } - function openConversation(sessionid, chatid) { - if (osichatadminroomSocket && osichatadminroomSocket.readyState !== WebSocket.CLOSED) { //Close previous sockets - osichatadminroomSocket.close(); - } - osichatadminroomSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat-admin/${sessionid}/${chatid}/`); - osichatadminroomSocket.onopen = function () { - console.log('WebSocket connection to osichat established'); - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'load_chat', 'client_type': 'website_admin' })); - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); - }; - function handleLoadChatEvent(data, osichatadminroomSocket) { - let chatDiv = document.getElementById('widgetRightSide'); - chatDiv.innerHTML = data.html; - appendTextAreaScript(admin_chat_domain, chatDiv); - - const sendMessageForm = document.querySelector('#sendMessage'); - sendMessageForm.addEventListener('submit', function (event) { - event.preventDefault(); - const message = event.target.elements.message.value; - const eventMessage = { - 'event_type': 'send_message', - 'message': message, - 'user_id': userId - }; - - osichatadminroomSocket.send(JSON.stringify(eventMessage)); - event.target.reset(); - }); - } + const widgetLeftSide = document.getElementById('widgetLeftSide'); + widgetLeftSide.classList.remove('overflow-y-auto'); + widgetLeftSide.classList.add('overflow-hidden'); + } - osichatadminroomSocket.onmessage = function (e) { - const data = JSON.parse(e.data); - const typingDiv = document.getElementById('typing'); - const messagesDiv = document.getElementById('messages_container'); - switch (data.event_type) { - case 'load_chat': - handleLoadChatEvent(data, osichatadminroomSocket); - break; - case 'typing': - if(!typingDiv && data.user != userId){ - messagesDiv.insertAdjacentHTML('beforeend', data.html); - } - break; - case 'stopped_typing': + function hideLoader() { + const roomLoader = document.getElementById('roomLoader'); + if (roomLoader) { + roomLoader.classList.add('hidden'); + } + + const widgetLeftSide = document.getElementById('widgetLeftSide'); + widgetLeftSide.classList.remove('overflow-hidden'); + widgetLeftSide.classList.add('overflow-y-auto'); + } + + function appendTextAreaScript(conversationContainer) { + const textareaScript = document.createElement('script'); + textareaScript.type = 'text/javascript'; + textareaScript.src = `${protocol}://${admin_chat_domain}/static/js/osichat-admin/textarea.js`; + conversationContainer.appendChild(textareaScript); + } + + function scrollBottom() { + const conversationContainer = document.getElementById('messages_container'); + if (conversationContainer) { + conversationContainer.scrollTo({ + top: conversationContainer.scrollHeight, + behavior: 'smooth' + }); + } + } + + function openConversation(sessionId, chatId) { + if (osichatadminroomSocket) { + osichatadminroomSocket.close(); + } + + osichatadminroomSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat-admin/${sessionId}/${chatId}/`); + + osichatadminroomSocket.onopen = function () { + scrollBottom(); + hideLoader(); + markCurrentChatRead(chatId) + console.log('WebSocket connection to osichat established'); + osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'load_chat', 'client_type': 'website_admin' })); + osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); + }; + + function handleLoadChatEvent(data) { + let chatDiv = document.getElementById('widgetRightSide'); + chatDiv.innerHTML = data.html; + appendTextAreaScript(chatDiv); + + const sendMessageForm = document.querySelector('#sendMessage'); + sendMessageForm.addEventListener('submit', function (event) { + event.preventDefault(); + const message = event.target.elements.message.value; + const eventMessage = { + 'event_type': 'send_message', + 'message': message, + 'user_id': userId + }; + + osichatadminroomSocket.send(JSON.stringify(eventMessage)); + event.target.reset(); + }); + } + + osichatadminroomSocket.onmessage = function (e) { + const data = JSON.parse(e.data); + const typingDiv = document.getElementById('typing'); + const messagesDiv = document.getElementById('messages_container'); + switch (data.event_type) { + case 'load_chat': + handleLoadChatEvent(data); + break; + case 'typing': + if (!typingDiv && data.user != userId) { + messagesDiv.insertAdjacentHTML('beforeend', data.html); + } + break; + case 'stopped_typing': + if (typingDiv) { + typingDiv.remove(); + } + break; + case 'send_message': + osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); + messagesDiv.insertAdjacentHTML('beforeend', data.html); + if (!data.user){ if (typingDiv) { typingDiv.remove(); } - break; - case 'send_message': - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); - messagesDiv.insertAdjacentHTML('beforeend', data.html); - if (!data.user) { // If it is sent by a guest play a notification sound for the guest - const notificationSound = document.getElementById('notification-sound'); - notificationSound.play(); - if (typingDiv) { - typingDiv.remove(); - } - break; - } - break; - default: - console.log('Unknown event type:', data.event_type); - } - }; - - osichatadminroomSocket.onclose = function () { - console.log('WebSocket connection to osichat closed'); - }; - - osichatadminroomSocket.onerror = function (error) { - console.error('WebSocket error:', error); - }; + } + break; + default: + console.log('Unknown event type:', data.event_type); + } + }; + + osichatadminroomSocket.onclose = function () { + console.log('WebSocket connection closed'); + if (currentChatId === chatId) { + setTimeout(() => { + console.log('Attempting to reconnect to WebSocket...'); + openConversation(sessionId, chatId); + }, 2000); + } + }; + + osichatadminroomSocket.onerror = function (error) { + console.error('WebSocket error:', error); + showLoader(); + }; } -})(); \ No newline at end of file + + window.addEventListener('offline', () => { + showLoader(); + if (osichatadminroomSocket) { + osichatadminroomSocket.close(); + } + }); + +})(); diff --git a/osinaweb/static/js/osichat-admin/rooms.js b/osinaweb/static/js/osichat-admin/rooms.js index 1ddea089..28174bbe 100644 --- a/osinaweb/static/js/osichat-admin/rooms.js +++ b/osinaweb/static/js/osichat-admin/rooms.js @@ -2,8 +2,24 @@ let admin_chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws"; let protocol = window.location.protocol === "https:" ? "https" : "http"; let admin_chat_domain = "osina.ositcom.com"; let userId = document.getElementById('userId').textContent.trim(); -let osichatroomsSocket; -let osichatadminroomSocket; +let osichatadminroomSocket = null; +let currentChatId = null; + +// FUNCTIONS TO SHOW & HIDE THE LOADER +function showLoader() { + const roomsLoader = document.getElementById('roomsLoader'); + if (roomsLoader) { + roomsLoader.classList.remove('hidden'); + } +} + +function hideLoader() { + const roomsLoader = document.getElementById('roomsLoader'); + if (roomsLoader) { + roomsLoader.classList.add('hidden'); + } +} + function appendInnerConversationScript(div) { const innerConversationScript = document.createElement('script'); @@ -12,11 +28,16 @@ function appendInnerConversationScript(div) { div.appendChild(innerConversationScript); } + + + + function getRooms(){ osichatroomsSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat/rooms/`); osichatroomsSocket.onopen = function () { console.log('WebSocket connection to rooms established'); + hideLoader(); osichatroomsSocket.send(JSON.stringify({ 'event_type': 'set_client_type', 'client_type': 'website_admin', @@ -39,11 +60,34 @@ function getRooms(){ if (chatRoomDiv) { chatRoomDiv.remove(); // Remove the existing chat room div } + // Insert the new chat room HTML at the top of the container const newChatRoomDiv = document.createElement('div'); newChatRoomDiv.innerHTML = data.html; roomsContainer.insertAdjacentElement('afterbegin', newChatRoomDiv.firstElementChild); + if (parseInt(currentChatId) === parseInt(data.chatroom_id)) { + const unreadIndicator = roomsContainer.querySelector(`.unread[data-roomid='${data.chatroom_id}']`); + if (unreadIndicator) { + unreadIndicator.classList.add('hidden'); + } + if (!data.user) { // If it is sent by a guest play a notification sound for the guest + const notificationSound = document.getElementById('notification-sound'); + notificationSound.play(); + + } + } else { + const unreadIndicator = roomsContainer.querySelector(`.unread[data-roomid='${data.chatroom_id}']`); + if (unreadIndicator) { + unreadIndicator.classList.remove('hidden'); + } + if (!data.user) { // If it is sent by a guest play a notification sound for the guest + const notificationSound = document.getElementById('notification-sound'); + notificationSound.play(); + } + } + + appendInnerConversationScript(leftDiv); break; @@ -53,12 +97,25 @@ function getRooms(){ }; osichatroomsSocket.onclose = function () { - console.log('WebSocket connection to rooms closed'); + showLoader(); + setTimeout(() => { + console.log('Attempting to reconnect to WebSocket...'); + getRooms(); + }, 2000); }; osichatroomsSocket.onerror = function (error) { + showLoader(); console.error('WebSocket error:', error); }; + + window.addEventListener('offline', () => { + showLoader(); + if (osichatroomsSocket) { + osichatroomsSocket.close(); + } + }); + } getRooms(); \ No newline at end of file diff --git a/osinaweb/static/js/osichat-admin/textarea.js b/osinaweb/static/js/osichat-admin/textarea.js index 066ed475..c8840d12 100644 --- a/osinaweb/static/js/osichat-admin/textarea.js +++ b/osinaweb/static/js/osichat-admin/textarea.js @@ -1,12 +1,14 @@ (function() { // FUNCTION TO ADJUST TEXTAREA HEIGHT AND SUBMIT BUTTON VISIBILITY function adjustTextAreaAndButton(textarea, submitButton) { + // Adjust the height of the textarea if (textarea.value.trim() === '') { textarea.style.height = '50px'; } else { textarea.style.height = textarea.scrollHeight + 'px'; } + // Display and hide the submit button if (textarea.value.trim() === '') { submitButton.classList.add('hidden'); } else { @@ -14,10 +16,21 @@ } } + function scrollBottom() { + const conversationContainer = document.getElementById('messages_container'); + + if (conversationContainer) { + conversationContainer.scrollTo({ + top: conversationContainer.scrollHeight, + behavior: 'smooth' + }); + } + } + + // INITIALIZE ELEMENTS const form = document.querySelector('#sendMessage'); const textarea = document.querySelector('#dynamicTextarea'); - const conversationContainer = document.getElementById('conversation'); const submitButton = document.getElementById('submitMessageButton'); const typingUserId = document.getElementById('userId').textContent.trim(); let typingTimeout; @@ -54,8 +67,18 @@ submitButton.classList.add('hidden'); setTimeout(() => { - conversationContainer.scrollTop = conversationContainer.scrollHeight; + scrollBottom(); }, 100); }); + textarea.addEventListener('keydown', (event) => { + if (event.key === 'Enter' && !event.shiftKey) { + event.preventDefault(); + if (!submitButton.classList.contains('hidden')) { + submitButton.click(); + } + scrollBottom(); + } + }); + })(); diff --git a/osinaweb/static/js/osichat/textarea.js b/osinaweb/static/js/osichat/textarea.js index 55aaead6..b177b473 100644 --- a/osinaweb/static/js/osichat/textarea.js +++ b/osinaweb/static/js/osichat/textarea.js @@ -18,15 +18,19 @@ function scrollBottom() { const conversationContainer = document.getElementById('conversation'); - conversationContainer.scrollTop = conversationContainer.scrollHeight; + + if (conversationContainer) { + conversationContainer.scrollTo({ + top: conversationContainer.scrollHeight, + behavior: 'smooth' + }); + } } - // INITIALIZE ELEMENTS const form = document.querySelector('#sendMessage'); const textarea = document.querySelector('#dynamicTextarea'); - const conversationContainer = document.getElementById('conversation'); const submitButton = document.getElementById('submitMessageButton'); let typingTimeout; let isTyping = false;