import React, { useState, useEffect } from 'react' import './WordList.css' const API_URL = '/api' function WordList({ onNavigate, dictionaryId, isNewDictionary, refreshTrigger = 0 }) { const [words, setWords] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [dictionary, setDictionary] = useState(null) const [dictionaryName, setDictionaryName] = useState('') const [originalDictionaryName, setOriginalDictionaryName] = useState('') const [isSavingName, setIsSavingName] = useState(false) const [currentDictionaryId, setCurrentDictionaryId] = useState(dictionaryId) const [isNewDict, setIsNewDict] = useState(isNewDictionary) useEffect(() => { setCurrentDictionaryId(dictionaryId) setIsNewDict(isNewDictionary) if (isNewDictionary) { setLoading(false) setDictionary(null) setDictionaryName('') setOriginalDictionaryName('') setWords([]) } else if (dictionaryId !== undefined && dictionaryId !== null) { fetchDictionary() fetchWords() } else { setLoading(false) setWords([]) } }, [dictionaryId, isNewDictionary, refreshTrigger]) const fetchDictionary = async () => { try { const response = await fetch(`${API_URL}/dictionaries`) if (!response.ok) { throw new Error('Ошибка при загрузке словарей') } const dictionaries = await response.json() const dict = dictionaries.find(d => d.id === dictionaryId) if (dict) { setDictionary(dict) setDictionaryName(dict.name) setOriginalDictionaryName(dict.name) } } catch (err) { console.error('Error fetching dictionary:', err) } } const fetchWords = async () => { if (isNewDictionary || dictionaryId === undefined || dictionaryId === null) { setWords([]) setLoading(false) return } await fetchWordsForDictionary(dictionaryId) } const fetchWordsForDictionary = async (dictId) => { try { setLoading(true) const url = `${API_URL}/words?dictionary_id=${dictId}` const response = await fetch(url) if (!response.ok) { throw new Error('Ошибка при загрузке слов') } const data = await response.json() setWords(Array.isArray(data) ? data : []) setError('') } catch (err) { setError(err.message) setWords([]) } finally { setLoading(false) } } const handleNameChange = (e) => { setDictionaryName(e.target.value) } const handleNameSave = async () => { if (!dictionaryName.trim()) { return } setIsSavingName(true) try { if (isNewDictionary) { // Create new dictionary const response = await fetch(`${API_URL}/dictionaries`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: dictionaryName.trim() }), }) if (!response.ok) { throw new Error('Ошибка при создании словаря') } const newDict = await response.json() const newDictionaryId = newDict.id // Update local state immediately setOriginalDictionaryName(newDict.name) setDictionaryName(newDict.name) setDictionary(newDict) setCurrentDictionaryId(newDictionaryId) setIsNewDict(false) // Fetch words for the new dictionary await fetchWordsForDictionary(newDictionaryId) // Update navigation to use the new dictionary ID and remove isNewDictionary flag onNavigate?.('words', { dictionaryId: newDictionaryId, isNewDictionary: false }) } else if (dictionaryId !== undefined && dictionaryId !== null) { // Update existing dictionary const response = await fetch(`${API_URL}/dictionaries/${dictionaryId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: dictionaryName.trim() }), }) if (!response.ok) { throw new Error('Ошибка при обновлении словаря') } setOriginalDictionaryName(dictionaryName.trim()) if (dictionary) { setDictionary({ ...dictionary, name: dictionaryName.trim() }) } } } catch (err) { setError(err.message) } finally { setIsSavingName(false) } } const showSaveButton = dictionaryName.trim() !== '' && dictionaryName.trim() !== originalDictionaryName if (loading) { return (
Слов пока нет. Добавьте слова через экран "Добавить слова".