Current section
Files
Jump to
Current section
Files
lib/meta_heex_component.ex
defmodule MetaHeexComponent do
@moduledoc """
MetaHeexComponent provides dynamic meta tag management for Phoenix applications.
## Usage in LiveView
def mount(_params, _session, socket) do
{:ok,
MetaHeexComponent.assign_meta(socket,
page_title: "Dashboard",
meta_description: "Your dashboard overview"
)}
end
## Usage in Controllers
def index(conn, _params) do
conn
|> MetaHeexComponent.put_meta(
meta_description: "Welcome to our homepage",
og_title: "Homepage"
)
|> render("index.html")
end
"""
alias MetaHeexComponent.Components.MetaTags
alias Phoenix.LiveView.Socket
@doc """
Renders meta tags component.
"""
@spec live_meta_tags(map()) :: Phoenix.LiveView.Rendered.t()
defdelegate live_meta_tags(assigns), to: MetaTags
@doc """
Helper function to get all meta tags for rendering in templates.
Merges defaults with explicit meta tags from assigns.
"""
def get_meta_tags(assigns) do
defaults = MetaHeexComponent.Config.get_defaults()
meta_tags = assigns[:meta_tags] || %{}
Map.merge(defaults, meta_tags)
end
@doc """
Assigns meta tag values to the socket.
Values provided here will override any defaults from config.
"""
@spec assign_meta(Socket.t(), keyword()) :: Socket.t()
def assign_meta(socket, opts) do
# Convert opts to map and merge with existing meta_tags
new_meta_tags =
Map.get(socket.assigns, :meta_tags, %{})
|> Map.merge(Map.new(opts))
socket
|> Phoenix.Component.assign(:meta_tags, new_meta_tags)
|> Phoenix.Component.assign(opts)
end
@doc """
Assigns meta values for controller-rendered templates.
Values provided here will override any defaults from config.
"""
@spec put_meta(Plug.Conn.t(), keyword()) :: Plug.Conn.t()
def put_meta(conn, opts) do
# Convert keyword list to map
meta_map = Map.new(opts)
# Get existing meta_tags or initialize empty map
existing_meta = conn.assigns[:meta_tags] || %{}
# Merge with existing meta tags
new_meta_tags = Map.merge(existing_meta, meta_map)
conn
|> Plug.Conn.assign(:meta_tags, new_meta_tags)
|> Plug.Conn.merge_assigns(meta_map)
end
end