diff --git a/index.html b/index.html
index 4b7a530..71040a0 100644
--- a/index.html
+++ b/index.html
@@ -414,6 +414,18 @@
🔥 Тренировка на сегодня
+
+
+
🔔 Будильник на тренировку
+
+
+
+
+
+
+
💡 Браузер покажет уведомление в заданное время (разреши уведомления при первом запуске)
+
+
🎵 Мотивационная музыка
@@ -589,7 +601,8 @@
{ type: "Отдых", exercises: [] }
];
- let progressData = JSON.parse(localStorage.getItem('fitproProgress') || '{"entries":[],"completedDays":[],"water":[],"waterToday":0,"habits":{}}');
+ let progressData = JSON.parse(localStorage.getItem('fitproProgress') || '{"entries":[],"completedDays":[],"water":[],"waterToday":0,"habits":{},"alarm":null}');
+ let alarmTimeout = null;
// === ИНИЦИАЛИЗАЦИЯ ===
function init() {
@@ -779,6 +792,89 @@
}
init();
+
+ // === БУДИЛЬНИК ===
+ function setAlarm() {
+ const time = document.getElementById('alarm-time').value;
+ if (!time) return alert('Выбери время!');
+
+ progressData.alarm = time;
+ localStorage.setItem('fitproProgress', JSON.stringify(progressData));
+
+ // Запрос разрешений на уведомления
+ if ('Notification' in window && Notification.permission === 'default') {
+ Notification.requestPermission();
+ }
+
+ checkAlarm();
+ alert('⏰ Будильник установлен на ' + time + '!');
+ }
+
+ function cancelAlarm() {
+ progressData.alarm = null;
+ localStorage.setItem('fitproProgress', JSON.stringify(progressData));
+ if (alarmTimeout) clearTimeout(alarmTimeout);
+ document.getElementById('alarm-status').textContent = '';
+ alert('Будильник отменён');
+ }
+
+ function checkAlarm() {
+ if (!progressData.alarm) return;
+
+ const now = new Date();
+ const alarmTime = progressData.alarm;
+ const [hours, minutes] = alarmTime.split(':').map(Number);
+
+ const alarmDate = new Date();
+ alarmDate.setHours(hours, minutes, 0, 0);
+
+ // Если время уже прошло сегодня, ставим на завтра
+ if (alarmDate <= now) {
+ alarmDate.setDate(alarmDate.getDate() + 1);
+ }
+
+ const msUntilAlarm = alarmDate - now;
+
+ document.getElementById('alarm-status').textContent = '⏰ Будильник на ' + alarmTime + ' (через ' + Math.round(msUntilAlarm / 60000) + ' мин)';
+
+ if (alarmTimeout) clearTimeout(alarmTimeout);
+
+ alarmTimeout = setTimeout(() => {
+ triggerAlarm();
+ // Переставить на завтра
+ setTimeout(checkAlarm, 1000);
+ }, msUntilAlarm);
+ }
+
+ function triggerAlarm() {
+ // Звук
+ const audio = new Audio('https://actions.google.com/sounds/v1/alarms/beep_short.ogg');
+ audio.play();
+
+ // Уведомление
+ if ('Notification' in window && Notification.permission === 'granted') {
+ new Notification('💪 Пора на тренировку!', {
+ body: 'Твоя тренировка началась! Вперёд к цели! 🔥',
+ icon: 'https://cdn-icons-png.flaticon.com/512/2964/2964536.png'
+ });
+ } else {
+ alert('💪 ПОРА НА ТРЕНИРОВКУ! 🔥');
+ }
+
+ // Воспроизвести звук ещё раз через 5 минут
+ setTimeout(() => {
+ audio.play();
+ }, 300000);
+ }
+
+ // Проверка будильника при загрузке
+ if (progressData.alarm) {
+ document.getElementById('alarm-time').value = progressData.alarm;
+ checkAlarm();
+ }
+
+ // Проверка каждую минуту
+ setInterval(checkAlarm, 60000);