Packages
phoenix_kit
1.7.21
1.7.210
1.7.209
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit_web/live/modules/connections/user_connections.ex
defmodule PhoenixKitWeb.Live.Modules.Connections.UserConnections do
@moduledoc """
User-facing LiveView for managing personal connections.
Provides tabs for:
- Followers - Users who follow the current user
- Following - Users the current user follows
- Connections - Mutual connections
- Requests - Pending incoming/outgoing connection requests
- Blocked - Users blocked by the current user
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Connections
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@tabs ~w(followers following connections requests blocked)
@default_tab "connections"
@impl true
def mount(_params, _session, socket) do
current_user = socket.assigns[:phoenix_kit_current_user]
if current_user && Connections.enabled?() do
project_title = Settings.get_setting("project_title", "PhoenixKit")
socket =
socket
|> assign(:page_title, "My Connections")
|> assign(:project_title, project_title)
|> assign(:current_user, current_user)
|> assign(:tab, @default_tab)
|> load_counts()
|> load_tab_data(@default_tab)
{:ok, socket}
else
message = if current_user, do: "Connections module is disabled", else: "Please log in"
{:ok,
socket
|> put_flash(:error, message)
|> push_navigate(to: Routes.path("/"))}
end
end
@impl true
def handle_params(%{"tab" => tab}, uri, socket) when tab in @tabs do
socket =
socket
|> assign(:url_path, URI.parse(uri).path)
|> assign(:tab, tab)
|> load_tab_data(tab)
{:noreply, socket}
end
@impl true
def handle_params(_params, uri, socket) do
{:noreply,
socket
|> assign(:url_path, URI.parse(uri).path)
|> assign(:tab, @default_tab)
|> load_tab_data(@default_tab)}
end
@impl true
def handle_event("unfollow", %{"id" => user_id}, socket) do
target_id = String.to_integer(user_id)
case Connections.unfollow(socket.assigns.current_user, target_id) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "Unfollowed successfully")
|> load_counts()
|> load_tab_data(socket.assigns.tab)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to unfollow")}
end
end
@impl true
def handle_event("remove_follower", %{"id" => _user_id}, socket) do
# Remove follower by having them unfollow us (via block/unblock or admin action)
# For now, we just show a message - actual follower removal would need admin rights
{:noreply, put_flash(socket, :info, "Follower removal requires blocking the user")}
end
@impl true
def handle_event("accept_request", %{"id" => connection_id}, socket) do
case Connections.accept_connection(connection_id) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "Connection accepted!")
|> load_counts()
|> load_tab_data(socket.assigns.tab)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to accept request")}
end
end
@impl true
def handle_event("reject_request", %{"id" => connection_id}, socket) do
case Connections.reject_connection(connection_id) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "Connection rejected")
|> load_counts()
|> load_tab_data(socket.assigns.tab)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to reject request")}
end
end
@impl true
def handle_event("remove_connection", %{"id" => user_id}, socket) do
target_id = String.to_integer(user_id)
case Connections.remove_connection(socket.assigns.current_user, target_id) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "Connection removed")
|> load_counts()
|> load_tab_data(socket.assigns.tab)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to remove connection")}
end
end
@impl true
def handle_event("unblock", %{"id" => user_id}, socket) do
target_id = String.to_integer(user_id)
case Connections.unblock(socket.assigns.current_user, target_id) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "User unblocked")
|> load_counts()
|> load_tab_data(socket.assigns.tab)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Failed to unblock user")}
end
end
defp load_counts(socket) do
user = socket.assigns.current_user
socket
|> assign(:followers_count, Connections.followers_count(user))
|> assign(:following_count, Connections.following_count(user))
|> assign(:connections_count, Connections.connections_count(user))
|> assign(:pending_count, Connections.pending_requests_count(user))
|> assign(:blocked_count, length(Connections.list_blocked(user, preload: false)))
end
defp load_tab_data(socket, "followers") do
followers = Connections.list_followers(socket.assigns.current_user)
assign(socket, :items, followers)
end
defp load_tab_data(socket, "following") do
following = Connections.list_following(socket.assigns.current_user)
assign(socket, :items, following)
end
defp load_tab_data(socket, "connections") do
connections = Connections.list_connections(socket.assigns.current_user)
assign(socket, :items, connections)
end
defp load_tab_data(socket, "requests") do
incoming = Connections.list_pending_requests(socket.assigns.current_user)
outgoing = Connections.list_sent_requests(socket.assigns.current_user)
socket
|> assign(:incoming_requests, incoming)
|> assign(:outgoing_requests, outgoing)
|> assign(:items, [])
end
defp load_tab_data(socket, "blocked") do
blocked = Connections.list_blocked(socket.assigns.current_user)
assign(socket, :items, blocked)
end
defp load_tab_data(socket, _), do: assign(socket, :items, [])
# Helper to get the other user from a connection
def get_other_user(connection, current_user_id) do
if connection.requester_id == current_user_id do
connection.recipient
else
connection.requester
end
end
end