Deploy
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
'use client'
|
||||
|
||||
import { useMedusaProducts } from "@/hooks/useMedusaProducts"
|
||||
import Image from "next/image"
|
||||
import Link from "next/link"
|
||||
import { Card, CardContent } from "@/components/ui/Card"
|
||||
import Button from "@/components/ui/Button"
|
||||
import Badge from "@/components/ui/Badge"
|
||||
|
||||
const CURRENCY_SYMBOLS: Record<string, string> = { zar: "R", usd: "$", eur: "€", gbp: "£", kes: "KSh", ngn: "₦" }
|
||||
const formatPrice = (amount: number, code?: string) => {
|
||||
const sym = CURRENCY_SYMBOLS[(code ?? "").toLowerCase()] ?? (code?.toUpperCase() ?? "")
|
||||
return `${sym}${(amount / 100).toFixed(2)}`
|
||||
}
|
||||
|
||||
const roomImages = [
|
||||
"https://images.pexels.com/photos/15640157/pexels-photo-15640157.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
"https://images.pexels.com/photos/37930119/pexels-photo-37930119.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
"https://images.pexels.com/photos/29893445/pexels-photo-29893445.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
"https://images.pexels.com/photos/34515222/pexels-photo-34515222.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
"https://images.pexels.com/photos/34515222/pexels-photo-34515222.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
"https://images.pexels.com/photos/34515222/pexels-photo-34515222.jpeg?auto=compress&cs=tinysrgb&h=350",
|
||||
]
|
||||
|
||||
export default function KwaNtofontofoRoomsSection() {
|
||||
const { products: rooms, isLoading } = useMedusaProducts(6)
|
||||
|
||||
return (
|
||||
<section data-vula-section="kwantofontoforooms" id="rooms" className="py-20 px-6 bg-[#FDF6EC]">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<h2 className="text-4xl font-bold text-[#2C1810] text-center mb-4">
|
||||
Our Luxury Rooms
|
||||
</h2>
|
||||
<p className="text-center text-[#2C1810]/70 max-w-xl mx-auto mb-12">
|
||||
Each room is uniquely themed, air-conditioned with en-suite facilities,
|
||||
DStv, and a personal touch that makes you feel like royalty.
|
||||
</p>
|
||||
|
||||
{isLoading && (
|
||||
<div className="text-center text-[#2C1810] py-12">Loading rooms...</div>
|
||||
)}
|
||||
|
||||
{!isLoading && rooms && rooms.length > 0 && (
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
{rooms.map((room, index) => {
|
||||
const price = room.variants?.[0]?.prices?.[0]
|
||||
return (
|
||||
<Card key={room.id} className="overflow-hidden shadow-[var(--shadow-card)] hover:shadow-[var(--shadow-lifted)] hover:-translate-y-0.5 transition-all duration-200 ease-out">
|
||||
<div className="relative h-48 overflow-hidden">
|
||||
<Image
|
||||
src={roomImages[index % roomImages.length]}
|
||||
alt={room.title || "Room image"}
|
||||
fill
|
||||
sizes="(max-width: 768px) 100vw, 33vw"
|
||||
className="object-cover hover:scale-105 transition-transform duration-500 ease-out"
|
||||
/>
|
||||
</div>
|
||||
<CardContent className="p-5">
|
||||
<h3 className="text-xl font-semibold text-[#2C1810] mb-2">{room.title}</h3>
|
||||
<p className="text-sm text-[#2C1810]/70 mb-3 line-clamp-2">{room.description}</p>
|
||||
<div className="flex items-center gap-2 mb-4">
|
||||
<Badge variant="outline" className="text-xs">En-suite</Badge>
|
||||
<Badge variant="outline" className="text-xs">Air-conditioned</Badge>
|
||||
<Badge variant="outline" className="text-xs">DStv</Badge>
|
||||
</div>
|
||||
<div className="flex items-center justify-between">
|
||||
{price && (
|
||||
<span className="text-lg font-bold text-[#C0392B]">
|
||||
{formatPrice(price.amount, price.currency_code)} / night
|
||||
</span>
|
||||
)}
|
||||
<Link href={`/booking/${room.id}`}>
|
||||
<Button variant="default" size="sm" className="bg-[#E67E22] hover:bg-[#d4731f]">
|
||||
View Room
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!isLoading && (!rooms || rooms.length === 0) && (
|
||||
<div className="text-center text-[#2C1810] py-12">
|
||||
<p>No rooms available at the moment. Please check back later.</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user