Files
moybeach-main/components/Reservation.tsx
T

171 lines
8.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { motion } from "framer-motion";
import { Calendar, Users, Coffee, Mail } from "lucide-react";
import { useState } from "react";
import { submitContactMessage } from "@/app/actions";
export default function Reservation() {
const [isSubmitting, setIsSubmitting] = useState(false);
const [status, setStatus] = useState<{ type: 'success' | 'error', message: string } | null>(null);
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsSubmitting(true);
setStatus(null);
const form = e.currentTarget;
const formData = new FormData(form);
// Construct message from reservation fields
const date = formData.get('date') as string;
const guests = formData.get('guests') as string;
const serviceType = formData.get('serviceType') as string;
const name = formData.get('name') as string;
const phone = formData.get('phone') as string;
const email = formData.get('email') as string;
const messageBody = `REZERVASYON TALEBİ
Tarih: ${date}
Kişi Sayısı: ${guests}
Hizmet Tipi: ${serviceType}
Telefon: ${phone}`;
const contactFormData = new FormData();
contactFormData.append('name', name);
contactFormData.append('email', email);
contactFormData.append('subject', 'Yeni Rezervasyon Talebi');
contactFormData.append('message', messageBody);
const result = await submitContactMessage(contactFormData);
if (result.error) {
setStatus({ type: 'error', message: result.error });
} else {
setStatus({ type: 'success', message: 'Rezervasyon talebiniz alınmıştır. Ekibimiz en kısa sürede sizinle iletişime geçecektir.' });
form.reset();
}
setIsSubmitting(false);
};
return (
<section id="reservation" className="py-24 bg-white relative overflow-hidden">
{/* Decorative background blobs */}
<div className="absolute top-0 right-0 w-[500px] h-[500px] bg-sand-light rounded-full blur-3xl opacity-60 -translate-y-1/2 translate-x-1/3 pointer-events-none" />
<div className="absolute bottom-0 left-0 w-[380px] h-[380px] bg-coral-light/15 rounded-full blur-3xl opacity-50 translate-y-1/2 -translate-x-1/3 pointer-events-none" />
<div className="container mx-auto px-6 max-w-5xl relative z-10">
<div className="bg-sea-dark rounded-[2.5rem] p-8 md:p-14 shadow-2xl overflow-hidden relative">
{/* Inner glow */}
<div className="absolute top-0 right-0 w-72 h-72 bg-sea-light rounded-full blur-3xl opacity-25 -translate-y-1/2 translate-x-1/2 pointer-events-none" />
<div className="text-center mb-12 relative z-10 text-white">
<div className="flex items-center justify-center gap-3 mb-4">
<span className="w-8 h-px bg-coral/70" />
<h2 className="text-sm font-bold tracking-widest uppercase text-coral">Hemen Yerinizi Ayırtın</h2>
<span className="w-8 h-px bg-coral/70" />
</div>
<h3 className="text-4xl md:text-5xl font-serif mb-4">Rezervasyon Talebi</h3>
<p className="text-sand-light/80 max-w-2xl mx-auto text-sm leading-relaxed">
Unutulmaz bir Ege deneyimi için hemen formumuzu doldurun, ekibimiz en kısa sürede sizinle iletişime geçsin.
</p>
</div>
<motion.form
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="relative z-10 bg-white p-7 md:p-10 rounded-2xl shadow-xl max-w-4xl mx-auto"
onSubmit={handleSubmit}
>
<div className="grid md:grid-cols-3 gap-5 mb-6">
{/* Date */}
<div className="space-y-1.5">
<label className="text-xs font-semibold text-gray-600 uppercase tracking-wide flex items-center gap-1.5">
<Calendar size={13} className="text-coral" /> Tarih
</label>
<input
type="date"
name="date"
required
className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors text-sm"
/>
</div>
{/* Guests */}
<div className="space-y-1.5">
<label className="text-xs font-semibold text-gray-600 uppercase tracking-wide flex items-center gap-1.5">
<Users size={13} className="text-coral" /> Kişi Sayısı
</label>
<select name="guests" className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors bg-white text-sm">
<option value="1 Kişi">1 Kişi</option>
<option value="2 Kişi">2 Kişi</option>
<option value="3 Kişi">3 Kişi</option>
<option value="4 Kişi">4 Kişi</option>
<option value="5+ Kişi">5+ Kişi</option>
</select>
</div>
{/* Service type */}
<div className="space-y-1.5">
<label className="text-xs font-semibold text-gray-600 uppercase tracking-wide flex items-center gap-1.5">
<Coffee size={13} className="text-coral" /> Hizmet Tipi
</label>
<select name="serviceType" className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors bg-white text-sm">
<option value="Beach Club (Şezlong/Loca)">Beach Club (Şezlong/Loca)</option>
<option value="Restoran Akşam Yemeği">Restoran Akşam Yemeği</option>
<option value="Konaklama">Konaklama</option>
<option value="Özel Etkinlik / Organizasyon">Özel Etkinlik / Organizasyon</option>
</select>
</div>
</div>
<div className="grid md:grid-cols-3 gap-5 mb-7">
<input
type="text"
name="name"
required
placeholder="Adınız Soyadınız"
className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors text-sm"
/>
<input
type="tel"
name="phone"
required
placeholder="Telefon Numaranız"
className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors text-sm"
/>
<input
type="email"
name="email"
required
placeholder="E-Posta Adresiniz"
className="w-full px-4 py-3 rounded-xl border border-gray-200 focus:outline-none focus:ring-2 focus:ring-coral/40 focus:border-coral transition-colors text-sm"
/>
</div>
{status && (
<div className={`p-4 mb-6 rounded-xl text-sm ${status.type === 'success' ? 'bg-green-50 text-green-700 border border-green-200' : 'bg-red-50 text-red-700 border border-red-200'}`}>
{status.message}
</div>
)}
<button
type="submit"
disabled={isSubmitting}
className="btn-shimmer w-full bg-coral hover:bg-coral-dark text-white font-medium py-4 rounded-xl transition-colors shadow-lg hover:shadow-xl text-sm tracking-wide uppercase disabled:opacity-70 flex justify-center items-center"
>
{isSubmitting ? 'Talebiniz Gönderiliyor...' : 'Rezervasyon Talebi Gönder'}
</button>
<p className="text-[11px] text-center text-gray-400 mt-4">
Bu form ön rezervasyon talebidir. Kesin onay için ekibimiz sizinle iletişime geçecektir.
</p>
</motion.form>
</div>
</div>
</section>
);
}