fixed code v2
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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')));
|
||||
|
||||
Reference in New Issue
Block a user