fixed code v2

This commit is contained in:
SlimusMinus
2026-08-12 00:38:04 +03:00
parent fe3c91446a
commit e45c9326ed
19 changed files with 233 additions and 124 deletions

View File

@@ -1,4 +1,4 @@
import { useEffect, useCallback } from "react";
import { useEffect, useState, useCallback } from "react";
import { useNavigate } from "react-router-dom";
import { useTranslation } from 'react-i18next';
import { useChats } from "../hooks/useChats";
@@ -8,6 +8,7 @@ import { getPostForChat } from "../stores/chatPostStore";
import { useDeleteChat } from "../hooks/useDeleteChat";
import ChatHeader from "../components/chat/ChatHeader";
import ChatListItem from "../components/chat/ChatListItem";
import Toast from "../components/Toast";
export default function ChatListPage() {
const { t } = useTranslation();
@@ -16,6 +17,7 @@ export default function ChatListPage() {
const { isAuthenticated } = useAuthContext();
const { unreadMap } = useUnread();
const { deleteChat } = useDeleteChat();
const [deleteError, setDeleteError] = useState("");
useEffect(() => {
if (isAuthenticated) {
@@ -25,8 +27,12 @@ export default function ChatListPage() {
const handleDeleteChat = useCallback(async (chatId) => {
if (!window.confirm(t('chat.confirmDeleteChat'))) return;
const ok = await deleteChat(chatId);
if (ok) fetchChats();
const result = await deleteChat(chatId);
if (result.success) {
fetchChats();
} else {
setDeleteError(result.error);
}
}, [t, deleteChat, fetchChats]);
const goBack = () => navigate("/feed");
@@ -63,12 +69,21 @@ export default function ChatListPage() {
chat={chat}
post={getPostForChat(chat.id)}
unreadMap={unreadMap}
t={t}
onOpen={openChat}
onDelete={handleDeleteChat}
/>
))}
</div>
</div>
{deleteError && (
<Toast
message={deleteError}
type="error"
onDismiss={() => setDeleteError("")}
/>
)}
</div>
);
}

View File

@@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next';
import { useChats } from "../hooks/useChats";
import { useChatSocket } from "../hooks/useChatSocket";
import { getPostForChat } from "../stores/chatPostStore";
import { sortMessages } from "../utils/chatDisplay";
import { setActiveChatId } from "../stores/activeChatStore";
import { useUnread } from "../context/UnreadContext";
import { useAuthContext } from "../context/AuthContext";
@@ -33,7 +34,7 @@ export default function ChatPage() {
const addMessage = useCallback((msg) => {
setMessages((prev) => {
if (msg.id != null && prev.some((m) => m.id === msg.id)) return prev;
return [...prev, msg];
return sortMessages([...prev, msg]);
});
}, []);
@@ -53,11 +54,14 @@ export default function ChatPage() {
.then((list) => {
// Мержим историю с уже пришедшими по сокету сообщениями,
// а не затираем их — иначе можно потерять сообщение, пришедшее
// по WS, пока REST-запрос ещё letел.
// по WS, пока REST-запрос ещё летел. История приходит DESC (новые
// сверху), поэтому всегда сортируем по времени — иначе после
// обновления страницы все сообщения последнего собеседника
// оказываются наверху и идут подряд.
setMessages((prev) => {
const byId = new Map(list.map((m) => [m.id, m]));
const extra = prev.filter((m) => !byId.has(m.id));
return [...list, ...extra];
return sortMessages([...list, ...extra]);
});
})
.catch(() => setLoadError(t('chat.loadError')));