tarakan/lib/tarakan_web/live/page_live.ex
Maxfield Luke af6077b9c3
All checks were successful
CI and deploy / Test (push) Successful in 4m52s
CI and deploy / Deploy production (push) Successful in 23s
Initial commit on Forgejo
Fresh repository history for elektrine/tarakan hosted at
https://git.elektrine.com/elektrine/tarakan.
2026-07-29 04:43:40 -04:00

83 lines
2.7 KiB
Elixir

defmodule TarakanWeb.PageLive do
@moduledoc """
Static policy and pricing pages.
These have no interactivity, but they are LiveViews so navigating to them
from the nav is a live patch rather than a full page reload. As plain
controller pages they were the only routes in the shell without a LiveSocket,
which made them behave differently from everything around them.
One module, one action per page, templates in `page_live/`.
"""
use TarakanWeb, :live_view
embed_templates "page_live/*"
@impl true
def mount(_params, _session, socket) do
{:ok, assign(socket, :security_contact, Application.get_env(:tarakan, :security_contact))}
end
@impl true
def handle_params(_params, _uri, socket) do
{:noreply, apply_action(socket, socket.assigns.live_action)}
end
defp apply_action(socket, :disclosure) do
socket
|> assign(:page_title, "Disclosure policy")
|> assign(
:meta_description,
"Tarakan is public disclosure by default: visibility levels, verification quorum, " <>
"vendor notification, and abuse reporting."
)
|> assign(:canonical_path, ~p"/policies/disclosure")
end
defp apply_action(socket, :content) do
socket
|> assign(:page_title, "Content policy")
|> assign(
:meta_description,
"What may and may not be published to the Tarakan public security record, and how " <>
"takedowns and appeals work."
)
|> assign(:canonical_path, ~p"/policies/content")
end
defp apply_action(socket, :pricing) do
take_rate_percent =
Tarakan.Market.take_rate()
|> Decimal.mult(100)
|> Decimal.normalize()
|> Decimal.to_string(:normal)
socket
|> assign(:page_title, "Pricing")
|> assign(:take_rate_percent, take_rate_percent)
|> assign(
:meta_description,
"Tarakan is free: read, submit, and check security findings at no cost. Post a " <>
"contract to get specific code reviewed; Tarakan keeps #{take_rate_percent}% when " <>
"the work is accepted."
)
|> assign(:canonical_path, ~p"/pricing")
end
defp apply_action(socket, :managed_disclosure) do
socket
|> assign(:page_title, "Managed disclosure")
|> assign(
:meta_description,
"Managed disclosure: Tarakan staff triage findings with the vendor under an SLA. " <>
"Handling, not suppression - the public record is unchanged."
)
|> assign(:canonical_path, ~p"/services/disclosure")
end
@impl true
def render(%{live_action: :disclosure} = assigns), do: disclosure(assigns)
def render(%{live_action: :content} = assigns), do: content(assigns)
def render(%{live_action: :pricing} = assigns), do: pricing(assigns)
def render(%{live_action: :managed_disclosure} = assigns), do: managed_disclosure(assigns)
end