Packages

phoenix_kit

1.7.13
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
phoenix_kit lib phoenix_kit_web live modules blogging edit.ex
Raw

lib/phoenix_kit_web/live/modules/blogging/edit.ex

defmodule PhoenixKitWeb.Live.Modules.Blogging.Edit do
@moduledoc """
LiveView for editing blog metadata such as display name and slug.
"""
use PhoenixKitWeb, :live_view
use Gettext, backend: PhoenixKitWeb.Gettext
alias Phoenix.Component
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
alias PhoenixKitWeb.Live.Modules.Blogging
alias PhoenixKitWeb.Live.Modules.Blogging.PubSub, as: BloggingPubSub
def mount(%{"blog" => blog_slug} = _params, _session, socket) do
case find_blog(blog_slug) do
nil ->
{:ok,
socket
|> put_flash(:error, gettext("The requested blog could not be found."))
|> push_navigate(
to: Routes.path("/admin/settings/blogging", locale: socket.assigns.current_locale_base)
)}
blog ->
form =
Component.to_form(%{"name" => blog["name"], "slug" => blog["slug"]}, as: :blog)
{:ok,
socket
|> assign(:project_title, Settings.get_setting("project_title", "PhoenixKit"))
|> assign(:page_title, gettext("Edit Blog"))
|> assign(
:current_path,
Routes.path("/admin/settings/blogging/#{blog_slug}/edit",
locale: socket.assigns.current_locale_base
)
)
|> assign(:blog, blog)
|> assign(:form, form)}
end
end
def handle_params(_params, _uri, socket), do: {:noreply, socket}
def handle_event("validate", %{"blog" => params}, socket) do
{:noreply, assign(socket, :form, Component.to_form(params, as: :blog))}
end
def handle_event("save", %{"blog" => params}, socket) do
case Blogging.update_blog(socket.assigns.blog["slug"], params) do
{:ok, updated_blog} ->
# Broadcast blog updated for live dashboard updates
BloggingPubSub.broadcast_blog_updated(updated_blog)
updated_form =
Component.to_form(
%{"name" => updated_blog["name"], "slug" => updated_blog["slug"]},
as: :blog
)
{:noreply,
socket
|> assign(:blog, updated_blog)
|> assign(:form, updated_form)
|> put_flash(:info, gettext("Blog updated"))
|> push_navigate(
to: Routes.path("/admin/settings/blogging", locale: socket.assigns.current_locale_base)
)}
{:error, :already_exists} ->
{:noreply,
socket
|> put_flash(:error, gettext("Another blog already uses that slug."))
|> assign(:form, Component.to_form(params, as: :blog))}
{:error, :invalid_name} ->
{:noreply,
socket
|> put_flash(:error, gettext("Please provide a valid blog name."))
|> assign(:form, Component.to_form(params, as: :blog))}
{:error, :invalid_slug} ->
{:noreply,
socket
|> put_flash(
:error,
gettext(
"Invalid slug format. Please use only lowercase letters, numbers, and hyphens (e.g. my-blog-name)"
)
)
|> assign(:form, Component.to_form(params, as: :blog))}
{:error, :destination_exists} ->
{:noreply,
socket
|> put_flash(:error, gettext("A directory already exists for that slug."))
|> assign(:form, Component.to_form(params, as: :blog))}
{:error, reason} ->
{:noreply,
socket
|> put_flash(
:error,
gettext("Failed to update blog: %{reason}", reason: inspect(reason))
)
|> assign(:form, Component.to_form(params, as: :blog))}
end
end
def handle_event("cancel", _params, socket) do
{:noreply,
push_navigate(socket,
to: Routes.path("/admin/settings/blogging", locale: socket.assigns.current_locale_base)
)}
end
defp find_blog(slug) do
Blogging.list_blogs()
|> Enum.find(&(&1["slug"] == slug))
end
end