import React from 'react'; import { Card } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { Switch } from '@/components/ui/switch'; import { Button } from '@/components/ui/button'; import { useTranslation } from 'react-i18next'; interface DomainConfigProps { data: { slug: string; custom_domain?: string; url_prefix?: string; password?: string; password_enabled?: boolean; domain_type?: 'slug' | 'subdomain' | 'domain'; }; onUpdate: (field: string, value: any) => void; slugStatus?: { available: boolean; checking: boolean }; onSlugChange?: (slug: string) => void; onPrefixChange?: (prefix: string) => void; businessId?: number; canUseCustomDomain?: boolean; canUseSubdomain?: boolean; } export default function DomainConfig({ data, onUpdate, slugStatus, onSlugChange, onPrefixChange, businessId, canUseCustomDomain = true, canUseSubdomain = true }: DomainConfigProps) { const { t } = useTranslation(); const [domainType, setDomainType] = React.useState(data.domain_type || 'slug'); const [domainStatus, setDomainStatus] = React.useState({ available: true, checking: false }); React.useEffect(() => { const newDomainType = data.domain_type || 'slug'; // Reset to slug if user doesn't have access to selected domain type if ((newDomainType === 'domain' && !canUseCustomDomain) || (newDomainType === 'subdomain' && !canUseSubdomain)) { setDomainType('slug'); onUpdate('domain_type', 'slug'); } else { setDomainType(newDomainType); } }, [data.domain_type, canUseCustomDomain, canUseSubdomain]); const debounce = (func, wait) => { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }; const checkDomainAvailability = React.useCallback( debounce(async (domain) => { if (!domain || domain.length < 3) { setDomainStatus({ available: true, checking: false }); return; } setDomainStatus({ available: true, checking: true }); try { const response = await fetch(route('api.check-domain'), { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '' }, body: JSON.stringify({ domain, business_id: businessId }) }); const result = await response.json(); setDomainStatus({ available: result.available, checking: false }); } catch (error) { setDomainStatus({ available: true, checking: false }); } }, 500), [] ); React.useEffect(() => { if (domainType === 'domain' && data.custom_domain) { checkDomainAvailability(data.custom_domain); } }, [data.custom_domain, domainType, checkDomainAvailability]); const getPreviewUrl = () => { switch (domainType) { case 'domain': return data.custom_domain ? `https://${data.custom_domain}` : 'https://yourdomain.com'; case 'subdomain': return data.slug ? `https://${data.slug}.${window.location.hostname}` : `https://your-slug.${window.location.hostname}`; case 'slug': default: return data.url_prefix ? `${window.location.origin}/${data.url_prefix}/${data.slug || 'your-slug'}` : `${window.location.origin}/${data.slug || 'your-slug'}`; } }; return (

2{t("Domain & URL Settings")}

{/* Domain Type Selection */}
{ setDomainType('slug'); onUpdate('domain_type', 'slug'); }} className="h-3 w-3 text-blue-600" />
{ setDomainType('subdomain'); onUpdate('domain_type', 'subdomain'); }} className="h-3 w-3 text-blue-600 disabled:opacity-50" />
{ setDomainType('domain'); onUpdate('domain_type', 'domain'); }} className="h-3 w-3 text-blue-600 disabled:opacity-50" />
{/* Configuration Fields */}
{domainType === 'domain' && (
{ onUpdate('custom_domain', e.target.value); checkDomainAvailability(e.target.value); }} placeholder="yourdomain.com" className={`h-9 text-sm ${domainStatus && !domainStatus.available ? 'border-red-500' : ''}`} /> {domainStatus && (
{domainStatus.checking && ( {t("Checking...")} )} {!domainStatus.checking && !domainStatus.available && ( {t("Not available")} )} {!domainStatus.checking && domainStatus.available && data.custom_domain && ( {t("Available")} )}
)}
)} {domainType === 'slug' && (
{ onUpdate('url_prefix', e.target.value); if (onPrefixChange) onPrefixChange(e.target.value); }} placeholder="v" className="h-9 text-sm" />
)} {(domainType === 'slug' || domainType === 'subdomain') && (
onSlugChange ? onSlugChange(e.target.value) : onUpdate('slug', e.target.value)} placeholder="your-business-name" className={`h-9 text-sm ${slugStatus && !slugStatus.available ? 'border-red-500' : ''}`} /> {slugStatus && (
{slugStatus.checking && ( {t("Checking...")} )} {!slugStatus.checking && !slugStatus.available && ( {t("Not available")} )} {!slugStatus.checking && slugStatus.available && data.slug && ( {t("Available")} )}
)}
)}
{/* Password Protection */}
onUpdate('password_enabled', checked)} className="scale-75" />
{data.password_enabled && (
onUpdate('password', e.target.value)} placeholder={t("Enter password")} className="h-9 text-sm" minLength={4} />
)}
{/* Preview URL */}

{getPreviewUrl()} {data.password_enabled && 🔒}

); }