front-hub/src/support/hooks/useMessageOwnership.ts

73 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-05-18 08:45:18 +00:00
import { TicketMessage } from "@frontend/kitui";
import { useUserStore } from "@root/stores/user";
interface UseMessageOwnershipProps {
message: TicketMessage;
sessionId?: string;
ticketUserId?: string;
}
interface UseMessageOwnershipResult {
isOwnMessage: boolean;
isUnread: boolean;
}
export const useMessageOwnership = ({
message,
sessionId,
ticketUserId
}: UseMessageOwnershipProps): UseMessageOwnershipResult => {
const userId = useUserStore((state) => state.user?._id);
// Определяем владельца сообщения
const isOwnMessage = (sessionId || userId || ticketUserId) === message.user_id;
// Сообщение считается непрочитанным если:
// 1. Оно не моё
// 2. Не отмечено как прочитанное (shown.me !== 1)
// 3. Не является системным (ticket_id !== "111")
const isUnread = !isOwnMessage && message.shown?.me !== 1 && message.ticket_id !== "111";
return {
isOwnMessage,
isUnread
};
};
interface UseUnreadMessagesCountProps {
messages: TicketMessage[];
sessionId?: string;
ticketUserId?: string;
}
export const useUnreadMessagesCount = ({
messages,
sessionId,
ticketUserId
}: UseUnreadMessagesCountProps): number => {
const userId = useUserStore((state) => state.user?._id);
// Считаем непрочитанные сообщения до первого прочитанного или своего
let unreadCount = 0;
for (const message of messages) {
const isOwnMessage = (sessionId || userId || ticketUserId) === message.user_id;
// Если это моё сообщение - прерываем подсчет
if (isOwnMessage) {
break;
}
// Если это чужое сообщение и оно не прочитано и не системное - увеличиваем счетчик
if (!isOwnMessage && message.shown?.me !== 1 && message.ticket_id !== "111") {
unreadCount++;
}
// Если встретили прочитанное сообщение - прерываем подсчет
if (message.shown?.me === 1) {
break;
}
}
return unreadCount;
};