Ascii.Phoenix.PlayerComponent (Ascii v0.3.0)

Copy Markdown View Source

A LiveComponent that plays a piece inside your LiveView and takes new options as they change: for live data, a reading for a gauge, the latest samples for a sparkline.

<Ascii.Phoenix.live_player id="load" piece="gauge" options={%{label: "load", value: @load}} />

or, the same, <.live_component module={Ascii.Phoenix.PlayerComponent} id="load" ... />. Each time your LiveView renders it with other options, the piece takes them up while it plays (Ascii.put_options/2): the gauge's needle swings from the last reading to the new one, bars ease to new values, a sparkline scrolls on. Another piece, fps, paper, mono, ink, gradient, parts or render starts it afresh.

It plays as Ascii.Phoenix.PlayerLive does, with the same hook and the same economy: a loop is sent to the browser once, anything else as the cells that change, nothing while out of sight (see that module). The difference is where it runs: in your LiveView's process, whose state the options come from, rather than in a LiveView of its own. That suits widgets, which draw in well under a millisecond; a 200×100 scene costs milliseconds a frame, and is better in Ascii.Phoenix.player/1.

Attributes

id (required, unique on the page), piece (a slug or a module), options, fps, paper, mono, ink, gradient, parts, render (:client, the default, or :server), label, interactive and notify, as for Ascii.Phoenix.player/1.

Keys and clicks

With interactive, the piece takes keys and clicks (Ascii.handle_event/2): a file tree's cursor moves, a form's box ticks. With notify, your LiveView is sent each of them as well, as {:ascii, id, %{event: event, part: part, text: text, options: options}}: the event, the part clicked and its text (see Ascii.part_at/4), and the options the piece now has, from which to read what was chosen.

def handle_info({:ascii, "files", %{event: {:key, "enter"}, options: options}}, socket),
  do: {:noreply, open_file(socket, options.cursor)}

The options you give are merged over what the piece's events have changed, so leave out those it keeps (a tree's cursor and open, a form's fields) unless you mean to set them, and never give back what it told you: it has that already, and keys typed in the meantime would be undone.

Only available when phoenix_live_view is a dependency.