import React, { useState, useEffect, useRef } from 'react' import { useAuth } from './auth/AuthContext' import LoadingError from './LoadingError' import './DictionaryList.css' const API_URL = '/api' function DictionaryList({ onNavigate, refreshTrigger = 0 }) { const { authFetch } = useAuth() const [dictionaries, setDictionaries] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [selectedDictionary, setSelectedDictionary] = useState(null) const isInitializedRef = useRef(false) const dictionariesRef = useRef([]) // Обновляем ref при изменении состояния useEffect(() => { dictionariesRef.current = dictionaries }, [dictionaries]) useEffect(() => { fetchDictionaries() }, [refreshTrigger]) const fetchDictionaries = async () => { try { // Показываем загрузку только при первой инициализации или если нет данных для отображения const isFirstLoad = !isInitializedRef.current const hasData = !isFirstLoad && dictionariesRef.current.length > 0 if (!hasData) { setLoading(true) } const response = await authFetch(`${API_URL}/test-configs-and-dictionaries`) if (!response.ok) { throw new Error('Ошибка при загрузке словарей') } const data = await response.json() setDictionaries(Array.isArray(data.dictionaries) ? data.dictionaries : []) setError('') isInitializedRef.current = true } catch (err) { setError(err.message) setDictionaries([]) isInitializedRef.current = true } finally { setLoading(false) } } const handleDictionarySelect = (dict) => { onNavigate?.('words', { dictionaryId: dict.id }) } const handleDictionaryMenuClick = (dict, e) => { e.stopPropagation() setSelectedDictionary(dict) } const handleDictionaryDelete = async () => { if (!selectedDictionary) return try { const response = await authFetch(`${API_URL}/dictionaries/${selectedDictionary.id}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', }, }) if (!response.ok) { const errorText = await response.text() console.error('Delete error:', response.status, errorText) throw new Error(`Ошибка при удалении словаря: ${response.status}`) } setSelectedDictionary(null) // Refresh dictionaries list await fetchDictionaries() } catch (err) { console.error('Delete failed:', err) setError(err.message) setSelectedDictionary(null) } } const closeDictionaryModal = () => { setSelectedDictionary(null) } return (
{/* Кнопка закрытия */} {/* Показываем загрузку только при первой инициализации и если нет данных для отображения */} {loading && !isInitializedRef.current && dictionaries.length === 0 ? (
Загрузка...
) : error ? ( ) : (
{dictionaries.map((dict) => (
handleDictionarySelect(dict)} >
{dict.wordsCount}
{dict.name}
))}
)} {selectedDictionary && (
e.stopPropagation()}>

{selectedDictionary.name}

)}
) } export default DictionaryList