2026-02-18 21:23:15 +00:00
|
|
|
defmodule BerrypodWeb.Shop.CheckoutSuccess do
|
|
|
|
|
use BerrypodWeb, :live_view
|
2026-02-07 08:30:17 +00:00
|
|
|
|
2026-02-26 19:32:50 +00:00
|
|
|
alias Berrypod.{Analytics, Orders, Pages}
|
2026-02-07 08:30:17 +00:00
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def mount(%{"session_id" => session_id}, _session, socket) do
|
|
|
|
|
order = Orders.get_order_by_stripe_session(session_id)
|
|
|
|
|
|
|
|
|
|
# Subscribe to order status updates (webhook may arrive after redirect)
|
|
|
|
|
if order && connected?(socket) do
|
2026-02-18 21:23:15 +00:00
|
|
|
Phoenix.PubSub.subscribe(Berrypod.PubSub, "order:#{order.id}:status")
|
2026-02-07 08:30:17 +00:00
|
|
|
end
|
|
|
|
|
|
2026-02-22 12:50:55 +00:00
|
|
|
# Track purchase event
|
|
|
|
|
if order && connected?(socket) && socket.assigns[:analytics_visitor_hash] do
|
2026-02-22 21:13:47 +00:00
|
|
|
attrs =
|
|
|
|
|
BerrypodWeb.AnalyticsHook.attrs(socket)
|
|
|
|
|
|> Map.merge(%{pathname: "/checkout/success", revenue: order.total})
|
|
|
|
|
|
|
|
|
|
Analytics.track_event("purchase", attrs)
|
2026-02-22 12:50:55 +00:00
|
|
|
end
|
|
|
|
|
|
2026-02-07 08:30:17 +00:00
|
|
|
# Clear the cart after successful checkout
|
|
|
|
|
socket =
|
|
|
|
|
if order && connected?(socket) do
|
2026-02-18 21:23:15 +00:00
|
|
|
BerrypodWeb.CartHook.broadcast_and_update(socket, [])
|
2026-02-07 08:30:17 +00:00
|
|
|
else
|
|
|
|
|
socket
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-26 19:32:50 +00:00
|
|
|
page = Pages.get_page("checkout_success")
|
|
|
|
|
|
2026-02-07 08:30:17 +00:00
|
|
|
socket =
|
|
|
|
|
socket
|
|
|
|
|
|> assign(:page_title, "Order confirmed")
|
|
|
|
|
|> assign(:order, order)
|
2026-02-26 19:32:50 +00:00
|
|
|
|> assign(:page, page)
|
2026-02-07 08:30:17 +00:00
|
|
|
|
|
|
|
|
{:ok, socket}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def mount(_params, _session, socket) do
|
|
|
|
|
{:ok, redirect(socket, to: ~p"/")}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def handle_info({:order_paid, order}, socket) do
|
|
|
|
|
{:noreply, assign(socket, :order, order)}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def render(assigns) do
|
|
|
|
|
~H"""
|
2026-02-26 19:32:50 +00:00
|
|
|
<BerrypodWeb.PageRenderer.render_page {assigns} />
|
2026-02-07 08:30:17 +00:00
|
|
|
"""
|
|
|
|
|
end
|
|
|
|
|
end
|