Исправлен механизм прочтения сообщений
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user