Исправлен механизм прочтения сообщений

This commit is contained in:
Халимов Рустам
2026-04-20 21:44:39 +03:00
parent 0f593e52e0
commit 83ed328dd5
12 changed files with 224 additions and 162 deletions
@@ -125,9 +125,9 @@ export const useChatStore = create<ChatState>((set, get) => ({
set({ isLoadingMessages: true });
const currentMessages = state.messages[chatId] || [];
const cursor = !reset && currentMessages.length > 0 ? currentMessages[0].sequenceId.toString() : undefined;
const fetched = await ChatApi.getMessages(chatId, cursor);
set((state) => {
// Merge fetched messages with any that arrived via socket
const existing = reset ? [] : (state.messages[chatId] || []);
@@ -401,6 +401,7 @@ export const useChatStore = create<ChatState>((set, get) => ({
if (m.sequenceId <= lastReadSequenceId) {
const alreadyRead = m.readBy?.some((r) => r.userId === userId);
if (alreadyRead) return m;
// Увеличиваем счётчик только если текущий пользователь читает чужие сообщения
if (userId === currentUserId && m.senderId !== currentUserId) newlyReadCount++;
return { ...m, readBy: [...(m.readBy || []), { userId }] };
}
@@ -412,6 +413,7 @@ export const useChatStore = create<ChatState>((set, get) => ({
const updatedChats = state.chats.map((chat) => {
if (chat.id === chatId) {
const updatedLastMessages = chat.messages?.map(updateMsg);
// Уменьшаем unreadCount только если текущий пользователь прочитал сообщения
if (userId === currentUserId) {
return { ...chat, messages: updatedLastMessages, unreadCount: Math.max(0, (chat.unreadCount || 0) - newlyReadCount) };
}
@@ -475,16 +477,16 @@ export const useChatStore = create<ChatState>((set, get) => ({
addChat: (chat) => {
set((state) => {
const existing = state.chats.find((c) => c.id === chat.id);
const messagesFromState = state.messages[chat.id] || [];
const messagesToUse = messagesFromState.length > 0 ? messagesFromState : (chat.messages || []);
let unreadCount = chat.unreadCount || 0;
if (!existing && messagesFromState.length > 0) {
const userId = useAuthStore.getState().user?.id;
unreadCount = messagesFromState.filter((m) => m.senderId !== userId && !m.readBy?.some(r => r.userId === userId)).length;
}
const updatedChat = { ...chat, messages: messagesToUse.length > 0 ? [messagesToUse[messagesToUse.length - 1]] : [], unreadCount };
if (existing) {
@@ -524,9 +526,9 @@ export const useChatStore = create<ChatState>((set, get) => ({
const existing = state.pinnedMessages[chatId] || [];
if (existing.some(m => m.id === message.id)) return state;
return {
pinnedMessages: {
...state.pinnedMessages,
[chatId]: [...existing, message]
pinnedMessages: {
...state.pinnedMessages,
[chatId]: [...existing, message]
},
};
});
@@ -550,7 +552,7 @@ export const useChatStore = create<ChatState>((set, get) => ({
try {
set({ isLoadingMessages: true });
const fetched = await ChatApi.getMessages(chatId, undefined, sequenceId, 50);
set((state) => ({
messages: { ...state.messages, [chatId]: fetched },
// Since we jumped, we assume there is more history to load above