lib/workbench_web/live/wallet_live/index.ex

defmodule WorkbenchWeb.WalletLive.Index do
  use WorkbenchWeb, :live_view
  alias Workbench.Wallets

  @impl true
  def mount(_params, _session, socket) do
    socket =
      socket
      |> assign(:changeset, Wallets.changeset())

    {:ok, socket}
  end

  @impl true
  def handle_params(_params, _uri, socket) do
    socket =
      socket
      |> assign(:query, nil)
      |> assign_wallets()

    {:noreply, socket}
  end

  @impl true
  def handle_event("save", %{"wallet" => wallet_params}, socket) do
    changeset =
      case Wallets.insert(wallet_params) do
        {:ok, _} -> Wallets.changeset(wallet_params)
        {:error, changeset} -> changeset
      end

    socket =
      socket
      |> assign_wallets()
      |> assign(:changeset, changeset)

    {:noreply, socket}
  end

  @impl true
  def handle_event("delete", %{"wallet-id" => id}, socket) do
    {:ok, _} = Workbench.Wallets.delete(id)

    socket =
      socket
      |> assign_wallets()

    {:noreply, socket}
  end

  defp assign_wallets(socket) do
    socket
    |> assign(:wallets, Wallets.search(socket.assigns.query))
  end
end