Stage 4 of the page builder: all shop pages now render via PageRenderer instead of inline templates or PageTemplates. - Collection: full filter bar moved to renderer (category pills, sort dropdown, CollectionFilters hook, empty state) - PDP: related_products and reviews loaded via block data loaders instead of manual queries - Cart: page definition loaded in mount, subtotal computed in render - Search: page definition loaded in mount, handle_params unchanged - Added Phoenix.VerifiedRoutes to PageRenderer for ~p sigil - Net -55 lines (128 added, 183 removed) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
35 lines
819 B
Elixir
35 lines
819 B
Elixir
defmodule BerrypodWeb.Shop.Search do
|
|
use BerrypodWeb, :live_view
|
|
|
|
alias Berrypod.{Pages, Search}
|
|
|
|
@impl true
|
|
def mount(_params, _session, socket) do
|
|
page = Pages.get_page("search")
|
|
{:ok, socket |> assign(:page_title, "Search") |> assign(:page, page)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_params(params, _uri, socket) do
|
|
query = params["q"] || ""
|
|
results = if query != "", do: Search.search(query), else: []
|
|
|
|
{:noreply,
|
|
socket
|
|
|> assign(:search_page_query, query)
|
|
|> assign(:search_page_results, results)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("search_submit", %{"q" => query}, socket) do
|
|
{:noreply, push_patch(socket, to: ~p"/search?q=#{query}")}
|
|
end
|
|
|
|
@impl true
|
|
def render(assigns) do
|
|
~H"""
|
|
<BerrypodWeb.PageRenderer.render_page {assigns} />
|
|
"""
|
|
end
|
|
end
|