lib/philtre/live_block.ex

defmodule Philtre.LiveBlock do
  @moduledoc """
  Single live component in charge of rendering all types of live blocks.

  Current implementation infers block type from struct module and simply
  delegates major callbacks to the bloc module.

  Later implementations might instead take block type from some sort of registry
  and require some sort of return format from the block modules, to decide how
  to render them.

  Ideally, we want individual blocks to be decoupled from the editor.
  """
  use Phoenix.LiveComponent

  def update(assigns, socket) do
    {:ok, assign(socket, assigns)}
  end

  def render(%{block: %module{}} = assigns) do
    module.render_live(assigns)
  end

  def handle_event(event, payload, socket) do
    %module{} = socket.assigns.block
    module.handle_event(event, payload, socket)
  end
end