I love to use hooks on Phoenix LiveView.
I want to add hooks triggered after each stages.
For example, I want to assign a computed value from other assigns.
defmodule MyApp.TestLive do
use MyApp, :live_view
@impl true
def mount(_params, _session, socket) do
socket =
socket
|> assign(:a, 1)
|> assign(:a, 2)
|> assign_c()
{:ok, socket}
end
@impl true
def handle_event("select_a", %{"a" => a}, socket) do
socket =
socket
|> assign(:a, a)
|> assign_c()
end
@impl true
def handle_event("select_b", %{"b" => b}, socket) do
socket =
socket
|> assign(:b, b)
|> assign_c()
end
defp assign_c(socket) do
socket
|> assign(:c, fn %{a: a, b: b} -> a + b end)
end
end
With after hook, I can do this.
defmodule MyApp.TestLive do
use MyApp, :live_view
@impl true
def mount(_params, _session, socket) do
socket =
socket
|> assign(:a, 1)
|> assign(:a, 2)
|> assign_c()
|> attach_hook(:my_hook, :after_handle_event, fn _event, _params, socket ->
# can be optimized by checking :a, :b is changed
{:cont, socket |> assign_c())
end)
{:ok, socket}
end
@impl true
def handle_event("select_a", %{"a" => a}, socket) do
socket =
socket
|> assign(:a, a)
end
@impl true
def handle_event("select_b", %{"b" => b}, socket) do
socket =
socket
|> assign(:b, b)
end
defp assign_c(socket) do
socket
|> assign(:c, fn %{a: a, b: b} -> a + b end)
end
end
What about having hooks after stages?