fix chat
This commit is contained in:
parent
7c12c70f90
commit
0948e41294
@ -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")
|
for (let i = messages.length - 1; i >= 0; i--) {
|
||||||
console.log(open)
|
const message = messages[i];
|
||||||
if (messages.length > 1) {
|
const isOwnMessage = (ticket.sessionData?.sessionId || user) === message.user_id;
|
||||||
|
|
||||||
let last_message
|
// Пропускаем системные сообщения
|
||||||
|
if (message.ticket_id === "111") {
|
||||||
for (let i = messages.length - 1; i >= 0; i--) {
|
continue;
|
||||||
if (messages[i].ticket_id !== "111") {
|
|
||||||
last_message = messages[i];
|
|
||||||
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 => {
|
||||||
|
73
src/support/hooks/useMessageOwnership.ts
Normal file
73
src/support/hooks/useMessageOwnership.ts
Normal file
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user