defmodule LiveviewTodoWeb.TodoLive do use LiveviewTodoWeb, :live_view alias LiveviewTodo.Tasks alias LiveviewTodoWeb.Todos.AddTodoFormComponent alias LiveviewTodoWeb.Todos.TodoListComponent require Logger @impl true def mount(_params, _session, socket) do {:ok, todos} = Tasks.list_todos() todos = Enum.map(todos, fn {_, todo} -> todo end) socket = assign(socket, todos: todos) {:ok, assign(socket, temporary_assigns: [todos: []])} end @impl true def handle_event("add_todo", %{"todo" => todo} = _params, socket) do Logger.log(:debug, "#{inspect todo}") new_todo = Tasks.create_todo(todo) {:noreply, assign(socket, :todos, [new_todo])} end @impl true def handle_event("update_todo:" <> todo_id, params, socket) do Logger.log(:debug, "#{inspect params}") old_todo = Tasks.get_todo!(String.to_integer(todo_id)) socket = if old_todo do updated_todo = Tasks.update_todo(old_todo, (if Map.has_key?(params, "value") and params["value"] == "true", do: %{completed: true, id: old_todo.id, text: old_todo.text}, else: %{completed: false, id: old_todo.id, text: old_todo.text})) assign(socket, :todos, [updated_todo]) else socket end {:noreply, socket} end # versi tanpa JS Interop @impl true def handle_params(%{"id" => id, "action" => "delete"} = _params, _uri, socket) do Logger.log(:debug, "#{inspect id}") del_todo = Tasks.get_todo!(String.to_integer(id)) socket = if del_todo do Tasks.delete_todo(del_todo) {:ok, todos} = Tasks.list_todos() todos = Enum.map(todos, fn {_, todo} -> todo end) assign(socket, todos: todos) else socket end {:noreply, socket} end @impl true def handle_params(_params, _uri, socket) do # all unhandled params goes here {:noreply, socket} end end