diff --git a/package.json b/package.json index d9b1886..2dd8f33 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@emotion/react": "^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/material": "^5.10.14", "@popperjs/core": "^2.11.8", diff --git a/src/components/FloatingSupportChat/Chat.tsx b/src/components/FloatingSupportChat/Chat.tsx index 4a76beb..480a01e 100644 --- a/src/components/FloatingSupportChat/Chat.tsx +++ b/src/components/FloatingSupportChat/Chat.tsx @@ -158,8 +158,12 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) { url: process.env.REACT_APP_DOMAIN + `/heruvym/v1.0.0/ticket?ticket=${sessionData?.ticketId}&s=${sessionData?.sessionId}`, + onNewData: (ticketMessages) => { - console.log("ticketMessages useSSESubscription " + ticketMessages) + console.log("Chat") + + console.log("ticketMessages useSSESubscription ") + console.log(ticketMessages) const isTicketClosed = ticketMessages.some( (message) => message.session_id === "close" ); @@ -171,10 +175,14 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) { } return; } + +console.log("under checking some close message -----------------------------------------") + updateSSEValue(ticketMessages); addOrUpdateUnauthMessages(ticketMessages); }, onDisconnect: useCallback(() => { + console.log("DISCONNECT") setUnauthIsPreventAutoscroll(false); setSseEnabled(false); }, []), @@ -249,41 +257,39 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) { ); useEffect(() => { - if (open) { - console.log("SHOWN") - 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--) { - if (messages[i].ticket_id !== "111") { - last_message = messages[i]; - break; - } + if (open && messages.length > 1) { + let lastUnreadMessage = null; + + // Ищем последнее непрочитанное чужое сообщение до первого прочитанного или своего + for (let i = messages.length - 1; i >= 0; i--) { + const message = messages[i]; + const isOwnMessage = (ticket.sessionData?.sessionId || user) === message.user_id; + + // Пропускаем системные сообщения + if (message.ticket_id === "111") { + continue; } - - console.log("last_message") - console.log(last_message) - - 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 (isOwnMessage) { + break; } + + // Если встретили прочитанное сообщение - прерываем поиск + if (message.shown?.me === 1) { + break; + } + + // Если сообщение чужое и не прочитано - запоминаем его + if (!isOwnMessage && message.shown?.me !== 1) { + lastUnreadMessage = message; + break; + } + } + + // Если нашли непрочитанное сообщение - отмечаем его как прочитанное + if (lastUnreadMessage) { + shownMessage(lastUnreadMessage.id); } } }, [open, messages]); diff --git a/src/components/ProtectedLayout.tsx b/src/components/ProtectedLayout.tsx index 444b1d4..91d77d1 100644 --- a/src/components/ProtectedLayout.tsx +++ b/src/components/ProtectedLayout.tsx @@ -40,6 +40,7 @@ export default function ProtectedLayout() { process.env.REACT_APP_DOMAIN + `/heruvym/v1.0.0/subscribe?Authorization=${token}`, onNewData: (data) => { + console.log("ProtectedLayout") updateSSEValue(data); updateTickets(data.filter((d) => Boolean(d.id))); setTicketCount(data.length); diff --git a/src/pages/Support/SupportChat.tsx b/src/pages/Support/SupportChat.tsx index 6ccdf79..199349e 100644 --- a/src/pages/Support/SupportChat.tsx +++ b/src/pages/Support/SupportChat.tsx @@ -99,7 +99,9 @@ function SupportChat() { url: process.env.REACT_APP_DOMAIN + `/heruvym/v1.0.0/ticket?ticket=${ticketId}&Authorization=${token}`, + onNewData: (ticketMessages) => { + console.log("SupportChat") console.log("ticketMessages") console.log(ticketMessages) const data = ticketMessages.filter(t => { diff --git a/src/support/hooks/useMessageOwnership.ts b/src/support/hooks/useMessageOwnership.ts new file mode 100644 index 0000000..2ac677d --- /dev/null +++ b/src/support/hooks/useMessageOwnership.ts @@ -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; +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 7481d4e..d13bbba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1516,10 +1516,10 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@frontend/kitui@^1.0.100": - version "1.0.100" - resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.100/kitui-1.0.100.tgz#36045436d129ca8aaccbe0b2f7065d575eabed9f" - integrity sha512-kt7WqtpAfzOaMH0T9BhUMnn9p5Vb+PxZXuBs8I4YCno4BLmcHMSQ3ZsGYKAZRvpTZx8GIQbi2V83VRe+v5xSmA== +"@frontend/kitui@^1.0.108": + version "1.0.108" + resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.108/kitui-1.0.108.tgz#1bb609dfe07668b6fd9a7b8618c229e0bb609f1e" + integrity sha512-4DiF7GHX0RbBMZpFioclc3B87N+HrGLv1B3DveUCdHzukfxvFXyEKnRZQ4wYljO2A3FLSD9+4Dr6cSuZYw95OQ== dependencies: immer "^10.0.2" reconnecting-eventsource "^1.6.2"