defmodule AshHqWeb.Pages.Blog do
@moduledoc "Blog page"
use Surface.LiveComponent
import Tails
alias AshHqWeb.Components.Blog.Tag
prop params, :map, default: %{}
data post, :any, default: nil
data posts, :any, default: []
data tag, :string
data tags, :any, default: []
data slug, :string
def render(assigns) do
~F"""
{#if @post}
{@post.title}
{#for tag <- @post.tag_names}
{/for}
{@post.author}
{@post.published_at |> DateTime.to_date()}
{raw(@post.body_html)}
{#else}
{#if @tag}
Showing posts with tag: {@tag}
{#else}
Showing all posts
{/if}
{#for post <- @posts}
{post.title}
{post.author}
{post.published_at |> DateTime.to_date()}
{#for tag <- post.tag_names}
{/for}
{/for}
{/if}
All Tags:
{#for tag <- @tags}
{/for}
"""
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