import { useEffect, useState } from "react"; import { Link, useNavigate, useParams } from "react-router-dom"; import { formatApiMessage } from "../api/client"; import * as api from "../api/services"; import { useAuth } from "../auth/AuthContext"; import { attributionParamsFromSearch, hasAttributionParams, persistMarketingClickId, readMarketingClickId, stripAttributionFromUrl, } from "../marketing/attribution"; import type { EquipmentItemDetail } from "../api/types"; export function EquipmentBookPage() { const { publicId } = useParams<{ publicId: string }>(); const navigate = useNavigate(); const { user } = useAuth(); const [item, setItem] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!publicId) return; const pathnameAtStart = window.location.pathname; const searchAtStart = window.location.search; const attribution = attributionParamsFromSearch(searchAtStart); let cancelled = false; (async () => { try { const data = await api.getEquipmentItem( publicId, hasAttributionParams(attribution) ? attribution : undefined, ); if (!cancelled) { setItem(data); if (hasAttributionParams(attribution)) { persistMarketingClickId("equipment", publicId, data.marketing_click_id); stripAttributionFromUrl(navigate, pathnameAtStart, searchAtStart); } } } catch (e) { if (!cancelled) setError(formatApiMessage(e)); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [publicId, navigate]); if (loading) { return (

Loading…

); } if (error || !item) { return (

{error ?? "Listing not found."}

Back to boat rentals
); } const marketingClickIdForConversion = readMarketingClickId("equipment", item.public_id) ?? item.marketing_click_id; return (
← Back to listing

Request this rental

You are signed in as {user?.email}. Confirm details below; a full booking form can submit to the WaterTrekk booking API next.

{item.title}

{item.vendor_business_name} · {item.location} · ${item.price_per_day} / day

marketing_click_id {marketingClickIdForConversion}{" "} (send this on the booking request for attribution)

); }