defmodule AshHqWeb.Pages.Blog do
@moduledoc "Blog page"
use Phoenix.LiveComponent
import AshHqWeb.Tails
alias AshHqWeb.Components.Blog.Tag
attr(:params, :map, default: %{})
def render(assigns) do
~H"""
<%= if @post do %>
<%= @post.title %>
<%= for tag <- @post.tag_names || [] do %>
<% end %>
<%= @post.author %>
<%= @post.published_at |> DateTime.to_date() %>
<%= Phoenix.HTML.raw(@post.body_html) %>
<% else %>
<%= if @tag do %>
Showing posts with tag: <%= @tag %>
<% else %>
Showing all posts
<% end %>
<%= for post <- @posts do %>
<%= post.title %>
<%= post.author %>
<%= post.published_at |> DateTime.to_date() %>
<%= for tag <- post.tag_names || [] do %>
<% end %>
<%= post.tag_line %>
Read
<% end %>
<% end %>
All Tags:
<%= for tag <- @tags do %>
<% end %>
"""
end
def update(assigns, socket) do
{:ok,
socket
|> assign(assigns)
|> assign_tags()
|> assign_filters()
|> assign_post()
|> assign_posts()}
end
defp assign_post(socket) do
if socket.assigns.params["slug"] do
assign(socket, :post, AshHq.Blog.Post.by_slug!(socket.assigns.params["slug"]))
else
assign(socket, :post, nil)
end
end
defp assign_posts(socket) do
assign(socket, :posts, AshHq.Blog.Post.published!(%{tag: socket.assigns.tag}))
end
defp assign_filters(socket) do
socket
|> assign(:tag, socket.assigns.params["tag"])
|> assign(:slug, socket.assigns.params["slug"])
end
defp assign_tags(socket) do
socket
|> assign(:tags, AshHq.Blog.Tag.read!())
end
end