import { useState, useEffect, forwardRef, useMemo } from "react"; import { Box, Fab, Typography, Badge, Dialog, Slide, useTheme, useMediaQuery, } from "@mui/material"; import CircleDoubleDown from "./CircleDoubleDownIcon"; import Chat from "./Chat"; import { useUserStore } from "@root/stores/user"; import { useTicketStore } from "@root/stores/tickets"; import type { ReactNode } from "react"; import type { TransitionProps } from "@mui/material/transitions"; const Transition = forwardRef(function Transition( props: TransitionProps & { children: ReactNode; }, ref: React.Ref ) { return ( {props.children ? ( {props.children} ) : ( )} ); }); export default function FloatingSupportChat() { const [monitorType, setMonitorType] = useState<"desktop" | "mobile" | "">(""); const [isChatOpened, setIsChatOpened] = useState(false); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down(800)); const user = useUserStore((state) => state.user?._id); const { messages } = useTicketStore( (state) => state[user ? "authData" : "unauthData"] ); const animation = { "@keyframes runningStripe": { "0%": { left: "10%", backgroundColor: "transparent", }, "10%": { backgroundColor: "#ffffff", }, "50%": { backgroundColor: "#ffffff", transform: "translate(400px, 0)", }, "80%": { backgroundColor: "#ffffff", }, "100%": { backgroundColor: "transparent", boxShadow: "none", left: "100%", }, }, }; const unreadMessagesCount = useMemo(() => { let count = 0; // Идём с конца массива к началу for (let i = messages.length - 1; i >= 0; i--) { const message = messages[i]; // Пропускаем сообщение с id "111" if (message.id === "111") continue; // Если сообщение не прочитано (shown.me !== 1) if (message.shown.me !== 1) { count++; } else { // Встретили прочитанное сообщение - прекращаем подсчёт break; } } return count; }, [messages]); // Зависимость от messages - пересчитывается при их изменении useEffect(() => { const onResize = () => { if (document.fullscreenElement) { setMonitorType(isMobile ? "mobile" : "desktop"); return; } setMonitorType(""); }; window.addEventListener("resize", onResize); return () => { window.removeEventListener("resize", onResize); }; }, [isMobile]); return ( setIsChatOpened(false)} TransitionComponent={Transition} > setIsChatOpened(false)} /> setIsChatOpened((prev) => !prev)} > {!isChatOpened && ( )} {!isChatOpened && ( Задайте нам вопрос )} ); }