fix: hide department chats from unrelated users in messages list
This commit is contained in:
parent
ccad715e36
commit
c30d8ddbcc
@ -93,6 +93,24 @@ function getChatSortTimestamp(chat: Chat): number {
|
||||
return Number.isNaN(chatCreatedTs) ? 0 : chatCreatedTs;
|
||||
}
|
||||
|
||||
function isChatVisibleInMessagesList(
|
||||
chat: Chat,
|
||||
visibleDepartmentIds: ReadonlySet<number>
|
||||
): 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<number>();
|
||||
(user?.departments || []).forEach((department) => {
|
||||
if (typeof department.id === "number") {
|
||||
ids.add(department.id);
|
||||
}
|
||||
});
|
||||
return ids;
|
||||
}, [user?.departments]);
|
||||
const [chats, setChats] = useState<Chat[]>([]);
|
||||
const [search, setSearch] = useState("");
|
||||
const [chatTypeFilter, setChatTypeFilter] = useState<string>("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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user