surface-ui / surface

A server-side rendering component library for Phoenix
https://surface-ui.org
MIT License
2.08k stars 150 forks source link

Support for LiveViewNative? #708

Open mayel opened 1 year ago

mayel commented 1 year ago

As LVN is almost ready for production I was wondering if anyone's tried using Surface for it, and if not yet doable what changes would be needed?

One aspect of it would be being able to have multiple markup files for the same component/view:

mayel commented 1 year ago

So gave it a shot and the good news is that it mostly works! :)

Surface and LiveViewNative happily live side by side in components and views. E.g.:

        use Surface.Component
        use LiveViewNative.Component

The only thing that doesn't seem to work is collocating .sface and LVN files as I mentioned above and documented here: https://hexdocs.pm/live_view_native/render-patterns.html#external-template-files

This works in the meantime, though I'd still prefer being able to have separate files:

  def render(%{platform_id: :swiftui} = assigns) do
    # This UI renders on the iOS/Mac app
    ~SWIFTUI"""
    <VStack>
      <Text>
        Hello native!
      </Text>
    </VStack>
    """
  end

  def render(assigns) do
    assigns
    |> render_sface()
  end
mayel commented 1 year ago

This seems the relevant code in Surface: https://github.com/surface-ui/surface/blob/v0.11.0/lib/surface/renderer.ex

And in LVN:

I'm happy to give it a go, though some guidance on how to best integrate them would be helpful!

noozo commented 1 year ago

i think it mostly works, the main issue RN is layouts, me thinks.

mayel commented 1 year ago

@noozo I had no issues doing this for the live layout:


defmodule MyApp.Web.LayoutLive do
        use Surface.Component
        use LiveViewNative.Component

  def render(%{platform_id: :swiftui} = assigns) do
    # This renders a layout for the iOS/Mac app
    ~SWIFTUI"""
    <VStack>
      <%= @inner_content %>
    </VStack>
    """
  end

  def render(assigns) do
  # This layout renders for the web (with Surface)
    ~F"""
    <div
      id="layout_live"
[...]
mayel commented 11 months ago

With the LiveViewNative 0.2 beta, there's a PR to get layouts working: https://github.com/liveview-native/live_view_native/pull/108