Skip to content

Commit efca7da

Browse files
committed
список задач по запросу к api
1 parent 7c8b8a0 commit efca7da

File tree

10 files changed

+100
-38
lines changed

10 files changed

+100
-38
lines changed

src/entities/task/api/api.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import api from '../../../shared/api/base'
22

33
export const taskAPI = {
4-
getTask: (data) => api.get('/tasks', data)
4+
getTasks: async (data) => api.get('/tasks', data)
55
}

src/entities/task/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
export { Task } from "./ui/Task"
1+
export { Task } from "./ui/Task"
2+
export { taskAPI } from "./api/api"

src/entities/task/ui/Task.jsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import s from "./Task.module.css"
2+
import priorityIcon from "./assets/prioritize.png"
23

34
export const Task = (props) => {
45
return (
56
<div className={s.wrapper}>
67
<button className={s.doneButton}></button>
7-
<div>
8-
<label className={s.title}>{props.title}</label>
9-
<p className={s.description}>{props.description}</p>
8+
<div className={s.container}>
9+
<div>
10+
<label className={s.title}>{props.title}</label>
11+
<p className={s.description}>{props.description}</p>
12+
</div>
13+
<div className={s.buttPriority}>
14+
<button className={s.deleteButton}>x</button>
15+
<span><img className={s.image} src={priorityIcon} />{props.priority}</span>
16+
</div>
1017
</div>
1118
</div>
1219
)

src/entities/task/ui/Task.module.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
padding: 8px;
44
align-items: center;
55
gap: 8px;
6+
font-family: Arial, Helvetica, sans-serif;
7+
font-weight: 500;
8+
color: rgb(60, 60, 60);
69
}
710

811
.doneButton {
@@ -24,4 +27,23 @@
2427
border-bottom: 2px solid rgb(64, 11, 11);
2528
color: white;
2629
transition: 0s;
30+
}
31+
32+
.image {
33+
width: 16px;
34+
height: 16px;
35+
}
36+
37+
.container {
38+
display: flex;
39+
flex-direction: row;
40+
justify-content: space-between;
41+
width: 100%;
42+
}
43+
44+
.buttPriority {
45+
display: flex;
46+
flex-direction: column;
47+
min-width: 40px;
48+
justify-content: space-between;
2749
}
1.21 KB
Loading

src/entities/user/api/api.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import api from '../../../shared/api/base'
22

33
export const userAPI = {
4-
login: (data) => api.post('/login', data),
5-
registration: (data) => api.post('/registration', data),
4+
login: async (data) => api.post('/login', data),
5+
registration: async (data) => api.post('/registration', data),
66
}

src/entities/user/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { userAPI } from "./api/api"

src/shared/api/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import {userAPI} from '../../entities/user/api/api';
2-
import {taskAPI} from '../../entities/task/api/api';
1+
import {userAPI} from '../../entities/user';
2+
import {taskAPI} from '../../entities/task';
33

44
export const APIs = {
55
user: userAPI,

src/shared/mocks/handlers/task.js

Lines changed: 16 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/widgets/TaskList/ui/TaskList.jsx

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,54 @@
1+
import { useEffect, useState } from "react"
12
import { Task } from "../../../entities/task"
3+
import { APIs } from "../../../shared"
24
import { DefaultDivider } from "../../../shared/ui/DefaultDivider/DefaultDivider"
35
import s from "./TaskList.module.css"
46

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-
237
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+
2446
return (
2547
<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" />}
3152
</div>
3253
))}
3354
</div>

0 commit comments

Comments
 (0)