Skip to content

Instantly share code, notes, and snippets.

@mithereal
Created February 27, 2020 17:02
Show Gist options
  • Save mithereal/bef11a30aa95efaff3df39f7e4d807d9 to your computer and use it in GitHub Desktop.
Save mithereal/bef11a30aa95efaff3df39f7e4d807d9 to your computer and use it in GitHub Desktop.
liveview that is failing
defmodule ApiWeb.Metrics.AudioConversionsLive do
use Phoenix.LiveView
use ApiWeb.Live.AuthHelper, otp_app: :api
alias Api.Audio.File.Conversions
alias Phoenix.LiveView.Socket
def mount(%{"id" => id}, session, socket) do
socket = maybe_mount_user(socket, session)
{:ok, socket}
end
def mount(_, session, socket) do
id = "test_user"
mount(%{"id" => id}, session, socket)
end
defp maybe_mount_user(socket, _session) do
metrics = Api.Metrics.Server.show
metrics = metrics.audio_conversion
date_started = metrics.date_started
current_file = metrics.current_file
converted_files = metrics.converted_files
queued_files = metrics.queued_files
total_files = metrics.total_files
socket
|> assign(:date_started, date_started)
|> assign(:current_file, current_file)
|> assign(:converted_files, converted_files)
|> assign(:queued_files, queued_files)
|> assign(:total_files, total_files)
end
def handle_params(_, _url, socket) do
if connected?(socket), do: Api.Audio.File.Conversions.subscribe()
{:noreply, socket}
end
def render(assigns) do
success_render(assigns)
end
def handle_info({_requesting_module, [:metrics, :updated], data}, socket) do
IO.puts "metric update detected"
socket = socket
|> assign(:date_started, data.date_started)
|> assign(:current_file, data.current_file)
|> assign(:converted_files, data.converted_files)
|> assign(:queued_files, data.queued_files)
|> assign(:total_files, data.total_files)
{:noreply,socket}
end
def fail_auth_render(assigns) do
~L"""
<div>
<section class="phx-hero">
<h1>You Must be Logged-In To Perform that Action</h1>
</section>
</div>
"""
end
def success_render(assigns) do
IO.inspect assigns, label: "success_render"
~L"""
<div>
<%= live_render(@socket, ApiWeb.Metrics.AudioFileConversionLive, id: "audio_file_conversion_view", session: %{"date_started" => @date_started, "current_file" => @current_file, "converted_files" => @converted_files, "queued_files" => @queued_files, "total_files" => @total_files} ) %>
</div>
"""
end
end
defmodule Api.Audio.File.Conversions do
defstruct converted_files: nil,
current_file: nil,
date_started: nil,
queued_files: nil,
total_files: nil
@topic inspect(__MODULE__)
def subscribe(topic \\ @topic) do
IO.puts "subscribing to:" <> @topic
Phoenix.PubSub.subscribe(Api.PubSub, topic, link: true)
end
def metrics(params \\ {:error, "metrics are empty"}) do
params
|> notify_subscribers([:metrics, :updated])
end
defp notify_subscribers({:ok, result}, event) do
IO.puts "notifying subscribers:" <> @topic
Phoenix.PubSub.broadcast(Api.PubSub, @topic, {__MODULE__, event, result})
{:ok, result}
end
defp notify_subscribers({:error, reason}, _event), do: {:error, reason}
end
ApiWeb.Metrics.AudioFileConversionLivedefmodule do
use Phoenix.LiveView
def render(assigns) do
~L"""
<div id='audio_conversions_element' class="d-none">
<div id="conversion_date_started">
Start Time: <%= @date_started %>
</div>
<div id="conversion_current_file">
Current File: <%= @current_file %>
</div>
<div id="conversion_converted_files">
Files Converted: <%= @converted_files %>
</div>
<div id="conversion_queued_files">
Files Queued: <%= @queued_files %>
</div>
<div id="conversion_total_files">
Total Files: <%= @total_files %>
</div>
"""
end
def mount(_params, session, socket) do
{:ok,
socket
|> assign(:date_started, session["date_started"])
|> assign(:current_file, session["current_file"])
|> assign(:converted_files, session["converted_files"])
|> assign(:queued_files, session["queued_files"])
|> assign(:total_files, session["total_files"])
}
end
end
defmodule Api.Test do
def run do
metrics = %{converted_files: 22,current_file: nil,date_started: nil, queued_files: 0,total_files: 0}
result = {:ok, metrics}
Api.Audio.File.Conversions.metrics(result)
end
end
@schrockwell
Copy link

defmodule ApiWeb.Metrics.AudioConversionsLive do
  use Phoenix.LiveView
  use ApiWeb.Live.AuthHelper, otp_app: :api
  alias Api.Audio.File.Conversions
  alias Phoenix.LiveView.Socket

  def mount(%{"id" => id}, session, socket) do
    socket = maybe_mount_user(socket, session)
    {:ok, socket}
  end

  def mount(_, session, socket) do
    id = "test_user"
    mount(%{"id" => id}, session, socket)
  end

  defp maybe_mount_user(socket, _session) do
    metrics = Api.Metrics.Server.show()

    metrics = metrics.audio_conversion

    date_started = metrics.date_started
    current_file = metrics.current_file
    converted_files = metrics.converted_files
    queued_files = metrics.queued_files
    total_files = metrics.total_files

    socket
    |> assign(:date_started, date_started)
    |> assign(:current_file, current_file)
    |> assign(:converted_files, converted_files)
    |> assign(:queued_files, queued_files)
    |> assign(:total_files, total_files)
  end

  def handle_params(_, _url, socket) do
    if connected?(socket), do: Api.Audio.File.Conversions.subscribe()
    {:noreply, socket}
  end

  def render(assigns) do
    success_render(assigns)
  end

  def handle_info({_requesting_module, [:metrics, :updated], data}, socket) do
    IO.puts("metric update detected")

    socket =
      socket
      |> assign(:date_started, data.date_started)
      |> assign(:current_file, data.current_file)
      |> assign(:converted_files, data.converted_files)
      |> assign(:queued_files, data.queued_files)
      |> assign(:total_files, data.total_files)

    {:noreply, socket}
  end

  def fail_auth_render(assigns) do
    ~L"""
    <div>
    <section class="phx-hero">
    <h1>You Must be Logged-In To Perform that Action</h1>
    </section>
    </div>
    """
  end

  def success_render(assigns) do
    IO.inspect(assigns, label: "success_render")

    ~L"""
    <div id='audio_conversions_element' class="d-none">
    <div id="conversion_date_started">
    Start Time: <%= @date_started %>
    </div>
    <div id="conversion_current_file">
    Current File: <%= @current_file %>
     </div>
    <div id="conversion_converted_files">
    Files Converted: <%= @converted_files %>
     </div>
    <div id="conversion_queued_files">
    Files Queued: <%= @queued_files %>
     </div>
    <div id="conversion_total_files">
    Total Files: <%= @total_files %>
     </div>
    """
  end
end

@schrockwell
Copy link

defmodule ApiWeb.Metrics.AudioConversionsLive do
  use Phoenix.LiveView
  use ApiWeb.Live.AuthHelper, otp_app: :api
  alias Api.Audio.File.Conversions
  alias Phoenix.LiveView.Socket

  def mount(%{"id" => id}, session, socket) do
    socket = maybe_mount_user(socket, session)
    {:ok, socket}
  end

  def mount(_, session, socket) do
    id = "test_user"
    mount(%{"id" => id}, session, socket)
  end

  defp maybe_mount_user(socket, _session) do
    assign(socket, :metrics, Api.Metrics.Server.show().audio_conversion)
  end

  def handle_params(_, _url, socket) do
    if connected?(socket), do: Api.Audio.File.Conversions.subscribe()
    {:noreply, socket}
  end

  def render(assigns) do
    success_render(assigns)
  end

  def handle_info({_requesting_module, [:metrics, :updated], data}, socket) do
    IO.puts("metric update detected")

    socket = assign(socket, :metrics, data)

    {:noreply, socket}
  end

  def fail_auth_render(assigns) do
    ~L"""
    <div>
    <section class="phx-hero">
    <h1>You Must be Logged-In To Perform that Action</h1>
    </section>
    </div>
    """
  end

  def success_render(assigns) do
    IO.inspect(assigns, label: "success_render")

    ~L"""
    <div id='audio_conversions_element' class="d-none">
    <div id="conversion_date_started">
    Start Time: <%= @metrics.date_started %>
    </div>
    <div id="conversion_current_file">
    Current File: <%= @metrics.current_file %>
     </div>
    <div id="conversion_converted_files">
    Files Converted: <%= @metrics.converted_files %>
     </div>
    <div id="conversion_queued_files">
    Files Queued: <%= @metrics.queued_files %>
     </div>
    <div id="conversion_total_files">
    Total Files: <%= @metrics.total_files %>
     </div>
    """
  end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment