LiveView: Use render/1 alongside template file

Hello, I’m currently trying LiveView Native and would like to keep my html template file alongside the custom render(%{format: :swiftui} = assigns) function. I’ve found a way but I feel like there must be an easier option like a super(assigns) call or similar:

defmodule AppWeb.WelcomeLive do
  @moduledoc false

  use AppWeb, :live_view
  use LiveViewNative.LiveView

  require Phoenix.LiveView.HTMLEngine

  @impl true
  def render(%{format: :swiftui} = assigns) do
    ~SWIFTUI"""
    <VStack>
      <Text>App</Text>
    </VStack>
    """
  end

  def render(assigns) do
    Phoenix.LiveView.HTMLEngine.compile("lib/app_web/live/welcome_live.html.heex")
  end
end

Is there a more elegant way to do this?

2 Likes

For v0.3, currently beta is v0.2, we’ll be introducing tighter integration with Phoenix and LiveView taking advantage of the recently added render_with/1 function. I’ve been refactoring LVN around this over the past week and after numerous discussions with Jose it looks like the future of LVN will to push for render module isolation. Meaning the LiveView will handle html and the events but for other formats like swiftui and jetpack these will be rendering from their own module. I’ve already got this working in a local branch and will be pushing it up to main once v0.2 goes final around mid-January. This gets you what you want as in LV itself it detects the existence of render/1 to determine if it uses a template file or not. Because in our currently implementation of LVN we overload the render/1 function we cannot support a mix of some LVN render functions and html template files. But for v0.3 with the rendering for each format being in its own module this will no longer be a problem.

4 Likes