towerops/lib/towerops_web/live/alert_live/index.ex

74 lines
1.9 KiB
Elixir

defmodule ToweropsWeb.AlertLive.Index do
@moduledoc false
use ToweropsWeb, :live_view
alias Towerops.Alerts
@impl true
def mount(_params, _session, socket) do
organization = socket.assigns.current_organization
# Subscribe to alert events
_ =
if connected?(socket) do
_ = Phoenix.PubSub.subscribe(Towerops.PubSub, "alerts:new")
Phoenix.PubSub.subscribe(Towerops.PubSub, "alerts:resolved")
end
{:ok,
socket
|> assign(:page_title, "Alerts")
|> assign(:filter, "all")
|> load_alerts(organization.id)}
end
@impl true
def handle_params(params, _url, socket) do
filter = Map.get(params, "filter", "all")
{:noreply,
socket
|> assign(:filter, filter)
|> load_alerts(socket.assigns.current_organization.id)}
end
@impl true
def handle_event("acknowledge", %{"id" => id}, socket) do
alert = Alerts.get_alert!(id)
user_id = socket.assigns.current_scope.user.id
case Alerts.acknowledge_alert(alert, user_id) do
{:ok, _alert} ->
{:noreply,
socket
|> put_flash(:info, "Alert acknowledged")
|> load_alerts(socket.assigns.current_organization.id)}
{:error, _changeset} ->
{:noreply, put_flash(socket, :error, "Unable to acknowledge alert")}
end
end
@impl true
def handle_info({:new_alert, _equipment_id, _alert_type}, socket) do
{:noreply, load_alerts(socket, socket.assigns.current_organization.id)}
end
@impl true
def handle_info({:alert_resolved, _equipment_id, _alert_type}, socket) do
{:noreply, load_alerts(socket, socket.assigns.current_organization.id)}
end
defp load_alerts(socket, organization_id) do
alerts =
case socket.assigns.filter do
"active" ->
Alerts.list_organization_active_alerts(organization_id)
_ ->
Alerts.list_organization_alerts(organization_id, 100)
end
assign(socket, :alerts, alerts)
end
end