'use client' import { useState } from 'react' import { Button, Input, Select, toast, Spinner } from '@ciphera-net/ui' import { Plugs, LinkBreak, ShieldCheck } from '@phosphor-icons/react' import { useGSCStatus, useBunnyStatus } from '@/lib/swr/dashboard' import { disconnectGSC, getGSCAuthURL } from '@/lib/api/gsc' import { disconnectBunny, getBunnyPullZones, connectBunny, type BunnyPullZone } from '@/lib/api/bunny' import { getAuthErrorMessage } from '@ciphera-net/ui' import { formatDateTime } from '@/lib/utils/formatDate' function GoogleIcon() { return ( ) } function BunnyIcon() { return ( ) } function IntegrationCard({ icon, name, description, connected, detail, onConnect, onDisconnect, connectLabel = 'Connect', children, }: { icon: React.ReactNode name: string description: string connected: boolean detail?: string onConnect: () => void onDisconnect: () => void connectLabel?: string children?: React.ReactNode }) { return (
{icon}

{name}

{connected && ( Connected )}

{detail || description}

{connected ? ( ) : ( )}
{children}
) } function SecurityNote({ text }: { text: string }) { return (

{text}

) } function StatusDot({ status }: { status?: string }) { const color = status === 'active' ? 'bg-green-400' : status === 'syncing' ? 'bg-yellow-400 animate-pulse' : status === 'error' ? 'bg-red-400' : 'bg-neutral-500' const label = status === 'active' ? 'Connected' : status === 'syncing' ? 'Syncing' : status === 'error' ? 'Error' : 'Unknown' return ( {label} ) } function GSCDetails({ gscStatus }: { gscStatus: { connected: boolean; google_email?: string; gsc_property?: string; status?: string; last_synced_at?: string | null; error_message?: string | null } }) { if (!gscStatus.connected) return null const rows = [ { label: 'Google Account', value: gscStatus.google_email || 'Unknown' }, { label: 'GSC Property', value: gscStatus.gsc_property || 'Unknown' }, { label: 'Last Synced', value: gscStatus.last_synced_at ? formatDateTime(new Date(gscStatus.last_synced_at)) : 'Never' }, ] return (
{rows.map(row => (
{row.label} {row.value}
))}
{gscStatus.error_message && (

{gscStatus.error_message}

)}
) } function BunnySetupForm({ siteId, onConnected }: { siteId: string; onConnected: () => void }) { const [apiKey, setApiKey] = useState('') const [pullZones, setPullZones] = useState([]) const [selectedZone, setSelectedZone] = useState(null) const [loadingZones, setLoadingZones] = useState(false) const [connecting, setConnecting] = useState(false) const [zonesLoaded, setZonesLoaded] = useState(false) const handleLoadZones = async () => { if (!apiKey.trim()) { toast.error('Please enter your BunnyCDN API key') return } setLoadingZones(true) try { const data = await getBunnyPullZones(siteId, apiKey.trim()) setPullZones(data.pull_zones || []) setSelectedZone(null) setZonesLoaded(true) if (!data.pull_zones?.length) { toast.error('No pull zones found for this API key') } } catch (err) { toast.error(getAuthErrorMessage(err as Error) || 'Failed to load pull zones') } finally { setLoadingZones(false) } } const handleConnect = async () => { if (!selectedZone) { toast.error('Please select a pull zone') return } setConnecting(true) try { await connectBunny(siteId, apiKey.trim(), selectedZone.id, selectedZone.name) toast.success('BunnyCDN connected successfully') onConnected() } catch (err) { toast.error(getAuthErrorMessage(err as Error) || 'Failed to connect BunnyCDN') } finally { setConnecting(false) } } return (
setApiKey(e.target.value)} placeholder="Enter your BunnyCDN API key" className="flex-1" />
{zonesLoaded && pullZones.length > 0 && (