работает обратный отсчёт
This commit is contained in:
parent
05b8d9a0ec
commit
6fa808884f
@ -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";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user