fix shown
This commit is contained in:
parent
0ae7cb702f
commit
ce2582569b
@ -40,7 +40,10 @@ function Drawers() {
|
|||||||
const siteReadyPayCart = allTypesOfPurchases(state => state.siteReadyPayCart)
|
const siteReadyPayCart = allTypesOfPurchases(state => state.siteReadyPayCart)
|
||||||
|
|
||||||
const notificationsCount = tickets.filter(
|
const notificationsCount = tickets.filter(
|
||||||
({ user, top_message }) => user !== top_message.user_id && top_message.shown.me !== 1
|
({ user, top_message }) =>
|
||||||
|
user !== top_message.user_id &&
|
||||||
|
top_message.shown.me !== 1 &&
|
||||||
|
!top_message.system
|
||||||
).length;
|
).length;
|
||||||
|
|
||||||
async function handlePayClick() {
|
async function handlePayClick() {
|
||||||
@ -134,7 +137,10 @@ function Drawers() {
|
|||||||
setOpen={setOpenNotificationsModal}
|
setOpen={setOpenNotificationsModal}
|
||||||
anchorElement={bellRef.current}
|
anchorElement={bellRef.current}
|
||||||
notifications={tickets
|
notifications={tickets
|
||||||
.filter(({ user, top_message }) => user !== top_message.user_id)
|
.filter(({ user, top_message }) =>
|
||||||
|
user !== top_message.user_id &&
|
||||||
|
!top_message.system
|
||||||
|
)
|
||||||
.map((ticket) => ({
|
.map((ticket) => ({
|
||||||
text: "У вас новое сообщение от техподдержки",
|
text: "У вас новое сообщение от техподдержки",
|
||||||
date: new Date(ticket.updated_at).toLocaleDateString(),
|
date: new Date(ticket.updated_at).toLocaleDateString(),
|
||||||
|
@ -250,41 +250,42 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (open && messages.length > 1) {
|
if (open && messages.length > 1) {
|
||||||
|
// Ищем последнее непрочитанное сообщение НЕ от текущего пользователя
|
||||||
let lastUnreadMessage = null;
|
let lastUnreadMessage = null;
|
||||||
|
|
||||||
// Ищем последнее непрочитанное чужое сообщение до первого прочитанного или своего
|
|
||||||
for (let i = messages.length - 1; i >= 0; i--) {
|
for (let i = messages.length - 1; i >= 0; i--) {
|
||||||
const message = messages[i];
|
const message = messages[i];
|
||||||
const isOwnMessage = (ticket.sessionData?.sessionId || user) === message.user_id;
|
|
||||||
|
|
||||||
// Пропускаем системные сообщения
|
// Пропускаем системные сообщения (приветствие)
|
||||||
if (message.ticket_id === "111") {
|
if (message.ticket_id === "111" || message.system) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если встретили своё сообщение - прерываем поиск
|
// Определяем, является ли сообщение от текущего пользователя
|
||||||
|
const currentUserId = user || ticket.sessionData?.sessionId;
|
||||||
|
const isOwnMessage = currentUserId === message.user_id;
|
||||||
|
|
||||||
|
// Если сообщение от нас - пропускаем
|
||||||
if (isOwnMessage) {
|
if (isOwnMessage) {
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если встретили прочитанное сообщение - прерываем поиск
|
// Если сообщение уже прочитано - пропускаем
|
||||||
if (message.shown?.me === 1) {
|
if (message.shown?.me === 1) {
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если сообщение чужое и не прочитано - запоминаем его
|
// Нашли непрочитанное сообщение не от нас - запоминаем его
|
||||||
if (!isOwnMessage && message.shown?.me !== 1) {
|
|
||||||
lastUnreadMessage = message;
|
lastUnreadMessage = message;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Если нашли непрочитанное сообщение - отмечаем его как прочитанное
|
// Отправляем shown только на последнее непрочитанное сообщение не от нас
|
||||||
if (lastUnreadMessage) {
|
if (lastUnreadMessage) {
|
||||||
shownMessage(lastUnreadMessage.id);
|
shownMessage(lastUnreadMessage.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [open, messages]);
|
}, [open, messages, user, ticket.sessionData?.sessionId]);
|
||||||
|
|
||||||
const loadNewMessages = (
|
const loadNewMessages = (
|
||||||
event: WheelEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>
|
event: WheelEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>
|
||||||
|
@ -42,7 +42,7 @@ export default function FloatingSupportChat() {
|
|||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const isMobile = useMediaQuery(theme.breakpoints.down(800));
|
const isMobile = useMediaQuery(theme.breakpoints.down(800));
|
||||||
const user = useUserStore((state) => state.user?._id);
|
const user = useUserStore((state) => state.user?._id);
|
||||||
const { messages } = useTicketStore(
|
const { messages, sessionData } = useTicketStore(
|
||||||
(state) => state[user ? "authData" : "unauthData"]
|
(state) => state[user ? "authData" : "unauthData"]
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -72,17 +72,44 @@ export default function FloatingSupportChat() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const unreadMessagesCount = useMemo(() => {
|
const unreadMessagesCount = useMemo(() => {
|
||||||
let count = 0;
|
if (messages.length === 0) return 0;
|
||||||
|
|
||||||
// Идём с конца массива к началу
|
// Получаем последнее сообщение
|
||||||
for (let i = messages.length - 1; i >= 0; i--) {
|
const lastMessage = messages[messages.length - 1];
|
||||||
|
|
||||||
|
// Определяем, является ли сообщение от текущего пользователя
|
||||||
|
const currentUserId = user || sessionData?.sessionId;
|
||||||
|
const isLastMessageOwn = currentUserId === lastMessage.user_id;
|
||||||
|
|
||||||
|
// Если последнее сообщение моё - не показываем количество
|
||||||
|
if (isLastMessageOwn) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если последнее сообщение не моё, но прочитано - не показываем количество
|
||||||
|
if (lastMessage.shown?.me === 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если последнее сообщение не моё и не прочитано - считаем его +1
|
||||||
|
let count = 1;
|
||||||
|
|
||||||
|
// Считаем все предыдущие непрочитанные сообщения до своего
|
||||||
|
for (let i = messages.length - 2; i >= 0; i--) {
|
||||||
const message = messages[i];
|
const message = messages[i];
|
||||||
|
|
||||||
// Пропускаем сообщение с id "111"
|
// Пропускаем системные сообщения
|
||||||
if (message.id === "111") continue;
|
if (message.id === "111" || message.system) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Если сообщение не прочитано (shown.me !== 1)
|
// Если встретили своё сообщение - прекращаем подсчёт
|
||||||
if (message.shown.me !== 1) {
|
if (currentUserId === message.user_id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если сообщение не прочитано - увеличиваем счетчик
|
||||||
|
if (message.shown?.me !== 1) {
|
||||||
count++;
|
count++;
|
||||||
} else {
|
} else {
|
||||||
// Встретили прочитанное сообщение - прекращаем подсчёт
|
// Встретили прочитанное сообщение - прекращаем подсчёт
|
||||||
@ -91,7 +118,7 @@ export default function FloatingSupportChat() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}, [messages]); // Зависимость от messages - пересчитывается при их изменении
|
}, [messages, user, sessionData?.sessionId]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onResize = () => {
|
const onResize = () => {
|
||||||
|
@ -48,7 +48,9 @@ export default function NavbarCollapsed({ children }: Props) {
|
|||||||
|
|
||||||
const notificationsCount = tickets.filter(
|
const notificationsCount = tickets.filter(
|
||||||
({ user, top_message }) =>
|
({ user, top_message }) =>
|
||||||
user !== top_message.user_id && top_message.shown.me !== 1
|
user !== top_message.user_id &&
|
||||||
|
top_message.shown.me !== 1 &&
|
||||||
|
!top_message.system
|
||||||
).length
|
).length
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -186,7 +188,10 @@ export default function NavbarCollapsed({ children }: Props) {
|
|||||||
setOpen={setOpenNotificationsModal}
|
setOpen={setOpenNotificationsModal}
|
||||||
anchorElement={bellRef.current}
|
anchorElement={bellRef.current}
|
||||||
notifications={tickets
|
notifications={tickets
|
||||||
.filter(({ user, top_message }) => user !== top_message.user_id)
|
.filter(({ user, top_message }) =>
|
||||||
|
user !== top_message.user_id &&
|
||||||
|
!top_message.system
|
||||||
|
)
|
||||||
.map((ticket) => ({
|
.map((ticket) => ({
|
||||||
text: "У вас новое сообщение от техподдержки",
|
text: "У вас новое сообщение от техподдержки",
|
||||||
date: new Date(ticket.updated_at).toLocaleDateString(),
|
date: new Date(ticket.updated_at).toLocaleDateString(),
|
||||||
|
@ -23,6 +23,7 @@ function TicketList() {
|
|||||||
const fetchState = useTicketStore(state => state.ticketsFetchState)
|
const fetchState = useTicketStore(state => state.ticketsFetchState)
|
||||||
|
|
||||||
const sortedTickets = tickets
|
const sortedTickets = tickets
|
||||||
|
.filter(ticket => !ticket?.top_message?.system)
|
||||||
.sort(sortTicketsByUpdateTime)
|
.sort(sortTicketsByUpdateTime)
|
||||||
.slice(
|
.slice(
|
||||||
ticketApiPage * ticketsPerPage,
|
ticketApiPage * ticketsPerPage,
|
||||||
|
@ -44,7 +44,7 @@ const initialState: TicketStore = {
|
|||||||
ticketCount: 0,
|
ticketCount: 0,
|
||||||
tickets: [],
|
tickets: [],
|
||||||
apiPage: 0,
|
apiPage: 0,
|
||||||
ticketsPerPage: 10,
|
ticketsPerPage: 100,
|
||||||
ticketsFetchState: "idle",
|
ticketsFetchState: "idle",
|
||||||
authData: initAuthData,
|
authData: initAuthData,
|
||||||
unauthData: initAuthData,
|
unauthData: initAuthData,
|
||||||
|
Loading…
Reference in New Issue
Block a user