import React, { useState, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import axios from 'axios'; import Header from './Header'; function ListItem({ item }) { const navigate = useNavigate(); if (!item) return null; const openBoard = () => { navigate('/kanban-board/' + item.id); }; return (
  • ); }; const KBBoardsList = () => { const [error, setError] = useState(''); const [sort_method, setSortMethod] = useState('title'); const [reverse, setReverse] = useState(false); const [search_text, setSearchText] = useState(''); const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [items, setItems] = useState([]); const [showCreateModal, setShowCreateModal] = useState(false); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [filteredItems, setFilteredItems] = useState([]); const [page, setPage] = useState(1); const [list, setList] = useState(20); const debounceRef = useRef(null); useEffect(() => { const loadBoardList = async () => { try { var newList = { sort_method, reverse, search_text, page, list }; const response = await axios.post('/api/boards/list', newList); if (Array.isArray(response.data)) { setItems(response.data); } else { // Если данных нет или они не массив — ставим пустой массив setItems([]); if (response.data?.detail === 'Доски отсутствуют.') { console.log('Доски отсутствуют'); } } } catch (err) { if (err.response.data.message === 'Token Error' || err.response.data.message === 'Invalid Token') { setError('Вы не авторизованы'); setTimeout(() => { window.location.href = '/login'; }, 1500); } else { setError('Ошибка загрузки досок'); console.log(err); setItems([]); // Гарантируем, что items — массив } } }; loadBoardList() }, []); useEffect(() => { clearTimeout(debounceRef.current); debounceRef.current = setTimeout(() => { setFilteredItems( items.filter(item => item.title.toLowerCase().includes(searchQuery.toLowerCase()) ) ); }, 300); // 300 мс задержка }, [searchQuery, items]); const sortList = async (method = sort_method, isReverse = reverse) => { try { const newList = { sort_method: method, reverse: isReverse, search_text }; const response = await axios.post('/api/boards/list', newList); if (Array.isArray(response.data)) { setItems(response.data); } else { setItems([]); if (response.data?.detail === 'Доски отсутствуют.') { console.log('Доски отсутствуют'); } } } catch (err) { if (err.response?.data?.message === 'Token Error' || err.response?.data?.message === 'Invalid Token') { setError('Вы не авторизованы'); setTimeout(() => { window.location.href = '/login'; }, 1500); } else { setError('Ошибка загрузки досок'); console.log(err); setItems([]); } } }; const setFilterTitle = async () => { const newMethod = 'title'; const newReverse = sort_method === 'title' ? !reverse : false; setSortMethod(newMethod); setReverse(newReverse); await sortList(newMethod, newReverse); }; const setFilterOwner = async () => { const newMethod = 'owner'; const newReverse = sort_method === 'owner' ? !reverse : false; setSortMethod(newMethod); setReverse(newReverse); await sortList(newMethod, newReverse); }; const setFilterUptime = async () => { const newMethod = 'update_time'; const newReverse = sort_method === 'update_time' ? !reverse : false; setSortMethod(newMethod); setReverse(newReverse); await sortList(newMethod, newReverse); }; const createBoard = async () => { try { const newBoard = { title, description }; await axios.post('/api/boards/create', newBoard); setShowCreateModal(false) } catch (err) { setError('Ошибка'); } }; const openCreateModal = () => { setShowCreateModal(true) }; const closeCreateModal = () => { setShowCreateModal(false); setDescription(''); setTitle('') }; return ( <>
    { error &&
    {error}
    }

    Сортировка по:

    setSearchQuery(e.target.value)} />

    Доступные канбан доски:

    {filteredItems.length > 0 ? (
      {filteredItems.map((item) => ( ))}
    ) : (

    Нет данных

    )}
    {showCreateModal && (

    Придумайте название и описание канбан доски

    setTitle(e.target.value)} required />
    setDescription(e.target.value)} />
    )} ); } export default KBBoardsList;