|
| 1 | +import { useEffect, useState } from "react" |
1 | 2 | import { Task } from "../../../entities/task" |
| 3 | +import { APIs } from "../../../shared" |
2 | 4 | import { DefaultDivider } from "../../../shared/ui/DefaultDivider/DefaultDivider" |
3 | 5 | import s from "./TaskList.module.css" |
4 | 6 |
|
5 | | -const data = { |
6 | | - tasks: [ |
7 | | - { id: 1, title: "title 1", description: "description 1", priority: 1, status: false, pomodoros: 3 }, |
8 | | - { id: 2, title: "title 2", description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", priority: 2, status: false, pomodoros: 3 }, |
9 | | - { id: 3, title: "title 3", description: "description 3", priority: 3, status: false, pomodoros: 3 }, |
10 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
11 | | - { id: 4, title: "title 4", description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", priority: 4, status: false, pomodoros: 3 }, |
12 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
13 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
14 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
15 | | - { id: 4, title: "title 4", description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", priority: 4, status: false, pomodoros: 3 }, |
16 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
17 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
18 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
19 | | - { id: 4, title: "title 4", description: "description 4", priority: 4, status: false, pomodoros: 3 }, |
20 | | - ] |
21 | | -} |
22 | | - |
23 | 7 | export const TaskList = (props) => { |
| 8 | + const [tasks, setTasks] = useState([]) |
| 9 | + const [loading, setLoading] = useState(true) |
| 10 | + const [error, setError] = useState(null) |
| 11 | + |
| 12 | + useEffect(() => { |
| 13 | + const fetchTasks = async () => { |
| 14 | + try { |
| 15 | + const response = await APIs.task.getTasks() |
| 16 | + |
| 17 | + // Убедитесь, что response.data существует и является массивом |
| 18 | + const tasksData = response?.data ?? [] |
| 19 | + |
| 20 | + if (!Array.isArray(tasksData)) { |
| 21 | + throw new Error("Received tasks data is not an array") |
| 22 | + } |
| 23 | + |
| 24 | + setTasks(tasksData) |
| 25 | + } catch (err) { |
| 26 | + setError(err.message || "Failed to fetch tasks") |
| 27 | + console.error("Error fetching tasks:", err) |
| 28 | + setTasks([]) // Устанавливаем пустой массив в случае ошибки |
| 29 | + } finally { |
| 30 | + setLoading(false) |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + fetchTasks() |
| 35 | + }, []) |
| 36 | + |
| 37 | + if (loading) return <div>Loading...</div> |
| 38 | + if (error) return <div>Error: {error}</div> |
| 39 | + |
| 40 | + // Дополнительная проверка на массив перед рендерингом |
| 41 | + if (!Array.isArray(tasks)) { |
| 42 | + console.error("Tasks is not an array:", tasks) |
| 43 | + return <div>Error: Tasks data is invalid</div> |
| 44 | + } |
| 45 | + |
24 | 46 | return ( |
25 | 47 | <div className={s.wrapper}> |
26 | | - {data.tasks.map((task, index) => ( |
27 | | - <div key={task.id}> |
28 | | - <Task {...task} /> {/* {...task} — это синтаксис spread-оператора (...) в JSX, |
29 | | - который используется для передачи всех свойств объекта task в компонент Task в виде отдельных пропсов. */} |
30 | | - {index !== data.tasks.length - 1 && <DefaultDivider margin="16px" />} |
| 48 | + {tasks.map((task, index) => ( |
| 49 | + <div key={task.id || index}> |
| 50 | + <Task {...task} /> |
| 51 | + {index !== tasks.length - 1 && <DefaultDivider margin="16px" />} |
31 | 52 | </div> |
32 | 53 | ))} |
33 | 54 | </div> |
|
0 commit comments