fix shown
All checks were successful
Deploy / CreateImage (push) Successful in 3m57s
Deploy / DeployService (push) Successful in 22s

This commit is contained in:
Nastya 2025-07-24 02:20:41 +03:00
parent 0ae7cb702f
commit ce2582569b
6 changed files with 71 additions and 31 deletions

@ -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,