live_beats/lib/live_beats_web/live/nav.ex
Chris McCord 826cf1d4f9 Add pings
2022-01-31 08:21:27 -05:00

52 lines
1.4 KiB
Elixir

defmodule LiveBeatsWeb.Nav do
import Phoenix.LiveView
alias LiveBeats.MediaLibrary
alias LiveBeatsWeb.{ProfileLive, SettingsLive}
def on_mount(:default, _params, _session, socket) do
{:cont,
socket
|> assign(active_users: MediaLibrary.list_active_profiles(limit: 20))
|> assign(:region, System.get_env("FLY_REGION") || "iad")
|> attach_hook(:active_tab, :handle_params, &handle_active_tab_params/3)
|> attach_hook(:ping, :handle_event, &handle_event/3)}
end
defp handle_active_tab_params(params, _url, socket) do
active_tab =
case {socket.view, socket.assigns.live_action} do
{ProfileLive, _} ->
if params["profile_username"] == current_user_profile_username(socket) do
:profile
end
{SettingsLive, _} ->
:settings
{_, _} ->
nil
end
{:cont, assign(socket, active_tab: active_tab)}
end
defp handle_event("ping", %{"rtt" => rtt}, socket) do
%{current_user: current_user} = socket.assigns
if rtt && current_user && current_user.active_profile_user_id do
MediaLibrary.broadcast_ping(current_user, rtt, socket.assigns.region)
end
{:halt, push_event(socket, "pong", %{})}
end
defp handle_event(_, _, socket), do: {:cont, socket}
defp current_user_profile_username(socket) do
if user = socket.assigns.current_user do
user.username
end
end
end