live_beats/lib/live_beats_web/live/nav.ex

65 lines
1.8 KiB
Elixir
Raw Normal View History

2021-10-29 16:12:23 +00:00
defmodule LiveBeatsWeb.Nav do
import Phoenix.LiveView
2022-01-27 20:14:01 +00:00
alias LiveBeats.UserTracker
2021-11-22 14:57:24 +00:00
alias LiveBeatsWeb.{ProfileLive, SettingsLive}
2021-11-12 15:10:04 +00:00
2021-11-22 15:31:30 +00:00
def on_mount(:default, _params, _session, socket) do
if connected?(socket) do
2022-01-27 20:14:01 +00:00
UserTracker.subscribe()
end
2022-01-27 22:25:21 +00:00
socket =
2022-01-27 20:14:01 +00:00
socket
|> assign(:active_users, UserTracker.list_active_users())
|> assign(:region, System.get_env("FLY_REGION"))
|> attach_hook(:active_tab, :handle_params, &handle_active_tab_params/3)
|> attach_hook(:ping, :handle_event, &handle_event/3)
2022-01-27 22:25:21 +00:00
|> attach_hook(:active_users, :handle_info, &handle_info/2)
2022-01-27 20:14:01 +00:00
{:cont, socket}
end
2021-11-24 03:06:48 +00:00
defp handle_active_tab_params(params, _url, socket) do
2021-11-19 19:50:36 +00:00
active_tab =
2021-11-22 15:31:30 +00:00
case {socket.view, socket.assigns.live_action} do
2021-11-24 03:06:48 +00:00
{ProfileLive, _} ->
2021-11-30 15:03:08 +00:00
if params["profile_username"] == current_user_profile_username(socket) do
2021-11-24 03:06:48 +00:00
:profile
end
{SettingsLive, _} ->
:settings
{_, _} ->
nil
2021-11-22 14:57:24 +00:00
end
2021-11-19 19:50:36 +00:00
{:cont, assign(socket, active_tab: active_tab)}
2021-10-29 16:12:23 +00:00
end
2021-11-24 03:06:48 +00:00
2022-01-28 01:42:36 +00:00
defp handle_event("ping", _, socket) do
{:halt, push_event(socket, "pong", %{})}
end
defp handle_event(_, _, socket), do: {:cont, socket}
2022-01-27 22:25:21 +00:00
defp handle_info({UserTracker, %{user_leaves: leaves, user_joins: joins}}, socket) do
updated_socket =
Enum.reduce(leaves, socket, fn user, socket ->
socket
|> push_event("remove-el", %{id: "mobile-active-users-container-#{user.id}"})
|> push_event("remove-el", %{id: "desktop-active-users-container-#{user.id}"})
end)
{:halt, update(updated_socket, :active_users, &(joins ++ &1))}
end
defp handle_info(_params, socket), do: {:cont, socket}
2021-11-30 15:03:08 +00:00
defp current_user_profile_username(socket) do
2021-11-24 03:06:48 +00:00
if user = socket.assigns.current_user do
user.username
end
end
2021-10-29 16:12:23 +00:00
end