73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
|
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;
|
|||
|
};
|