import React, { useState, useEffect, useRef, useCallback } from 'react' import { useAuth } from './auth/AuthContext' import Toast from './Toast' import './Tracking.css' function TrackingAccess({ onNavigate, activeTab }) { const { authFetch } = useAuth() const [generating, setGenerating] = useState(false) const [copied, setCopied] = useState(false) const [trackers, setTrackers] = useState([]) const [tracked, setTracked] = useState([]) const [loading, setLoading] = useState(true) const [toastMessage, setToastMessage] = useState(null) const prevActiveTabRef = useRef(null) const fetchAccessData = useCallback(async () => { setLoading(true) try { const res = await authFetch('/api/tracking/access') if (res.ok) { const data = await res.json() setTrackers(data.trackers || []) setTracked(data.tracked || []) } } catch (err) { console.error('Error fetching access data:', err) } finally { setLoading(false) } }, [authFetch]) // Загрузка списков при монтировании useEffect(() => { fetchAccessData() }, [fetchAccessData]) // Обновление данных при открытии экрана useEffect(() => { // Проверяем, что экран только что открылся (activeTab стал 'tracking-access') if (activeTab === 'tracking-access' && prevActiveTabRef.current !== 'tracking-access') { fetchAccessData() } prevActiveTabRef.current = activeTab }, [activeTab, fetchAccessData]) const handleCreateInvite = async () => { setGenerating(true) try { const res = await authFetch('/api/tracking/invite', { method: 'POST' }) if (res.ok) { const data = await res.json() await navigator.clipboard.writeText(data.invite_url) setCopied(true) setToastMessage({ text: 'Ссылка скопирована! Действует 1 час', type: 'success' }) setTimeout(() => setCopied(false), 3000) } else { setToastMessage({ text: 'Ошибка создания ссылки', type: 'error' }) } } catch (err) { setToastMessage({ text: 'Ошибка создания ссылки', type: 'error' }) } finally { setGenerating(false) } } const handleRemoveTracker = async (relationId) => { if (!window.confirm('Запретить этому пользователю видеть вашу статистику?')) return try { const res = await authFetch(`/api/tracking/trackers/${relationId}`, { method: 'DELETE' }) if (res.ok) { setTrackers(prev => prev.filter(t => t.relation_id !== relationId)) setToastMessage({ text: 'Доступ отозван', type: 'success' }) } } catch (err) { setToastMessage({ text: 'Ошибка', type: 'error' }) } } const handleRemoveTracked = async (relationId) => { if (!window.confirm('Прекратить отслеживать этого пользователя?')) return try { const res = await authFetch(`/api/tracking/tracked/${relationId}`, { method: 'DELETE' }) if (res.ok) { setTracked(prev => prev.filter(t => t.relation_id !== relationId)) setToastMessage({ text: 'Отслеживание прекращено', type: 'success' }) } } catch (err) { setToastMessage({ text: 'Ошибка', type: 'error' }) } } return (
{/* Заголовок с крестиком */}

Управление доступами

{/* Секция создания ссылки */}

Поделиться статистикой

Создайте одноразовую ссылку (действует 1 час)

{/* Список: кто меня отслеживает */}

Меня отслеживают ({trackers.length})

{trackers.length === 0 ? (

Пока никто не отслеживает вашу статистику

) : ( trackers.map(t => (
{t.name}
)) )}
{/* Список: кого я отслеживаю */}

Я отслеживаю ({tracked.length})

{tracked.length === 0 ? (

Вы пока никого не отслеживаете

) : ( tracked.map(t => (
{t.name}
)) )}
{toastMessage && ( setToastMessage(null)} /> )}
) } export default TrackingAccess