/*
Асинхронное получение данных и вывод в виде
динамического списка
1. Реализовать компонент выводящий динамический список не просроченных, (отсортированных по значению поля order (в порядке возрастания)) записей.
2. Реализовать компонент с кнопкой Удалить - удаляющей текущую запись.
3. Реализовать компонент выводящий уникальную строку символов (букв) всех значений value для текущего состояния списка записей.Только уникальные символы
4. Данные о записях получаются из двух асинхронных методов getItems и getItemsExpirations
*/
// Mocked list
const recordsMock = [
{ id: 11, value: "Value 1", order: 4, expired: false },
{ id: 12, value: "dfgf 2", order: 2, expired: true },
{ id: 13, value: "Value 3", order: 1, expired: false },
{ id: 14, value: "dgsg 4", order: 3, expired: false },
{ id: 15, value: "Value 5", order: 6, expired: true },
{ id: 16, value: "Value 6", order: 5, expired: false },
];
async function getItems() {
return Promise.resolve(
recordsMock.map(({ id, value, order }) => ({
id,
value,
order,
})),
);
}
async function getItemsExpirations() {
return Promise.resolve(
recordsMock.map(({ id, expired }) => ({
id,
expired,
})),
);
}
export default function App() {
return <div className="App">…</div>;
}**Ответ
import { useEffect, useState } from "react";
import "./styles.css";
// Mocked list
export const recordsMock = [
{ id: 11, value: "Value 1", order: 4, expired: false },
{ id: 12, value: "dfgf 2", order: 2, expired: true },
{ id: 13, value: "Value 3", order: 1, expired: false },
{ id: 14, value: "dgsg 4", order: 3, expired: false },
{ id: 15, value: "Value 5", order: 6, expired: true },
{ id: 16, value: "Value 6", order: 5, expired: false },
];
export function MockList({ onClick, records }) {
const filtered = records
.sort((a, b) => a.order - b.order)
.filter((el) => !el.expired);
const handleDelete = (id) => {
onClick(id);
};
return filtered.map((el) => {
return (
<li key={el.id}>
{el.value}
<button className="btn-style" onClick={() => handleDelete(el.id)}>
Удалить
</button>
</li>
);
});
}
export function UniqueWord({ records }) {
const filtered = records
.sort((a, b) => a.order - b.order)
.filter((el) => !el.expired);
const uniqueWord = [
...new Set(
filtered
.reduce((acc, el) => {
return acc + el.value;
}, [])
.toLowerCase()
.split(""),
),
].join("");
return <div>{uniqueWord}</div>;
}
export default function App() {
const [deleteIds, setDeletedIds] = useState([]);
const handleDelete = (id) => {
setDeletedIds((prevDeletedIds) => [...prevDeletedIds, id]);
};
const filterRecord = recordsMock.filter((el) => !deleteIds.includes(el.id));
return (
<div className="App">
<h2>Заголовок</h2>
<MockList onClick={handleDelete} records={filterRecord} />
<UniqueWord records={filterRecord} />
</div>
);
}