From c30d8ddbccd0a40b88b8873bfaec67a7430d686f Mon Sep 17 00:00:00 2001 From: lizerk Date: Thu, 16 Apr 2026 12:45:54 +0300 Subject: [PATCH] fix: hide department chats from unrelated users in messages list --- frontend/src/app/messages/page.tsx | 41 +++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/messages/page.tsx b/frontend/src/app/messages/page.tsx index 9908b902..ce25906a 100644 --- a/frontend/src/app/messages/page.tsx +++ b/frontend/src/app/messages/page.tsx @@ -93,6 +93,24 @@ function getChatSortTimestamp(chat: Chat): number { return Number.isNaN(chatCreatedTs) ? 0 : chatCreatedTs; } +function isChatVisibleInMessagesList( + chat: Chat, + visibleDepartmentIds: ReadonlySet +): boolean { + const chatType = chat.chat_type || chat.type; + + if (chatType !== "comments") { + return true; + } + + if (!isDepartmentCommentsChat(chat)) { + return false; + } + + return typeof chat.context_object_id === "number" + && visibleDepartmentIds.has(chat.context_object_id); +} + export default function MessagesPage() { const { user } = useUser(); const router = useRouter(); @@ -111,6 +129,15 @@ export default function MessagesPage() { }), [currentUserEmail, currentUserFirstName, currentUserLastName, currentUserPatronymic] ); + const visibleDepartmentIds = useMemo(() => { + const ids = new Set(); + (user?.departments || []).forEach((department) => { + if (typeof department.id === "number") { + ids.add(department.id); + } + }); + return ids; + }, [user?.departments]); const [chats, setChats] = useState([]); const [search, setSearch] = useState(""); const [chatTypeFilter, setChatTypeFilter] = useState("all"); @@ -147,7 +174,11 @@ export default function MessagesPage() { } setError(null); const items = await apiClient.getAllChats(); - setChats(items); + setChats( + items.filter((chat) => + isChatVisibleInMessagesList(chat, visibleDepartmentIds) + ) + ); hasCompletedInitialLoadRef.current = true; } catch (e: unknown) { console.error("Ошибка загрузки чатов:", e); @@ -158,7 +189,7 @@ export default function MessagesPage() { setLoading(false); } } - }, []); + }, [visibleDepartmentIds]); const refreshChat = useCallback(async (chatId: number) => { if (!Number.isFinite(chatId) || chatId <= 0) { @@ -174,6 +205,10 @@ export default function MessagesPage() { try { const chat = await apiClient.getChat(chatId); setChats((prev) => { + if (!isChatVisibleInMessagesList(chat, visibleDepartmentIds)) { + return prev.filter((item) => item.id !== chatId); + } + const existingIndex = prev.findIndex((item) => item.id === chatId); if (existingIndex === -1) { return [chat, ...prev]; @@ -192,7 +227,7 @@ export default function MessagesPage() { } finally { refreshChatInFlightRef.current.delete(chatId); } - }, [loadChats]); + }, [loadChats, visibleDepartmentIds]); useEffect(() => { void loadChats();