import React, { useState, useEffect, useRef } from 'react' import { useAuth } from './auth/AuthContext' import './Tracking.css' // Функция для вычисления номера недели ISO function getISOWeek(date) { const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())) const dayNum = d.getUTCDay() || 7 d.setUTCDate(d.getUTCDate() + 4 - dayNum) const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)) return Math.ceil((((d - yearStart) / 86400000) + 1) / 7) } // Функция для вычисления 5 недель (текущая + 4 предыдущие) function getLastFiveWeeks() { const weeks = [] const now = new Date() for (let i = 0; i < 5; i++) { const date = new Date(now) date.setDate(date.getDate() - i * 7) const week = getISOWeek(date) const year = date.getFullYear() weeks.push({ year, week, isCurrent: i === 0 }) } return weeks.reverse() // От старой к новой } // Проверяет, закончилась ли уже данная ISO-неделя (текущая неделя не закончилась) function Tracking({ onNavigate, activeTab }) { const { authFetch } = useAuth() const [weeks, setWeeks] = useState(() => getLastFiveWeeks()) const [selectedWeek, setSelectedWeek] = useState(() => { const initialWeeks = getLastFiveWeeks() return initialWeeks[initialWeeks.length - 1] // Текущая неделя }) const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const scrollContainerRef = useRef(null) const currentWeekChipRef = useRef(null) const prevActiveTabRef = useRef(null) // Обновление списка недель и сброс выбранной недели на текущую при открытии экрана useEffect(() => { // Проверяем, что экран только что открылся (activeTab стал 'tracking') if (activeTab === 'tracking' && prevActiveTabRef.current !== 'tracking') { // Пересчитываем недели для получения актуального списка const updatedWeeks = getLastFiveWeeks() setWeeks(updatedWeeks) // Устанавливаем текущую неделю (последняя в списке) const currentWeek = updatedWeeks[updatedWeeks.length - 1] setSelectedWeek(currentWeek) } prevActiveTabRef.current = activeTab }, [activeTab]) // Скролл к чипсу текущей недели при открытии экрана useEffect(() => { // Выполняем скролл только когда экран открыт и только что открылся if (activeTab === 'tracking' && currentWeekChipRef.current && scrollContainerRef.current) { const chip = currentWeekChipRef.current const container = scrollContainerRef.current // Небольшая задержка для гарантии рендеринга setTimeout(() => { const chipLeft = chip.offsetLeft const chipWidth = chip.offsetWidth const containerWidth = container.offsetWidth const scrollLeft = chipLeft - (containerWidth / 2) + (chipWidth / 2) container.scrollTo({ left: scrollLeft, behavior: 'smooth' }) }, 100) } }, [activeTab]) // Функция для обновления данных const refreshData = async () => { setLoading(true) setError(null) try { const res = await authFetch(`/api/tracking/stats?year=${selectedWeek.year}&week=${selectedWeek.week}`) if (res.ok) { setData(await res.json()) } else { setError('Ошибка загрузки') } } catch (err) { setError('Ошибка загрузки') } finally { setLoading(false) } } // Загрузка данных при смене недели useEffect(() => { refreshData() }, [selectedWeek, authFetch]) return (