+ {selectedChat ? (
+ <>
+ {/* Chat Header */}
+
+
+
+
+
+
handleViewUserProfile(selectedChat.user_id)}
+ className="w-12 h-12 flex-shrink-0 flex items-center justify-center cursor-pointer"
+ style={{
+ backgroundImage: selectedChat.avatar_url ? `url(${selectedChat.avatar_url})` : undefined,
+ backgroundSize: 'cover',
+ backgroundPosition: 'center',
+ borderRadius: selectedChat.avatar_url ? '50%' : '0',
+ }}
+ >
+ {!selectedChat.avatar_url && (
+
+ )}
+
+
+
handleViewUserProfile(selectedChat.user_id)}
+ >
+
+ {selectedChat.display_name}
+
+
+ в сети
+
+
+
+
+ {/* Messages Area */}
+
+ {loadingMore && (
+
+ )}
+ {messagesLoading ? (
+
+ ) : messagesError ? (
+
+ ) : messages.length === 0 ? (
+
+
+
+
+
+
+ Начните общение
+
+
+ Отправьте первое сообщение в этот чат
+
+
+
+ ) : (
+
+ {messages.map((message, index) => {
+ const isMyMessage = message.sender_id === user?.id;
+ const prevMessage = index > 0 ? messages[index - 1] : null;
+ const showAvatar = !prevMessage || prevMessage.sender_id !== message.sender_id;
+ const nextMessage = index < messages.length - 1 ? messages[index + 1] : null;
+ const isLastInGroup = !nextMessage || nextMessage.sender_id !== message.sender_id;
+
+ // Check if date changed from previous message
+ const messageDate = new Date(message.created_at);
+ const prevMessageDate = prevMessage ? new Date(prevMessage.created_at) : null;
+ const showDateDivider = !prevMessageDate ||
+ messageDate.toDateString() !== prevMessageDate.toDateString();
+
+ return (
+
+ {/* Date divider */}
+ {showDateDivider && (
+
+
+ {messageDate.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' })}
+
+
+ )}
+
+
+ {/* Avatar for incoming messages */}
+ {!isMyMessage && showAvatar && (
+
+ {!selectedChat.avatar_url && (
+
+ )}
+
+ )}
+
+ {/* Message bubble */}
+
+ {/* Sender name for incoming messages */}
+ {!isMyMessage && showAvatar && (
+
+ {selectedChat.display_name}
+
+ )}
+
+
+ {/* Edit button - показываем только для своих сообщений */}
+ {isMyMessage && editingMessageId !== message.id && (
+
+ )}
+
+ {/* Message content or edit input */}
+ {editingMessageId === message.id ? (
+
+ setEditingMessageText(e.target.value)}
+ onKeyDown={(e) => handleEditKeyPress(e, message.id)}
+ autoFocus
+ className="flex-1 bg-transparent border-b-2 outline-none"
+ style={{
+ borderColor: isMyMessage ? 'rgba(255,255,255,0.5)' : 'var(--accent-primary)',
+ color: isMyMessage ? 'white' : 'var(--text-primary)'
+ }}
+ />
+
+
+
+ ) : (
+ {message.content}
+ )}
+
+ {/* Message metadata */}
+
+ {/* Edited indicator */}
+ {message.is_edited && (
+
+ изменено
+
+ )}
+
+
+ {new Date(message.created_at).toLocaleTimeString('ru-RU', {
+ hour: '2-digit',
+ minute: '2-digit'
+ })}
+
+
+ {/* Read status for my messages */}
+ {isMyMessage && (
+
+ )}
+
+
+
+ {/* Reactions placeholder - можно добавить позже */}
+ {isLastInGroup && false && (
+
+ ❤️
+
+ )}
+
+
+
+ );
+ })}
+
+ {/* Invisible element to scroll to */}
+
+
+ )}
+
+
+ {/* Scroll to bottom button with unread counter - OUTSIDE scroll container */}
+
+ {showScrollButton && (
+
+
+ {unreadCount > 0 && (
+
+ {unreadCount > 99 ? '99+' : unreadCount}
+
+ )}
+
+ )}
+
+
+ {/* Message Input */}
+
+
+
setMessageText(e.target.value)}
+ onKeyPress={handleKeyPress}
+ placeholder="Написать сообщение..."
+ disabled={sendingMessage}
+ className="flex-1 px-4 py-3 rounded-2xl font-inter text-sm outline-none transition"
+ style={{
+ backgroundColor: 'var(--bg-input)',
+ color: 'var(--text-primary)',
+ borderBottom: '2px solid transparent',
+ }}
+ onFocus={(e) => e.target.style.borderBottomColor = 'var(--accent-primary)'}
+ onBlur={(e) => e.target.style.borderBottomColor = 'transparent'}
+ />
+
+ {sendingMessage ? (
+
+ ) : (
+
+ )}
+
+
+
+ >
+ ) : (
+ /* Empty State */
+
+
+
+
+

+
+
+ Добро пожаловать в Aether
+
+
+ Выберите существующий чат из списка слева или создайте новый, чтобы начать общение
+
+
+
+
+ )}
+