fix chat
All checks were successful
Deploy / CreateImage (push) Successful in 4m6s
Deploy / DeployService (push) Successful in 21s

This commit is contained in:
Nastya 2025-05-18 11:45:18 +03:00
parent 7c12c70f90
commit 0948e41294
6 changed files with 121 additions and 39 deletions

@ -16,7 +16,7 @@
"@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@emotion/react": "^11.10.5", "@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5", "@emotion/styled": "^11.10.5",
"@frontend/kitui": "^1.0.100", "@frontend/kitui": "^1.0.108",
"@mui/icons-material": "^5.10.14", "@mui/icons-material": "^5.10.14",
"@mui/material": "^5.10.14", "@mui/material": "^5.10.14",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",

@ -158,8 +158,12 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) {
url: url:
process.env.REACT_APP_DOMAIN + process.env.REACT_APP_DOMAIN +
`/heruvym/v1.0.0/ticket?ticket=${sessionData?.ticketId}&s=${sessionData?.sessionId}`, `/heruvym/v1.0.0/ticket?ticket=${sessionData?.ticketId}&s=${sessionData?.sessionId}`,
onNewData: (ticketMessages) => { onNewData: (ticketMessages) => {
console.log("ticketMessages useSSESubscription " + ticketMessages) console.log("Chat")
console.log("ticketMessages useSSESubscription ")
console.log(ticketMessages)
const isTicketClosed = ticketMessages.some( const isTicketClosed = ticketMessages.some(
(message) => message.session_id === "close" (message) => message.session_id === "close"
); );
@ -171,10 +175,14 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) {
} }
return; return;
} }
console.log("under checking some close message -----------------------------------------")
updateSSEValue(ticketMessages); updateSSEValue(ticketMessages);
addOrUpdateUnauthMessages(ticketMessages); addOrUpdateUnauthMessages(ticketMessages);
}, },
onDisconnect: useCallback(() => { onDisconnect: useCallback(() => {
console.log("DISCONNECT")
setUnauthIsPreventAutoscroll(false); setUnauthIsPreventAutoscroll(false);
setSseEnabled(false); setSseEnabled(false);
}, []), }, []),
@ -249,41 +257,39 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) {
); );
useEffect(() => { useEffect(() => {
if (open) { if (open && messages.length > 1) {
console.log("SHOWN") let lastUnreadMessage = null;
console.log("messages")
console.log(messages)
console.log("open")
console.log(open)
if (messages.length > 1) {
let last_message // Ищем последнее непрочитанное чужое сообщение до первого прочитанного или своего
for (let i = messages.length - 1; i >= 0; i--) {
const message = messages[i];
const isOwnMessage = (ticket.sessionData?.sessionId || user) === message.user_id;
for (let i = messages.length - 1; i >= 0; i--) { // Пропускаем системные сообщения
if (messages[i].ticket_id !== "111") { if (message.ticket_id === "111") {
last_message = messages[i]; continue;
break;
}
} }
console.log("last_message") // Если встретили своё сообщение - прерываем поиск
console.log(last_message) if (isOwnMessage) {
break;
if (last_message) {
console.log("if")
console.log(((ticket.sessionData?.sessionId || user) !== last_message.user_id) && last_message.shown.me !== 1 && last_message.ticket_id !== "111")
console.log(((ticket.sessionData?.sessionId || user) !== last_message.user_id))
console.log(last_message.shown.me !== 1)
if (((ticket.sessionData?.sessionId || user) !== last_message.user_id) && last_message.shown.me !== 1 && last_message.ticket_id !== "111") {
shownMessage(last_message.id);
}
console.log("user")
console.log(user)
console.log(messages[messages.length - 1])
} }
// Если встретили прочитанное сообщение - прерываем поиск
if (message.shown?.me === 1) {
break;
}
// Если сообщение чужое и не прочитано - запоминаем его
if (!isOwnMessage && message.shown?.me !== 1) {
lastUnreadMessage = message;
break;
}
}
// Если нашли непрочитанное сообщение - отмечаем его как прочитанное
if (lastUnreadMessage) {
shownMessage(lastUnreadMessage.id);
} }
} }
}, [open, messages]); }, [open, messages]);

@ -40,6 +40,7 @@ export default function ProtectedLayout() {
process.env.REACT_APP_DOMAIN + process.env.REACT_APP_DOMAIN +
`/heruvym/v1.0.0/subscribe?Authorization=${token}`, `/heruvym/v1.0.0/subscribe?Authorization=${token}`,
onNewData: (data) => { onNewData: (data) => {
console.log("ProtectedLayout")
updateSSEValue(data); updateSSEValue(data);
updateTickets(data.filter((d) => Boolean(d.id))); updateTickets(data.filter((d) => Boolean(d.id)));
setTicketCount(data.length); setTicketCount(data.length);

@ -99,7 +99,9 @@ function SupportChat() {
url: url:
process.env.REACT_APP_DOMAIN + process.env.REACT_APP_DOMAIN +
`/heruvym/v1.0.0/ticket?ticket=${ticketId}&Authorization=${token}`, `/heruvym/v1.0.0/ticket?ticket=${ticketId}&Authorization=${token}`,
onNewData: (ticketMessages) => { onNewData: (ticketMessages) => {
console.log("SupportChat")
console.log("ticketMessages") console.log("ticketMessages")
console.log(ticketMessages) console.log(ticketMessages)
const data = ticketMessages.filter(t => { const data = ticketMessages.filter(t => {

@ -0,0 +1,73 @@
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;
};

@ -1516,10 +1516,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
"@frontend/kitui@^1.0.100": "@frontend/kitui@^1.0.108":
version "1.0.100" version "1.0.108"
resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.100/kitui-1.0.100.tgz#36045436d129ca8aaccbe0b2f7065d575eabed9f" resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.108/kitui-1.0.108.tgz#1bb609dfe07668b6fd9a7b8618c229e0bb609f1e"
integrity sha512-kt7WqtpAfzOaMH0T9BhUMnn9p5Vb+PxZXuBs8I4YCno4BLmcHMSQ3ZsGYKAZRvpTZx8GIQbi2V83VRe+v5xSmA== integrity sha512-4DiF7GHX0RbBMZpFioclc3B87N+HrGLv1B3DveUCdHzukfxvFXyEKnRZQ4wYljO2A3FLSD9+4Dr6cSuZYw95OQ==
dependencies: dependencies:
immer "^10.0.2" immer "^10.0.2"
reconnecting-eventsource "^1.6.2" reconnecting-eventsource "^1.6.2"