Packages

phoenix_kit

1.7.79
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 modules publishing web preview.ex
Raw

lib/modules/publishing/web/preview.ex

defmodule PhoenixKit.Modules.Publishing.Web.Preview do
@moduledoc """
Preview rendering for publishing posts.
Shows the full public-facing interface with a preview banner,
allowing editors to see exactly what visitors will see.
"""
use PhoenixKitWeb, :live_view
use Gettext, backend: PhoenixKitWeb.Gettext
require Logger
alias PhoenixKit.Modules.Publishing
alias PhoenixKit.Modules.Publishing.Constants
alias PhoenixKit.Modules.Publishing.Renderer
alias PhoenixKit.Modules.Publishing.Web.Controller.PostRendering
alias PhoenixKit.Modules.Publishing.Web.Controller.Translations
alias PhoenixKit.Modules.Publishing.Web.Editor.Helpers
alias PhoenixKit.Modules.Publishing.Web.HTML, as: PublishingHTML
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
import PhoenixKitWeb.Components.LanguageSwitcher
@impl true
def mount(params, _session, socket) do
group_slug = params["group"] || params["category"] || params["type"]
socket =
socket
|> assign(:project_title, Settings.get_project_title())
|> assign(:page_title, gettext("Preview"))
|> assign(:group_slug, group_slug)
|> assign(:group_name, Publishing.group_name(group_slug) || group_slug)
|> assign(
:current_path,
Routes.path("/admin/publishing/#{group_slug}/preview")
)
|> assign(:post, nil)
|> assign(:html_content, nil)
|> assign(:translations, [])
|> assign(:breadcrumbs, [])
|> assign(:version_dropdown, nil)
|> assign(:error, nil)
{:ok, socket}
end
@impl true
def handle_params(%{"post_uuid" => post_uuid} = params, _uri, socket) do
group_slug = socket.assigns.group_slug
language = params["lang"]
version = params["v"]
case Publishing.read_post_by_uuid(post_uuid, language, version) do
{:ok, post} ->
case render_markdown_content(post.content) do
{:ok, rendered_html} ->
post = Map.put(post, :uuid, post_uuid)
# Build the same data as the public controller
canonical_language = post.language
translations =
Translations.build_translation_links(group_slug, post, canonical_language)
breadcrumbs = PostRendering.build_breadcrumbs(group_slug, post, canonical_language)
version_dropdown =
PostRendering.build_version_dropdown(group_slug, post, canonical_language)
{:noreply,
socket
|> assign(:post, post)
|> assign(:group_slug, post.group)
|> assign(:group_name, Publishing.group_name(post.group) || post.group)
|> assign(:html_content, rendered_html)
|> assign(:current_language, canonical_language)
|> assign(:translations, translations)
|> assign(:breadcrumbs, breadcrumbs)
|> assign(:version_dropdown, version_dropdown)
|> assign(:page_title, post.metadata.title || Constants.default_title())
|> assign(:error, nil)}
{:error, error_message} ->
{:noreply,
socket
|> assign(:post, Map.put(post, :uuid, post_uuid))
|> assign(:group_slug, post.group)
|> assign(:group_name, Publishing.group_name(post.group) || post.group)
|> assign(:html_content, nil)
|> assign(:error, error_message)}
end
{:error, reason} ->
Logger.warning("[Publishing.Preview] Preview failed for #{post_uuid}: #{inspect(reason)}")
{:noreply,
socket
|> put_flash(:error, gettext("Post not found"))
|> push_navigate(to: Routes.path("/admin/publishing/#{group_slug}"))}
end
end
def handle_params(_params, _uri, socket) do
{:noreply,
socket
|> put_flash(:error, gettext("No post specified"))
|> push_navigate(to: Routes.path("/admin/publishing/#{socket.assigns.group_slug}"))}
end
@impl true
def handle_event("back_to_editor", _params, socket) do
post = socket.assigns[:post]
group_slug = socket.assigns.group_slug
destination =
if post && post[:uuid] do
Helpers.build_edit_url(group_slug, post,
lang: post[:language],
version: post[:version]
)
else
Routes.path("/admin/publishing/#{group_slug}")
end
{:noreply, push_navigate(socket, to: destination)}
end
# Delegate to PublishingHTML helpers used in the template
defdelegate has_publication_date?(post), to: PublishingHTML
defdelegate format_post_date(post, group_slug), to: PublishingHTML
@doc false
def build_preview_translations(translations, post, group_slug) do
post_uuid = post[:uuid]
version = post[:version]
Enum.map(translations, fn translation ->
code = translation[:code] || translation.code
query_params = %{"lang" => code}
query_params = if version, do: Map.put(query_params, "v", version), else: query_params
query = URI.encode_query(query_params)
%{
code: code,
display_code: translation[:display_code] || code,
name: translation[:name] || translation.name,
flag: translation[:flag] || "",
url: Routes.path("/admin/publishing/#{group_slug}/#{post_uuid}/preview?#{query}"),
status: "published",
exists: true
}
end)
end
defp render_markdown_content(content) when is_binary(content) do
content
|> Renderer.render_markdown()
|> then(&{:ok, &1})
rescue
error ->
Logger.error("[Publishing.Preview] Markdown rendering failed: #{inspect(error)}")
{:error, gettext("Failed to render preview.")}
end
end