OctaStar.Phoenix.Controller (octa_star v0.1.0)

Copy Markdown

Phoenix controller helpers for OctaStar.

Use use OctaStar, :controller from your web module after use Phoenix.Controller has been applied:

def controller do
  quote do
    use Phoenix.Controller, formats: [:html]
    use OctaStar, :controller
  end
end

Controllers implement OctaStar.StarView:

@impl StarView
def handle_event(conn, "increment", signals), do: ...

assign/3 vs signal/3

  • assign/3 sets a Plug connection assign. Function components can read it via @key, but it is never sent to the browser.
  • signal/3 does assign/3 and tracks the key for automatic flushing. Function components can read it, and the dispatcher sends it to the Datastar client as a signal patch.

Summary

Functions

Extracts tracked signal keys, values, and per-signal options.

Flushes tracked signals as Datastar signal patch events.

Returns the tracked signal map as JSON for data-signals.

Patches a rendered component or HTML value against current assigns.

Assigns a value and tracks it as a Datastar signal.

Functions

extract_signals(conn)

@spec extract_signals(Plug.Conn.t()) :: [{atom(), term(), keyword()}]

Extracts tracked signal keys, values, and per-signal options.

flush_signals(conn)

@spec flush_signals(Plug.Conn.t()) :: Plug.Conn.t()

Flushes tracked signals as Datastar signal patch events.

init_signals(conn)

@spec init_signals(Plug.Conn.t()) :: String.t() | nil

Returns the tracked signal map as JSON for data-signals.

patch_element(conn, component_or_html, opts \\ [])

@spec patch_element(Plug.Conn.t(), (map() -> term()) | term(), keyword()) ::
  Plug.Conn.t()

Patches a rendered component or HTML value against current assigns.

signal(conn, key, value, opts \\ [])

@spec signal(Plug.Conn.t(), atom(), term(), keyword()) :: Plug.Conn.t()

Assigns a value and tracks it as a Datastar signal.