diff --git a/public/index.html b/public/index.html
index a355adcd..331147be 100755
--- a/public/index.html
+++ b/public/index.html
@@ -36,6 +36,7 @@
+
diff --git a/src/model/quizSettings.ts b/src/model/quizSettings.ts
index d055a121..68694dd2 100644
--- a/src/model/quizSettings.ts
+++ b/src/model/quizSettings.ts
@@ -117,6 +117,7 @@ export interface QuizConfig {
};
meta: string;
yandexMetricNumber: number | undefined;
+ vkMetricNumber: number | undefined;
}
export type FormContactFieldName =
@@ -225,4 +226,5 @@ export const defaultQuizConfig: QuizConfig = {
},
meta: "",
yandexMetricNumber: undefined,
+ vkMetricNumber: undefined,
};
diff --git a/src/pages/Analytics/General.tsx b/src/pages/Analytics/General.tsx
index 1ba30350..9389760c 100644
--- a/src/pages/Analytics/General.tsx
+++ b/src/pages/Analytics/General.tsx
@@ -116,33 +116,32 @@ const GeneralItemTimeConv = ({
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(700));
- const data = Object.entries(general)
- .sort((a, b) => a[0] - b[0]);
+ const data = Object.entries(general).sort((a, b) => a[0] - b[0]);
- const days = [...data].map(e => e[0])
+ const days = [...data].map((e) => e[0]);
- let buffer = 0
+ let buffer = 0;
- const time = [...data].map(e => {
+ const time = [...data].map((e) => {
if (e[1] > 0) {
- buffer = e[1]
+ buffer = e[1];
}
- return buffer
- })
-
+ return buffer;
+ });
- console.log("data", data)
- console.log("time", time.reduce((a, b) => (Number(a) + Number(b)), 0))
- console.log("time", getCalculatedTime(time.reduce((a, b) => (Number(a) + Number(b)), 0)))
- console.log("days", days.length)
- const numberValue = calculateTime ?
- (
- (time.reduce((a, b) => (Number(a) + Number(b)), 0))
- /
- (days.length)
- ) || 0
- :
- conversionValue
+ console.log("data", data);
+ console.log(
+ "time",
+ time.reduce((a, b) => Number(a) + Number(b), 0),
+ );
+ console.log(
+ "time",
+ getCalculatedTime(time.reduce((a, b) => Number(a) + Number(b), 0)),
+ );
+ console.log("days", days.length);
+ const numberValue = calculateTime
+ ? time.reduce((a, b) => Number(a) + Number(b), 0) / days.length || 0
+ : conversionValue;
if (
Object.keys(general).length === 0 ||
@@ -153,7 +152,6 @@ const GeneralItemTimeConv = ({
);
}
-
return (
{title}
- {calculateTime ? `${getCalculatedTime(numberValue)} с` : `${numberValue.toFixed(2)}%`}
+ {calculateTime
+ ? `${getCalculatedTime(numberValue)} с`
+ : `${numberValue.toFixed(2)}%`}
{
- console.log("log", value)
- return calculateTime ? getCalculatedTime(value) : String((value*100).toFixed(2)) + "%"
- }
- ,
+ console.log("log", value);
+ return calculateTime
+ ? getCalculatedTime(value)
+ : String((value * 100).toFixed(2)) + "%";
+ },
},
]}
// dataset={Object.entries(general).map(([, v]) => moment.unix(v).format("ss:mm:HH")).reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})}
@@ -196,7 +197,6 @@ const GeneralItemTimeConv = ({
);
};
-
export const General: FC = ({ data, day }) => {
const theme = useTheme();
const isTablet = useMediaQuery(theme.breakpoints.down(1000));
diff --git a/src/pages/IntegrationsPage/IntegrationYandex/YandexButton.tsx b/src/pages/IntegrationsPage/IntegrationYandex/YandexButton.tsx
index 64e6e843..89d55334 100644
--- a/src/pages/IntegrationsPage/IntegrationYandex/YandexButton.tsx
+++ b/src/pages/IntegrationsPage/IntegrationYandex/YandexButton.tsx
@@ -1,6 +1,6 @@
-import { Box, Typography, useTheme } from "@mui/material";
+import { Box, useTheme } from "@mui/material";
import { FC } from "react";
-import YandexMetric from "../mocks/YandexMetric.png";
+import { YandexMetricaLogo } from "../mocks/YandexMetricaLogo";
type PartnerItemProps = {
setIsModalOpen: (value: boolean) => void;
@@ -34,7 +34,7 @@ export const YandexButton: FC = ({
}}
onClick={() => setIsModalOpen(true)}
>
-
+
>
);
diff --git a/src/pages/IntegrationsPage/IntegrationYandex/YandexModal.tsx b/src/pages/IntegrationsPage/IntegrationYandex/YandexModal.tsx
index c2543032..da6fd076 100644
--- a/src/pages/IntegrationsPage/IntegrationYandex/YandexModal.tsx
+++ b/src/pages/IntegrationsPage/IntegrationYandex/YandexModal.tsx
@@ -30,13 +30,24 @@ export default function YandexModal({ isModalOpen, handleCloseModal }: Props) {
const [currentValue, setCurrentValue] = useState(
yandexNumber ? yandexNumber.toString() : "",
);
+ const handleClose = () => {
+ handleCloseModal();
+ if (!yandexNumber) {
+ setIsSave(false);
+ setCurrentValue("");
+ return;
+ }
+ setIsSave(true);
+ setCurrentValue(yandexNumber.toString());
+ };
+
const handleSave = () => {
+ handleCloseModal();
updateQuiz(quiz?.id, (quiz) => {
quiz.config.yandexMetricNumber = currentValue
? Number(currentValue)
: undefined;
});
- handleCloseModal();
if (!currentValue) {
setIsSave(false);
return;
@@ -55,7 +66,7 @@ export default function YandexModal({ isModalOpen, handleCloseModal }: Props) {
return (
{
const [modalWarningType, setModalWarningType] =
useState(null);
const [isChatOpened, setIsChatOpened] = useState(false);
+ const [sseEnabled, setSseEnabled] = useState(true);
+
const handleChatClickOpen = () => {
setIsChatOpened(true);
};
@@ -68,6 +71,34 @@ export default () => {
const handleChatClickSwitch = () => {
setIsChatOpened((state) => !state);
};
+
+ const getGreetingMessage: TicketMessage = useMemo(() => {
+ const workingHoursMessage =
+ "Здравствуйте, задайте ваш вопрос и наш оператор вам ответит в течение 10 минут";
+ const offHoursMessage =
+ "Здравствуйте, к сожалению, сейчас операторы не работают. Задайте ваш вопрос, и вам ответят в 10:00 по московскому времени";
+ const date = new Date();
+ const currentHourUTC = date.getUTCHours();
+ const MscTime = 3; // Москва UTC+3;
+ const moscowHour = (currentHourUTC + MscTime) % 24;
+ const greetingMessage =
+ moscowHour >= 10 && moscowHour < 15
+ ? workingHoursMessage
+ : offHoursMessage;
+
+ return {
+ created_at: new Date().toISOString(),
+ files: [],
+ id: "111",
+ message: greetingMessage,
+ request_screenshot: "",
+ session_id: "greetingMessage",
+ shown: { me: 1 },
+ ticket_id: "111",
+ user_id: "greetingMessage",
+ };
+ }, [isChatOpened]);
+
useTicketsFetcher({
url: process.env.REACT_APP_DOMAIN + "/heruvym/getTickets",
ticketsPerPage: 10,
@@ -113,22 +144,37 @@ export default () => {
});
useSSESubscription({
- enabled: isActiveSSETab && Boolean(ticket.sessionData?.sessionId),
+ enabled:
+ sseEnabled && isActiveSSETab && Boolean(ticket.sessionData?.sessionId),
url:
process.env.REACT_APP_DOMAIN +
`/heruvym/ticket?ticket=${ticket.sessionData?.ticketId}&s=${ticket.sessionData?.sessionId}`,
onNewData: (ticketMessages) => {
+ const isTicketClosed = ticketMessages.some(
+ (message) => message.session_id === "close",
+ );
+ if (isTicketClosed) {
+ cleanAuthTicketData();
+ addOrUpdateUnauthMessages([getGreetingMessage]);
+ if (!user) {
+ cleanUnauthTicketData();
+ localStorage.removeItem("unauth-ticket");
+ }
+ return;
+ }
updateSSEValue(ticketMessages);
addOrUpdateUnauthMessages(ticketMessages);
},
onDisconnect: useCallback(() => {
setUnauthIsPreventAutoscroll(false);
+ setSseEnabled(false);
}, []),
marker: "ticket",
});
useEffect(() => {
cleanAuthTicketData();
+ setSseEnabled(true);
}, [user]);
useEffect(() => {
@@ -145,7 +191,7 @@ export default () => {
const sendMessage = async (messageField: string) => {
if (!messageField || ticket.isMessageSending) return false;
-
+ setSseEnabled(true);
let successful = false;
setIsMessageSending(true);
if (!ticket.sessionData?.ticketId) {
@@ -245,6 +291,7 @@ export default () => {
sendFile={sendFile}
modalWarningType={modalWarningType}
setModalWarningType={setModalWarningType}
+ greetingMessage={getGreetingMessage}
/>
);
};
diff --git a/src/utils/hooks/useYandexMetrica.tsx b/src/utils/hooks/useYandexMetrics.ts
similarity index 85%
rename from src/utils/hooks/useYandexMetrica.tsx
rename to src/utils/hooks/useYandexMetrics.ts
index a2232993..1c914f99 100644
--- a/src/utils/hooks/useYandexMetrica.tsx
+++ b/src/utils/hooks/useYandexMetrics.ts
@@ -1,8 +1,12 @@
import { useEffect } from "react";
-export const useYandexMetrica = (yandexMetricNumber: number | undefined) => {
+export const useYandexMetrics = (yandexMetricNumber: number | undefined) => {
useEffect(() => {
- if (yandexMetricNumber) {
+ if (
+ yandexMetricNumber &&
+ typeof yandexMetricNumber === "number" &&
+ !Number.isNaN(yandexMetricNumber)
+ ) {
const script = document.createElement("script");
script.type = "text/javascript";
script.innerHTML = `