Deploy
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
'use client'
|
||||
|
||||
import { useVulaContent } from '@/hooks/useVulaContent'
|
||||
import { useState } from 'react'
|
||||
import { Clock, Mail, MapPin, Phone } from 'lucide-react'
|
||||
import Input from '@/components/ui/Input'
|
||||
import Button from '@/components/ui/Button'
|
||||
import { Card, CardContent } from '@/components/ui/Card'
|
||||
|
||||
export default function ContactVaultSection() {
|
||||
const { items, loading } = useVulaContent('business_hours')
|
||||
const [form, setForm] = useState({ name: '', email: '', message: '' })
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="flex justify-center py-24">
|
||||
<div className="w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin text-[#c0c0c0]" />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
if (items.length === 0) return null
|
||||
|
||||
const handleSubmit = (e: React.FormEvent) => {
|
||||
e.preventDefault()
|
||||
// Enquiry submission placeholder
|
||||
alert('Thank you for your enquiry. Our concierge will be in touch within 24 hours.')
|
||||
setForm({ name: '', email: '', message: '' })
|
||||
}
|
||||
|
||||
return (
|
||||
<section
|
||||
id="contact-vault"
|
||||
data-vula-section="contactvault"
|
||||
data-vula-cms="business_hours"
|
||||
className="bg-[#0f0f17] py-24 lg:py-32 px-4"
|
||||
>
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
|
||||
{/* Contact details & hours */}
|
||||
<div>
|
||||
<div className="flex items-center gap-4 mb-8">
|
||||
<span className="h-px w-14 bg-[#c0c0c0]" />
|
||||
<span className="font-sans text-xs uppercase tracking-[0.15em] text-[#c0c0c0]">
|
||||
Private Appointments
|
||||
</span>
|
||||
</div>
|
||||
<h2 className="font-serif text-3xl lg:text-4xl text-[#e7e7ee] leading-tight mb-12">
|
||||
Visit Our <span className="italic text-[#c0c0c0]">Sandton</span> Showroom
|
||||
</h2>
|
||||
|
||||
<div className="space-y-6 text-[#a0a0b0] text-sm">
|
||||
<div className="flex items-start gap-4">
|
||||
<MapPin className="w-5 h-5 mt-0.5 text-[#c0c0c0]" />
|
||||
<div>
|
||||
<p className="text-[#e7e7ee] font-medium">Vault by Mkhize</p>
|
||||
<p>5th Floor, Sandton City Mall</p>
|
||||
<p>Sandton, Johannesburg, 2196</p>
|
||||
<p>South Africa</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-start gap-4">
|
||||
<Phone className="w-5 h-5 mt-0.5 text-[#c0c0c0]" />
|
||||
<div>
|
||||
<p>+27 11 234 5678</p>
|
||||
<p className="text-xs mt-1">WhatsApp: +27 71 234 5678</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-start gap-4">
|
||||
<Mail className="w-5 h-5 mt-0.5 text-[#c0c0c0]" />
|
||||
<p>concierge@vaultbymkhize.co.za</p>
|
||||
</div>
|
||||
|
||||
<div className="pt-6 border-t border-[#303040]">
|
||||
<div className="flex items-center gap-2 mb-4">
|
||||
<Clock className="w-5 h-5 text-[#c0c0c0]" />
|
||||
<span className="text-[#e7e7ee] font-medium uppercase text-xs tracking-widest">
|
||||
Operating Hours
|
||||
</span>
|
||||
</div>
|
||||
{items.map((hour) => {
|
||||
const d = hour.data as {
|
||||
day_of_week?: string
|
||||
open_time?: string
|
||||
close_time?: string
|
||||
is_closed?: boolean
|
||||
note?: string
|
||||
}
|
||||
return (
|
||||
<div
|
||||
key={hour.id}
|
||||
className="flex justify-between text-sm py-2 border-b border-[#303040]/50 last:border-none"
|
||||
>
|
||||
<span className="text-[#e7e7ee]">{d.day_of_week}</span>
|
||||
<span className="text-[#a0a0b0]">
|
||||
{d.is_closed
|
||||
? 'Closed'
|
||||
: `${d.open_time} – ${d.close_time}`}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
<p className="text-xs text-[#707080] mt-4">
|
||||
Closed on South African public holidays.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Enquiry form */}
|
||||
<div>
|
||||
<Card className="bg-[#18181b] border border-[#303040] rounded-lg">
|
||||
<CardContent className="p-8">
|
||||
<h3 className="font-sans text-xl text-[#e7e7ee] mb-2">
|
||||
Request a Private Appointment
|
||||
</h3>
|
||||
<p className="text-sm text-[#a0a0b0] mb-8">
|
||||
Experience the collection in person. Our team will confirm
|
||||
within 24 hours.
|
||||
</p>
|
||||
|
||||
<form onSubmit={handleSubmit} className="space-y-6">
|
||||
<Input
|
||||
label="Full Name"
|
||||
placeholder="Your name"
|
||||
value={form.name}
|
||||
onChange={(e) => setForm({ ...form, name: e.target.value })}
|
||||
required
|
||||
className="bg-[#0f0f17] border-[#303040] text-[#e7e7ee] placeholder:text-[#707080]"
|
||||
/>
|
||||
<Input
|
||||
label="Email Address"
|
||||
type="email"
|
||||
placeholder="you@example.com"
|
||||
value={form.email}
|
||||
onChange={(e) => setForm({ ...form, email: e.target.value })}
|
||||
required
|
||||
className="bg-[#0f0f17] border-[#303040] text-[#e7e7ee] placeholder:text-[#707080]"
|
||||
/>
|
||||
<Input
|
||||
label="Message"
|
||||
placeholder="Your enquiry or preferred date"
|
||||
value={form.message}
|
||||
onChange={(e) => setForm({ ...form, message: e.target.value })}
|
||||
required
|
||||
className="bg-[#0f0f17] border-[#303040] text-[#e7e7ee] placeholder:text-[#707080]"
|
||||
/>
|
||||
<Button
|
||||
type="submit"
|
||||
variant="default"
|
||||
className="w-full bg-[#c0c0c0] text-[#0f0f17] hover:bg-[#d0d0d0] py-4 uppercase tracking-widest text-sm font-semibold"
|
||||
>
|
||||
Send Enquiry
|
||||
</Button>
|
||||
</form>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user