'use client'; import { useState, useEffect } from 'react'; import { Loader2, AlertCircle, CheckCircle } from 'lucide-react'; import { getClubProfile, updateClubProfile } from '@/src/lib/api/courts'; import type { ClubProfile, ClubProfileUpdateRequest} from '@/src/types/courts'; import { COMMON_TIMEZONES, isValidEmail, isValidUrl } from '@/src/types/courts'; interface ClubProfileTabProps { clubId: number; onUpdate?: () => void; } export default function ClubProfileTab({ clubId, onUpdate }: ClubProfileTabProps) { const [profile, setProfile] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const [errors, setErrors] = useState>({}); // Form state const [name, setName] = useState(''); const [timezone, setTimezone] = useState(''); const [addressLine1, setAddressLine1] = useState(''); const [addressLine2, setAddressLine2] = useState(''); const [city, setCity] = useState(''); const [postalCode, setPostalCode] = useState(''); const [country, setCountry] = useState(''); const [phone, setPhone] = useState(''); const [email, setEmail] = useState(''); const [website, setWebsite] = useState(''); useEffect(() => { loadProfile(); }, [clubId]); async function loadProfile() { setLoading(true); const result = await getClubProfile(clubId); if (result.success) { const prof = result.data; setProfile(prof); // Populate form setName(prof.name); setTimezone(prof.timezone); setAddressLine1(prof.address_line_1 || ''); setAddressLine2(prof.address_line_2 || ''); setCity(prof.city || ''); setPostalCode(prof.postal_code || ''); setCountry(prof.country || ''); setPhone(prof.phone || ''); setEmail(prof.email || ''); setWebsite(prof.website || ''); setError(null); } else { setError(result.error.detail); } setLoading(false); } function validateForm(): boolean { const newErrors: Record = {}; if (!name || name.trim().length === 0) { newErrors.name = 'Name is required'; } if (!timezone) { newErrors.timezone = 'Timezone is required'; } if (email && !isValidEmail(email)) { newErrors.email = 'Invalid email format'; } if (website && !isValidUrl(website)) { newErrors.website = 'Invalid URL format (must include http:// or https://)'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!validateForm()) { return; } setSaving(true); setError(null); setSuccess(false); const request: ClubProfileUpdateRequest = { name: name.trim(), timezone, address_line_1: addressLine1.trim() || undefined, address_line_2: addressLine2.trim() || undefined, city: city.trim() || undefined, postal_code: postalCode.trim() || undefined, country: country.trim() || undefined, phone: phone.trim() || undefined, email: email.trim() || undefined, website: website.trim() || undefined, }; const result = await updateClubProfile(clubId, request); if (result.success) { setProfile(result.data); setSuccess(true); setError(null); // Call parent update callback if (onUpdate) { onUpdate(); } // Hide success message after 3 seconds setTimeout(() => setSuccess(false), 3000); } else { // Handle validation errors if (result.error.code === 'validation_error' && result.error.errors) { const fieldErrors: Record = {}; result.error.errors.forEach(err => { fieldErrors[err.field] = err.message; }); setErrors(fieldErrors); } else { setError(result.error.detail); } } setSaving(false); } function handleCancel() { if (!profile) return; // Reset form to original values setName(profile.name); setTimezone(profile.timezone); setAddressLine1(profile.address_line_1 || ''); setAddressLine2(profile.address_line_2 || ''); setCity(profile.city || ''); setPostalCode(profile.postal_code || ''); setCountry(profile.country || ''); setPhone(profile.phone || ''); setEmail(profile.email || ''); setWebsite(profile.website || ''); setErrors({}); setError(null); } // Loading state if (loading) { return (
); } // Error state if (error && !profile) { return (

{error}

); } if (!profile) return null; return (
{/* Success message */} {success && (

Profile updated successfully

)} {/* Error message */} {error && (

{error}

)}
{/* Basic Information */}

Basic Information

{/* Name */}
setName(e.target.value)} className={`w-full px-4 py-3 border-2 rounded-lg font-medium transition-colors ${ errors.name ? 'border-red-300 focus:border-red-500' : 'border-slate-200 focus:border-slate-900' } focus:outline-none`} disabled={saving} /> {errors.name && (

{errors.name}

)}
{/* Timezone */}
{errors.timezone && (

{errors.timezone}

)}
{/* Location */}

Location

{/* Address Line 1 */}
setAddressLine1(e.target.value)} placeholder="123 High Street" maxLength={200} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
{/* Address Line 2 */}
setAddressLine2(e.target.value)} placeholder="Building A" maxLength={200} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
{/* City & Postal Code */}
setCity(e.target.value)} placeholder="London" maxLength={100} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
setPostalCode(e.target.value)} placeholder="SW1A 1AA" maxLength={20} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
{/* Country */}
setCountry(e.target.value)} placeholder="United Kingdom" maxLength={100} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
{/* Contact */}

Contact

{/* Phone */}
setPhone(e.target.value)} placeholder="+44 20 1234 5678" maxLength={50} className="w-full px-4 py-3 border-2 border-slate-200 rounded-lg font-medium focus:border-slate-900 focus:outline-none transition-colors" disabled={saving} />
{/* Email */}
setEmail(e.target.value)} placeholder="info@centralpadel.com" maxLength={100} className={`w-full px-4 py-3 border-2 rounded-lg font-medium transition-colors ${ errors.email ? 'border-red-300 focus:border-red-500' : 'border-slate-200 focus:border-slate-900' } focus:outline-none`} disabled={saving} /> {errors.email && (

{errors.email}

)}
{/* Website */}
setWebsite(e.target.value)} placeholder="https://www.centralpadel.com" maxLength={200} className={`w-full px-4 py-3 border-2 rounded-lg font-medium transition-colors ${ errors.website ? 'border-red-300 focus:border-red-500' : 'border-slate-200 focus:border-slate-900' } focus:outline-none`} disabled={saving} /> {errors.website && (

{errors.website}

)}
{/* Integration (read-only) */}

Integration

Provider: {profile.provider}
{profile.provider !== 'local' && profile.remote_club_id && (
Remote Club ID: {profile.remote_club_id}
)}
{/* Actions */}
); }