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}
}
Доступные канбан доски:
{items.length > 0 ? (
{items.map((item) => (
))}
) : (
Нет данных
)}
{showCreateModal && (
Придумайте название и описание канбан доски
)}
>
);
}
export default KBBoardsList;