Packages
phoenix_kit
1.7.69
1.7.216
1.7.215
1.7.214
1.7.213
1.7.212
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/broadcast_details.ex
defmodule PhoenixKit.Modules.Newsletters.Web.BroadcastDetails do
@moduledoc """
LiveView for viewing broadcast details and delivery statistics.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Newsletters
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(%{"id" => id}, _session, socket) do
if Newsletters.enabled?() do
project_title = Settings.get_project_title()
socket =
socket
|> assign(:broadcast_id, id)
|> assign(:project_title, project_title)
|> assign(:broadcast, nil)
|> assign(:deliveries, [])
|> assign(:delivery_stats, %{})
|> assign(:loading, true)
|> assign(:show_confirm_modal, false)
|> assign(:confirm_action, nil)
|> assign(:confirm_target, nil)
|> assign(:confirm_title, "")
|> assign(:confirm_message, "")
|> load_broadcast_data()
{: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" => "cancel_broadcast"}, socket) do
{:noreply,
socket
|> assign(:show_confirm_modal, true)
|> assign(:confirm_action, :cancel_broadcast)
|> assign(:confirm_title, "Cancel Broadcast")
|> assign(:confirm_message, "This will stop any remaining deliveries for this broadcast.")}
end
@impl true
def handle_event("hide_confirm", _params, socket) do
{:noreply,
socket
|> assign(:show_confirm_modal, false)
|> assign(:confirm_action, 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
:cancel_broadcast ->
case Newsletters.update_broadcast(socket.assigns.broadcast, %{status: "cancelled"}) do
{:ok, broadcast} ->
{:noreply,
socket
|> assign(:broadcast, broadcast)
|> put_flash(:info, "Broadcast cancelled")}
{:error, _changeset} ->
{:noreply, put_flash(socket, :error, "Failed to cancel broadcast")}
end
_ ->
{:noreply, socket}
end
end
@impl true
def handle_event("refresh", _params, socket) do
{:noreply,
socket
|> assign(:loading, true)
|> load_broadcast_data()}
end
# --- Private ---
defp load_broadcast_data(socket) do
id = socket.assigns.broadcast_id
try do
broadcast = Newsletters.get_broadcast!(id)
deliveries = Newsletters.list_deliveries(id)
stats = Newsletters.get_delivery_stats(id)
socket
|> assign(:broadcast, broadcast)
|> assign(:deliveries, deliveries)
|> assign(:delivery_stats, stats)
|> assign(:loading, false)
|> assign(:page_title, broadcast.subject)
|> assign(:url_path, Routes.path("/admin/newsletters/broadcasts/#{id}"))
rescue
Ecto.NoResultsError ->
socket
|> assign(:loading, false)
|> put_flash(:error, "Broadcast not found")
|> push_navigate(to: Routes.path("/admin/newsletters/broadcasts"))
end
end
defp status_badge_class(status) do
case status do
"draft" -> "badge-ghost"
"scheduled" -> "badge-info"
"sending" -> "badge-warning"
"sent" -> "badge-success"
"cancelled" -> "badge-error"
_ -> "badge-ghost"
end
end
defp delivery_badge_class(status) do
case status do
"pending" -> "badge-ghost"
"sent" -> "badge-info"
"delivered" -> "badge-success"
"opened" -> "badge-primary"
"bounced" -> "badge-warning"
"failed" -> "badge-error"
_ -> "badge-ghost"
end
end
defp format_datetime(nil), do: "-"
defp format_datetime(dt) do
Calendar.strftime(dt, "%Y-%m-%d %H:%M")
end
defp stat_value(stats, key) do
Map.get(stats, key, 0)
end
end