Sobes.tech
Junior — Middle+

Task manager implementation

livecode

Условие задачи

Создайте приложение списка дел, использующее определённые ниже методы. Компонент UI должен отображаться внутри элемента <main>. Вспомогательные функции sleep, getId и интерфейс TodoItem предоставлены, вместе с хранилищем store в памяти. Реализуйте асинхронные функции getItems, createItem и deleteItem, которые моделируют задержку с помощью sleep и работают с хранилищем. Функции должны возвращать копии элементов, добавлять новые элементы с уникальными id и временными метками, а также удалять элементы по id, выбрасывая ошибку, если id не существует.

const App = () => {
  return <main></main>;
};

export default App;

export function sleep(ms: number) {
  return new Promise((res) => setTimeout(res, ms));
}

let count = 0;

function getId() {
  return count++;
}

export interface TodoItem {
  id: number;
  title: string;
  complete: boolean;
  createAt: number;
}

const store: TodoItem[] = [
  {
    id: 666,
    title: "default",
    complete: false,
    createAt: 123
  }
];

export async function getItems() {
  await sleep(1_000);
  // клонируем элементы, чтобы безопасно мутировать их в store
  return store.map((item) => ({ ...item }));
}

export async function createItem(title: string) {
  await sleep(1_000);

  const item = {
    id: getId(),
    title,
    complete: false,
    createAt: Date.now()
  };

  store.push(item);

  return item;
}

export async function deleteItem(id: number) {
  await sleep(1_000);

  const storedItemIndex = store.findIndex((item) => item.id === id);

  if (storedItemIndex === -1) {
    throw new Error("item not found");
  }

  store.splice(storedItemIndex, 1);
}