Packages
phoenix_kit
1.7.70
1.7.211
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/modules/newsletters/web/list_members.ex
defmodule PhoenixKit.Modules.Newsletters.Web.ListMembers do
@moduledoc """
LiveView for managing members of a newsletter list.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Newsletters
alias PhoenixKit.Settings
alias PhoenixKit.Users.Auth
alias PhoenixKit.Utils.Routes
@impl true
def mount(%{"id" => list_uuid}, _session, socket) do
if Newsletters.enabled?() do
list = Newsletters.get_list!(list_uuid)
members = Newsletters.list_members(list_uuid)
project_title = Settings.get_project_title()
socket =
socket
|> assign(:page_title, "#{list.name} — Members")
|> assign(:project_title, project_title)
|> assign(:url_path, Routes.path("/admin/newsletters/lists/#{list_uuid}/members"))
|> assign(:list, list)
|> assign(:members, members)
|> assign(:status_filter, "")
|> assign(:search_query, "")
|> assign(:search_results, [])
|> assign(:show_confirm_modal, false)
|> assign(:confirm_action, nil)
|> assign(:confirm_target, nil)
|> assign(:confirm_title, "")
|> assign(:confirm_message, "")
{:ok, socket}
else
{:ok,
socket
|> put_flash(:error, "Newsletters module is not enabled")
|> push_navigate(to: Routes.path("/admin"))}
end
end
@impl true
def handle_event("show_confirm", %{"action" => action} = params, socket) do
{title, message} = confirm_text(action)
{:noreply,
socket
|> assign(:show_confirm_modal, true)
|> assign(:confirm_action, String.to_existing_atom(action))
|> assign(:confirm_target, params["uuid"])
|> assign(:confirm_title, title)
|> assign(:confirm_message, message)}
end
@impl true
def handle_event("hide_confirm", _params, socket) do
{:noreply,
socket
|> assign(:show_confirm_modal, false)
|> assign(:confirm_action, nil)
|> assign(:confirm_target, nil)}
end
@impl true
def handle_event("confirm_action", _params, socket) do
socket = assign(socket, :show_confirm_modal, false)
case socket.assigns.confirm_action do
:add_all_users -> handle_add_all_users(socket)
:unsubscribe -> handle_unsubscribe(socket, socket.assigns.confirm_target)
:remove -> handle_remove(socket, socket.assigns.confirm_target)
_ -> {:noreply, socket}
end
end
@impl true
def handle_event("filter_status", %{"status" => status}, socket) do
members = Newsletters.list_members(socket.assigns.list.uuid, %{status: status})
{:noreply,
socket
|> assign(:members, members)
|> assign(:status_filter, status)}
end
@impl true
def handle_event("search_users", %{"query" => query}, socket) do
results =
if String.length(String.trim(query)) >= 2 do
Auth.search_users(query)
else
[]
end
{:noreply,
socket
|> assign(:search_query, query)
|> assign(:search_results, results)}
end
@impl true
def handle_event("add_member", %{"user-uuid" => user_uuid}, socket) do
case Newsletters.subscribe_user(socket.assigns.list.uuid, user_uuid) do
{:ok, _} ->
members = reload_members(socket)
{:noreply,
socket
|> put_flash(:info, "Member added")
|> assign(:members, members)
|> assign(:search_query, "")
|> assign(:search_results, [])}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Could not add member")}
end
end
defp handle_add_all_users(socket) do
%{users: users} = Auth.list_users_paginated(page_size: 1000)
added =
Enum.reduce(users, 0, fn user, acc ->
case Newsletters.subscribe_user(socket.assigns.list.uuid, user.uuid) do
{:ok, _} -> acc + 1
_ -> acc
end
end)
members = reload_members(socket)
{:noreply,
socket
|> put_flash(:info, "Added #{added} users to the list")
|> assign(:members, members)
|> assign(:search_query, "")
|> assign(:search_results, [])}
end
defp handle_unsubscribe(socket, member_uuid) do
member = find_member(socket.assigns.members, member_uuid)
if member do
case Newsletters.unsubscribe_user(member.list_uuid, member.user_uuid) do
{:ok, _} ->
members = reload_members(socket)
{:noreply,
socket
|> put_flash(:info, "Member unsubscribed")
|> assign(:members, members)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Could not unsubscribe member")}
end
else
{:noreply, put_flash(socket, :error, "Member not found")}
end
end
defp handle_remove(socket, member_uuid) do
member = find_member(socket.assigns.members, member_uuid)
if member do
repo = PhoenixKit.RepoHelper.repo()
case repo.delete(member) do
{:ok, _} ->
members = reload_members(socket)
{:noreply,
socket
|> put_flash(:info, "Member removed")
|> assign(:members, members)}
{:error, _} ->
{:noreply, put_flash(socket, :error, "Could not remove member")}
end
else
{:noreply, put_flash(socket, :error, "Member not found")}
end
end
defp confirm_text("add_all_users"),
do: {"Add All Users", "All registered users will be subscribed to this list."}
defp confirm_text("unsubscribe"),
do: {"Unsubscribe Member", "This member will be unsubscribed from the list."}
defp confirm_text("remove"),
do: {"Remove Member", "This member will be permanently removed from the list."}
defp confirm_text(_), do: {"Confirm", "Are you sure?"}
defp find_member(members, uuid) do
Enum.find(members, fn m -> to_string(m.uuid) == uuid end)
end
defp reload_members(socket) do
Newsletters.list_members(socket.assigns.list.uuid, %{status: socket.assigns.status_filter})
end
end