работает обратный отсчёт

This commit is contained in:
Nastya 2025-10-21 19:56:39 +03:00
parent 05b8d9a0ec
commit 6fa808884f
2 changed files with 69 additions and 5 deletions

@ -1,11 +1,70 @@
import { Box, Typography, useTheme } from "@mui/material";
import { useQuizStore } from "@stores/useQuizStore";
import moment from "moment";
// Глобальная переменная для принудительного обновления
let forceUpdateCounter = 0;
// Запускаем глобальный таймер
if (typeof window !== "undefined" && !(window as any).overtimeTimerStarted) {
(window as any).overtimeTimerStarted = true;
setInterval(() => {
forceUpdateCounter++;
// Принудительно обновляем все компоненты OverTime
const event = new CustomEvent("overtime-tick", { detail: forceUpdateCounter });
window.dispatchEvent(event);
}, 1000);
}
export const OverTime = () => {
const theme = useTheme();
const days = 5;
const hours = 11;
const minutes = 13;
const seconds = 15;
const { settings } = useQuizStore();
// Проверяем, включен ли overTime
const overTimeConfig = settings?.cfg?.overTime;
const isEnabled = overTimeConfig?.enabled;
// Если не включен, не показываем карточку
if (!isEnabled) {
return null;
}
// Функция для расчета времени до окончания
const calculateTimeLeft = () => {
const now = moment(); // текущее время
// Для тестирования: добавляем 2 часа к текущему времени
const testEndsAt = moment().add(2, "hours");
const endsAt = overTimeConfig?.endsAt ? moment(overTimeConfig.endsAt) : testEndsAt;
if (endsAt.isBefore(now) || endsAt.isSame(now)) {
return { days: 0, hours: 0, minutes: 0, seconds: 0 };
}
const duration = moment.duration(endsAt.diff(now));
return {
days: Math.floor(duration.asDays()),
hours: duration.hours(),
minutes: duration.minutes(),
seconds: duration.seconds(),
};
};
const { days, hours, minutes, seconds } = calculateTimeLeft();
// Отладочная информация (используем глобальный счетчик для обновления)
const now = moment();
const endsAt = overTimeConfig?.endsAt ? moment(overTimeConfig.endsAt) : moment().add(2, "hours");
console.log("OverTime Debug:", {
currentTime: now.format("YYYY-MM-DD HH:mm:ss"),
endsAt: endsAt.format("YYYY-MM-DD HH:mm:ss"),
timeLeft: { days, hours, minutes, seconds },
rawEndsAt: overTimeConfig?.endsAt,
duration: moment.duration(endsAt.diff(now)).humanize(),
updateCounter: forceUpdateCounter,
});
return (
<Box
@ -25,7 +84,7 @@ export const OverTime = () => {
textAlign: "center",
}}
>
Квиз станет недоступен через
{overTimeConfig?.description || "Квиз станет недоступен через"}
</Typography>
<Box
sx={{

@ -123,6 +123,11 @@ export interface QuizConfig {
yandexMetricsNumber?: number;
vkMetricsNumber?: number;
backBlocked?: boolean;
overTime?: {
enabled: boolean;
endsAt: number;
description: string;
};
}
export type FormContactFieldName = "name" | "email" | "phone" | "text" | "address";