From 93fb465cbb081062478edd9150665208050cbf6b Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Fri, 5 Dec 2025 11:23:03 +0100 Subject: [PATCH] fixing hotel information with image placeholders --- web/src/components/feats/hotel/HotelCard.tsx | 21 ++++-- .../components/feats/hotel/HotelDetails.tsx | 67 ++++++++++++++++--- web/src/lib/hotel-utils.ts | 2 - 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/web/src/components/feats/hotel/HotelCard.tsx b/web/src/components/feats/hotel/HotelCard.tsx index fc961a1..03e4dab 100644 --- a/web/src/components/feats/hotel/HotelCard.tsx +++ b/web/src/components/feats/hotel/HotelCard.tsx @@ -47,13 +47,27 @@ export default function HotelCard({ hotel }: { hotel: Hotel }) { window.location.href = `/hotel/products/${hotel.id}`; }; + const imageUrl = `https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=400&h=300&fit=crop`; + return (
-
- Image +
+ {hotel.name} { + e.currentTarget.style.display = 'none'; + const fallback = e.currentTarget.nextElementSibling as HTMLElement; + if (fallback) fallback.style.display = 'flex'; + }} + /> +
+ Image +
@@ -67,9 +81,6 @@ export default function HotelCard({ hotel }: { hotel: Hotel }) { ))}
- {hotel.refundable && ( -
Free cancellation
- )}
diff --git a/web/src/components/feats/hotel/HotelDetails.tsx b/web/src/components/feats/hotel/HotelDetails.tsx index 498a1f9..5695df8 100644 --- a/web/src/components/feats/hotel/HotelDetails.tsx +++ b/web/src/components/feats/hotel/HotelDetails.tsx @@ -1,6 +1,8 @@ 'use client'; +import { useState, useEffect } from 'react'; import type { Hotel } from '@/lib/hotel-utils'; +import PriceDisplay from '@/components/ui/PriceDisplay'; interface HotelDetailsProps { product: Hotel; @@ -8,15 +10,60 @@ interface HotelDetailsProps { addedToCart: boolean; } +const PriceTotalDisplay = ({ productId, nights }: { productId: string; nights: number }) => { + const [price, setPrice] = useState(null); + + useEffect(() => { + const fetchPrice = async () => { + try { + const sessionRes = await fetch('/api/session'); + const sessionData = await sessionRes.json(); + const params = new URLSearchParams({ + productId, + sessionId: sessionData.sessionId || '', + experimentId: sessionData.experimentId || '', + }); + const res = await fetch(`/api/pricing?${params.toString()}`); + const data = await res.json(); + setPrice(data.price); + } catch (err) { + console.error('failed to fetch price for total:', err); + } + }; + fetchPrice(); + }, [productId]); + + if (!price) return Loading...; + + return ( + + ${(price * nights).toFixed(2)} + + ); +}; + export default function HotelDetails({ product, onAddToCart, addedToCart }: HotelDetailsProps) { + const imageUrl = `https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop`; + return (
- {/* Image Section - Larger and cleaner */} -
- Hotel Image +
+ {product.name} { + e.currentTarget.style.display = 'none'; + if (e.currentTarget.nextElementSibling) { + (e.currentTarget.nextElementSibling as HTMLElement).style.display = 'flex'; + } + }} + /> +
+ Hotel Image +
- {/* Details Section - Full height/width usage */}

{product.name}

@@ -45,17 +92,15 @@ export default function HotelDetails({ product, onAddToCart, addedToCart }: Hote
- {product.refundable && ( -
- Free cancellation available -
- )} -
+

Price per night

+
+ +

Total for {product.nights} night{product.nights > 1 ? 's' : ''}

- ${product.pricePerNight * product.nights} + / {product.nights} nights
diff --git a/web/src/lib/hotel-utils.ts b/web/src/lib/hotel-utils.ts index e660f26..9a1c693 100644 --- a/web/src/lib/hotel-utils.ts +++ b/web/src/lib/hotel-utils.ts @@ -21,7 +21,6 @@ export interface Hotel { checkOut: string; dateIndex: number; amenities: string[]; - refundable: boolean; pricePerNight: number; nights: number; } @@ -42,7 +41,6 @@ export const transformProduct = (p: HotelProduct): Hotel => { checkOut: checkOut.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), dateIndex: date_index, amenities: metadata?.amenities || [], - refundable: metadata?.refundable || false, pricePerNight: metadata?.base_price || 100, nights, };