Using the default liveView setup via the generator, the flash messages are in live.html.heex. These appear to be included in all true LV’s via MyAppWeb module. But they are not in any of the child components. Not sure why. I’ve been copy/pasting so far but that is not sustainable.
How can I import this live.html into the child components too? I can’t find any docs on that layout keyword used below, if this might be the key.
This is the default code that imports the flashes into the main liveViews.
#live.html.heex
<main class="container">
<p class="alert alert-info" role="alert"
phx-click="lv:clear-flash"
phx-value-key="info"><%= live_flash(@flash, :info) %></p>
# other flashes
<%= @inner_content %>
</main>
# myapp_web.ex
defmodule MyAppWeb do
def controller do ...
def view do ...
def live_view do
quote do
use Phoenix.LiveView,
# this imports the flashes live.html
layout: {MyApp.LayoutView, "live.html"}
unquote(view_helpers())
end
end
def live_component do
quote do
use Phoenix.LiveComponent,
# but this does not work - has no effect (I added this)
layout: {MyApp.LayoutView, "live.html"}
unquote(view_helpers())
end
end
...
I’m not sure of the structure of your app, but what you could do in order to not copy paste the flash html code around would be to wrap your livecomponents in a function that takes a slot.
Using the embed_templates macro, you can then call live.html.heex as a HEEx tag, i.e.
<.live>
</.live>
Otherwise I would just copy paste it into a HEEx function within a module that is accessible within your live components:
slot :inner_block
def container(assigns) do
~H"""
<main class="container">
<p class="alert alert-info" role="alert"
phx-click="lv:clear-flash"
phx-value-key="info"><%= live_flash(@flash, :info) %></p>
# other flashes
<%= render_slot(@inner_block) %>
</main>
"""
end
Even thought I just used the live view generator around 3 months ago it gave me version 17.5. Or maybe it was some online tutorial where I copy pasted the wrong version into my mix file.
I’ve just tried to upgrade but I get error error: undefined variable "f" in a million places. No idea how to fix that. So looks like I’m stuck with the old version.
embed_templates doesn’t appear to be supported.
Will give the slots way a try and reply if I fail.