|
240 | 240 |
|
241 | 241 | .message { |
242 | 242 | display: flex; |
243 | | - margin-bottom: 3px; |
| 243 | + margin-bottom: 2px; |
244 | 244 | align-items: flex-start; |
245 | 245 | } |
246 | 246 |
|
247 | 247 | .message.own { |
248 | 248 | flex-direction: row-reverse; |
249 | 249 | } |
250 | 250 |
|
| 251 | + .message.author-change { |
| 252 | + margin-top: 10px; |
| 253 | + } |
| 254 | + |
251 | 255 | .message-avatar { |
252 | 256 | width: 32px; |
253 | 257 | height: 32px; |
|
312 | 316 | color: white; |
313 | 317 | } |
314 | 318 |
|
| 319 | + /* Message grouping styles - inward corners always 16px */ |
| 320 | + /* Regular messages (left side) - top-right, bottom-right always 16px */ |
| 321 | + .message.group-first .message-content { |
| 322 | + border-radius: 16px 16px 16px 3px; |
| 323 | + } |
| 324 | + |
| 325 | + .message.group-middle .message-content { |
| 326 | + border-radius: 3px 16px 16px 3px; |
| 327 | + } |
| 328 | + |
| 329 | + .message.group-last .message-content { |
| 330 | + border-radius: 3px 16px 16px 16px; |
| 331 | + } |
| 332 | + |
| 333 | + .message.group-single .message-content { |
| 334 | + border-radius: 16px; |
| 335 | + } |
| 336 | + |
| 337 | + /* Own messages (right side) - top-left, bottom-left always 16px */ |
| 338 | + .message.own.group-first .message-content { |
| 339 | + border-radius: 16px 16px 3px 16px; |
| 340 | + } |
| 341 | + |
| 342 | + .message.own.group-middle .message-content { |
| 343 | + border-radius: 16px 3px 3px 16px; |
| 344 | + } |
| 345 | + |
| 346 | + .message.own.group-last .message-content { |
| 347 | + border-radius: 16px 3px 16px 16px; |
| 348 | + } |
| 349 | + |
| 350 | + .message.own.group-single .message-content { |
| 351 | + border-radius: 16px; |
| 352 | + } |
| 353 | + |
315 | 354 | .message-text { |
316 | 355 | font-size: 0.9rem; |
317 | 356 | line-height: 1.4; |
|
674 | 713 | } |
675 | 714 |
|
676 | 715 | // Reverse messages to show oldest first |
677 | | - messages.reverse().forEach(message => { |
| 716 | + messages.reverse(); |
| 717 | + |
| 718 | + // Group messages by author and determine position in group |
| 719 | + const messagesWithGrouping = messages.map((message, index) => { |
| 720 | + const prevMessage = index > 0 ? messages[index - 1] : null; |
| 721 | + const nextMessage = index < messages.length - 1 ? messages[index + 1] : null; |
| 722 | + |
| 723 | + const sameAsPrev = prevMessage && prevMessage.authorId === message.authorId; |
| 724 | + const sameAsNext = nextMessage && nextMessage.authorId === message.authorId; |
| 725 | + const isAuthorChange = !sameAsPrev; |
| 726 | + |
| 727 | + let groupPosition; |
| 728 | + if (!sameAsPrev && !sameAsNext) { |
| 729 | + groupPosition = 'single'; |
| 730 | + } else if (!sameAsPrev && sameAsNext) { |
| 731 | + groupPosition = 'first'; |
| 732 | + } else if (sameAsPrev && sameAsNext) { |
| 733 | + groupPosition = 'middle'; |
| 734 | + } else if (sameAsPrev && !sameAsNext) { |
| 735 | + groupPosition = 'last'; |
| 736 | + } |
| 737 | + |
| 738 | + return { ...message, groupPosition, isAuthorChange }; |
| 739 | + }); |
| 740 | + |
| 741 | + messagesWithGrouping.forEach(message => { |
678 | 742 | const messageElement = createMessageElement(message); |
679 | 743 | messagesContainer.appendChild(messageElement); |
680 | 744 | }); |
|
693 | 757 | messageDiv.classList.add('own'); |
694 | 758 | } |
695 | 759 |
|
| 760 | + // Add grouping class for corner radius styling |
| 761 | + if (message.groupPosition) { |
| 762 | + messageDiv.classList.add(`group-${message.groupPosition}`); |
| 763 | + } |
| 764 | + |
| 765 | + // Add author-change class for additional spacing |
| 766 | + if (message.isAuthorChange) { |
| 767 | + messageDiv.classList.add('author-change'); |
| 768 | + } |
| 769 | + |
696 | 770 | // Find author info |
697 | 771 | const chat = chats.find(c => c.id === currentChatId); |
698 | 772 | const author = chat?.allUsers.find(user => user.id === message.authorId); |
|
0 commit comments