import { useState } from "@wordpress/element"; import { __ } from "@wordpress/i18n"; import { CheckCircleIcon, CheckIcon, Globe, PenLine } from "lucide-react"; import Select from "@/common/Select"; import Button from "@/components/Button"; import { spcApi } from "@/lib/api"; import { useSettingsStore } from "@/store/optionsStore"; import { useAppStore } from "@/store/store"; import { toast } from "sonner"; import { useConnectionStore } from "./connectionStore"; import { CF_AUTH_MODES } from "@/lib/constants"; import ManagedSettingNotice from "./ManagedSettingNotice"; const ZoneIdConnect = () => { const { settings, updateSettings, cloudflareConnected, isSettingOverridden } = useSettingsStore(); const { asyncLocked, lockAsync } = useAppStore(); const { setErrorMessage } = useConnectionStore(); const zoneIdList = (settings.cf_zoneid_list ?? {}) as Record; const [loading, setLoading] = useState(false); const [disconnecting, setDisconnecting] = useState(false); const [isEditingZoneId, setIsEditingZoneId] = useState(false); const [selectedZoneId, setSelectedZoneId] = useState(Object.values(zoneIdList)[0] || ''); const zoneIdManaged = isSettingOverridden('cf_zoneid'); const disconnectManaged = [ 'cf_email', 'cf_apikey', 'cf_apitoken', 'cf_apitoken_domain', 'cf_zoneid_list', 'cf_zoneid', 'cf_cache_settings_ruleset_id', 'cf_cache_settings_ruleset_rule_id', 'enable_cache_rule', ].some(isSettingOverridden); const options = [ { label: __('Select a domain', 'wp-cloudflare-page-cache'), value: '' }, ...Object.entries(zoneIdList).map(([domain, zoneId]) => ({ label: domain, value: zoneId }))]; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setErrorMessage(''); if (!selectedZoneId) { return; } lockAsync(true); setLoading(true); const data = { zone_id: selectedZoneId, } const response = await spcApi.cloudflareConfirmZoneId(data); setLoading(false); lockAsync(false); if (!response.success) { toast.error(response.message); return; } const responseData = response.data; if (!responseData) { toast.error(window.SPCDash.i18n.genericError); return; } const missingPermissions = Array.isArray(responseData.permissions) ? responseData.permissions : Object.values(responseData.permissions ?? {}); if (responseData.success === false || missingPermissions.length > 0) { setErrorMessage('permission_error'); return; } if (!responseData.settings || !responseData.meta) { toast.error(window.SPCDash.i18n.genericError); return; } updateSettings(responseData.settings, responseData.meta); toast.success(response.message); setIsEditingZoneId(false); } const disconnect = async () => { const confirm = window.confirm(__('Are you sure you want to disconnect Cloudflare?', 'wp-cloudflare-page-cache')); if (!confirm) { return; } setErrorMessage(''); lockAsync(true); setDisconnecting(true); const response = await spcApi.cloudflareDisconnect(); lockAsync(false); setDisconnecting(false); const disconnectData = response.data; if (response.success && disconnectData?.settings && disconnectData?.meta) { updateSettings(disconnectData.settings, disconnectData.meta); toast.success(response.message); return; } toast.error(response.message); } // Get the domain from the zoneid list. const domain = Object.keys(zoneIdList).find((key) => zoneIdList[key] === settings.cf_zoneid) || ''; const isTokenAuth = settings.cf_auth_mode === CF_AUTH_MODES.API_TOKEN; return (

{__('Successfully Connected', 'wp-cloudflare-page-cache')}

{isTokenAuth ? __('Using API Token', 'wp-cloudflare-page-cache') : __('Account:', 'wp-cloudflare-page-cache') + ' ' + settings.cf_email }

{(!cloudflareConnected || isEditingZoneId) && (