I am a bit stumped…
I am trying to attach a life cycle hook to close flash messages automatically after 5 seconds.
I have this code:
defmodule MailManWeb.FlashLive do
def on_mount(:default, _params, _session, socket) do
{:cont,
socket
|> Phoenix.LiveView.attach_hook(:flash, :handle_params, &send_close/3)
|> Phoenix.LiveView.attach_hook(:flash, :handle_info, &info/2)}
end
def send_close(_params, _uri, socket) do
Enum.each(Phoenix.LiveView.Utils.get_flash(socket), fn {key, _msg} ->
Process.send_after(self(), {:close_flash, key}, 5000)
end)
{:cont, socket}
end
defp info({:close_flash, key}, socket) do
{:cont, socket |> Phoenix.LiveView.clear_flash(key)}
end
defp info(_, socket), do: {:cont, socket}
end
I initially had the Enum.each
in the on_mount
, but then it wasn’t executed when using a patch
navigation.
Problem is now, it is not working on navigate
navigation, I get a no function clause matching error
on handle_info
, it is as if the hook isn’t set.
I tried moving the attach_hook
into the send_close
function, but then it explodes on patch
because the hook is already set.
What am I missing?