defmodule WebmonWeb.WebsiteLive.Index do require Logger use WebmonWeb, :live_view alias Webmon.Monitor alias Webmon.Engine alias Webmon.Monitor.Website @impl true def mount(_params, _session, socket) do websites = Monitor.list_websites() if connected?(socket) do for website <- websites, do: monitor_website(website) end {:ok, socket |> assign(:deleted, []) |> stream(:websites, websites)} end def monitor_website(website) do me = self() Engine.start_link(website, on_update: fn website -> send(me, {:update, website}) end) end @impl true def handle_params(params, _url, socket) do {:noreply, apply_action(socket, socket.assigns.live_action, params)} end defp apply_action(socket, :edit, %{"id" => id}) do socket |> assign(:page_title, "Edit Website") |> assign(:website, Monitor.get_website!(id)) end defp apply_action(socket, :new, _params) do socket |> assign(:page_title, "New Website") |> assign(:website, %Website{}) end defp apply_action(socket, :index, _params) do socket |> assign(:page_title, "Listing Websites") |> assign(:website, nil) end @impl true def handle_info({:update, website}, socket) do {:noreply, stream_insert(socket, :websites, website)} end @impl true def handle_info({WebmonWeb.WebsiteLive.FormComponent, {:saved, website}}, socket) do monitor_website(website) {:noreply, stream_insert(socket, :websites, website)} end @impl true def handle_info(msg, socket) do Logger.debug(msg) {:noreply, socket} end @impl true def handle_event("delete", %{"id" => id}, socket) do website = Monitor.get_website!(id) {:ok, _} = Monitor.delete_website(website) {:noreply, stream_delete(socket, :websites, website)} end def website_status(%{website: %{status: {:ok, code, ping}}} = assigns) do assigns = assigns |> assign(:ping, ping) |> assign(:code, code) ~H""" <%= @ping %> """ end def website_status(%{website: _} = assigns) do ~H""" """ end end