Todo List

A comprehensive todo list application demonstrating list management and state operations.

import { createSignal, For, html, If } from "@dmnchzl/element";

interface Task {
  id: string;
  text: string;
  completed: boolean;
}

function TodoList() {
  const [tasks, setTasks] = createSignal<Task[]>([
    { id: "I", text: "Inhale", completed: true },
    { id: "E", text: "Exhale", completed: true },
    { id: "R", text: "Repeat", completed: false },
  ]);

  const [newTask, setNewTask] = createSignal("");

  const addTask = () => {
    const text = newTask();

    if (text) {
      const randomId = Math.random().toString(32).slice(2, 10);
      setTasks([
        ...tasks(),
        {
          id: randomId,
          text,
          completed: false,
        },
      ]);
    }
  };

  const toggleTask = (id: string) => {
    setTasks(
      tasks().map((task) =>
        task.id === id
          ? {
              ...task,
              completed: !task.completed,
            }
          : task
      )
    );
  };

  const delTask = (id: string) => {
    setTasks(tasks().filter((task) => task.id !== id));
  };

  const handleKeyPress = (event: KeyboardEvent) => {
    if (event.key === "Enter") {
      addTask();
    }
  };

  return html`
    <div class="container">
      <h1>Todo List</h1>

      <div class="add-task">
        <input
          type="text"
          value="${newTask}"
          oninput="${(e: Event) => {
            setNewTask((e.target as HTMLInputElement).value);
          }}"
          onkeypress="${(e: Event) => handleKeyPress(e as KeyboardEvent)}"
          placeholder="Lorem ipsum dolor sit amet..."
        />
        <button onclick="${addTask}">Add</button>
      </div>

      ${If(
        () => tasks().length > 0,
        () => html`<ul class="todo-list">
          ${For(
            tasks,
            (task) => html`
              <li class="task-item">
                <input
                  type="checkbox"
                  checked="${task.completed}"
                  onchange="${() => toggleTask(task.id)}"
                />
                <span class="task-text">${task.text}</span>
                <button onclick="${() => delTask(task.id)}">Delete</button>
              </li>
            `
          )}
        </ul>`
      )}
    </div>
  `;
}

document.body.appendChild(TodoList());

Last updated