import { useState, useEffect, useRef, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import axios from 'axios'; import Header from './Header'; import './css/BoardList.css'; const KBBoardsList = () => { const navigate = useNavigate(); const debounceRef = useRef(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const [showCreateModal, setShowCreateModal] = useState(false); const [timer, setTimer] = useState(400) const [sort_method, setSortMethod] = useState('title'); const [reverse, setReverse] = useState(false); const [search_text, setSearchText] = useState(''); const [page, setPage] = useState(1); const [limit, setLimit] = useState(5); const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [items, setItems] = useState([]); const [totalItems, setTotalItems] = useState(null); function ListItem({ item }) { if (!item) return null; const openBoard = () => { navigate('/kanban-board/' + item.id); }; return (
  • ); }; const Pagination = () => { const totalPages = Math.ceil(totalItems / limit); if (totalPages <= 1) return null; const pages = []; for (let i = 1; i <= totalPages; i++) { pages.push(i); } return (
    {pages.map((pageNum) => ( ))}
    ); }; const loadBoardList = useCallback(async () => { clearTimeout(debounceRef.current); debounceRef.current = setTimeout(async () => { try { const newList = { sort_method, reverse, search_text, page, limit }; const response = await axios.post('/api/boards/list', newList, {withCredentials: true }); if (Array.isArray(response.data.boards)) { setItems(response.data.boards); setTotalItems(response.data.count || response.data.boards.length); } else { setItems([]); setTotalItems(0) if (response.data?.detail === 'Доски отсутствуют.') { console.log('Доски отсутствуют'); } } } catch (err) { if (err.response?.data?.message === 'Token Error' || err.response?.data?.message === 'Invalid Token') { setError('Вы не авторизованы'); setTimeout(() => { navigate('/login'); }, 1000); } else { setError('Ошибка загрузки досок'); console.log(err); setItems([]); } } setTimer(400) }, timer); }, [sort_method, reverse, search_text, page, limit, timer, setItems, setTotalItems, setError, navigate]); useEffect(() => { loadBoardList(); }, [page, loadBoardList]); const setFilter = (method) => () => { const newMethod = method; const newReverse = sort_method === method ? !reverse : false; setSortMethod(newMethod); setReverse(newReverse); setTimer(100); }; const createBoard = async (e) => { e.preventDefault(); try { setLoading(true) const newBoard = { title, description }; await axios.post('/api/boards/create', newBoard); setShowCreateModal(false); await loadBoardList(); } catch (err) { setError('Ошибка'); } finally { setLoading(false); } }; const openCreateModal = () => { setShowCreateModal(true) }; const closeCreateModal = () => { setShowCreateModal(false); setDescription(''); setTitle('') }; return ( <>
    { error &&
    {error}
    }

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

    setSearchText(e.target.value)} />

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

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

    Нет данных

    )}
    {showCreateModal && (

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

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