diff --git a/backend/igny8_core/modules/billing/serializers.py b/backend/igny8_core/modules/billing/serializers.py index d0a8afee..6d7780a7 100644 --- a/backend/igny8_core/modules/billing/serializers.py +++ b/backend/igny8_core/modules/billing/serializers.py @@ -44,16 +44,12 @@ class CreditUsageLogSerializer(serializers.ModelSerializer): read_only_fields = ['created_at', 'account'] def get_client_cost(self, obj) -> str: - """Calculate client-facing cost from credits * default_credit_price_usd""" + """Calculate client-facing cost from credits * default_credit_price_usd (price per credit)""" from igny8_core.business.billing.models import BillingConfiguration - try: - config = BillingConfiguration.get_config() - price_per_credit = config.default_credit_price_usd - client_cost = Decimal(obj.credits_used) * price_per_credit - return str(client_cost.quantize(Decimal('0.0001'))) - except Exception: - # Fallback to cost_usd if billing config unavailable - return str(obj.cost_usd) if obj.cost_usd else '0.0000' + config = BillingConfiguration.get_config() + price_per_credit = config.default_credit_price_usd + client_cost = Decimal(obj.credits_used) * price_per_credit + return str(client_cost.quantize(Decimal('0.0001'))) def get_site_name(self, obj) -> Optional[str]: """Get the site name if available""" diff --git a/frontend/src/components/sites/WordPressIntegrationForm.tsx b/frontend/src/components/sites/WordPressIntegrationForm.tsx index 3caa4b42..c7a38d07 100644 --- a/frontend/src/components/sites/WordPressIntegrationForm.tsx +++ b/frontend/src/components/sites/WordPressIntegrationForm.tsx @@ -6,23 +6,17 @@ import React, { useState, useEffect } from 'react'; import { Card } from '../ui/card'; import Button from '../ui/button/Button'; import IconButton from '../ui/button/IconButton'; -import Label from '../form/Label'; import Input from '../form/input/InputField'; -import Checkbox from '../form/input/Checkbox'; -import Switch from '../form/switch/Switch'; import { useToast } from '../ui/toast/ToastContainer'; import { fetchAPI, API_BASE_URL } from '../../services/api'; import { - CheckCircleIcon, - AlertIcon, DownloadIcon, PlusIcon, CopyIcon, TrashBinIcon, GlobeIcon, - KeyIcon, RefreshCwIcon, - InfoIcon + InfoIcon, } from '../../icons'; interface WordPressIntegrationFormProps { @@ -283,56 +277,40 @@ export default function WordPressIntegrationForm({ {/* Connection Status & Test Button */} {apiKey && ( -
- {/* Status Indicator - Uses theme colors from design-system */} -
- {connectionStatus === 'connected' && ( - <> - Connected - )} - {connectionStatus === 'testing' && ( - <> - Testing... - )} - {connectionStatus === 'api_key_pending' && ( - <> - Pending Setup - )} - {connectionStatus === 'plugin_missing' && ( - <> - Plugin Missing - )} - {connectionStatus === 'error' && ( - <> - Error - )} - {connectionStatus === 'unknown' && ( - <> - Not Tested - )} +
+ {/* Connection Status Indicator */} +
+ + + {connectionStatus === 'connected' && 'Connected'} + {connectionStatus === 'testing' && 'Testing...'} + {connectionStatus === 'api_key_pending' && 'Pending Setup'} + {connectionStatus === 'plugin_missing' && 'Plugin Missing'} + {connectionStatus === 'error' && 'Error'} + {connectionStatus === 'unknown' && 'Configured'} +
- {/* Test Connection Button - IconButton only */} - } - /> + startIcon={} + > + Test Connection +
)}
diff --git a/frontend/src/pages/Sites/Settings.tsx b/frontend/src/pages/Sites/Settings.tsx index 221d0187..6f1387d3 100644 --- a/frontend/src/pages/Sites/Settings.tsx +++ b/frontend/src/pages/Sites/Settings.tsx @@ -499,19 +499,6 @@ export default function SiteSettings() { return `${months}mo ago`; }; - // Integration status - tracks actual connection state - const [integrationStatus, setIntegrationStatus] = useState<'connected' | 'configured' | 'not_configured'>('not_configured'); - - // Check integration status based on API key presence (will be updated by WordPressIntegrationForm) - useEffect(() => { - if (site?.wp_api_key) { - // API key exists - mark as configured (actual connection tested in WordPressIntegrationForm) - setIntegrationStatus('configured'); - } else { - setIntegrationStatus('not_configured'); - } - }, [site?.wp_api_key]); - // Sync Now handler - tests actual WordPress connection const [syncLoading, setSyncLoading] = useState(false); const [lastSyncTime, setLastSyncTime] = useState(null); @@ -535,10 +522,8 @@ export default function SiteSettings() { const healthChecks = res.health_checks || {}; if (healthChecks.plugin_has_api_key) { - setIntegrationStatus('connected'); toast.success('WordPress connection verified - fully connected!'); } else if (healthChecks.plugin_installed) { - setIntegrationStatus('configured'); toast.warning('Plugin found but API key not configured in WordPress'); } else { toast.warning('WordPress reachable but IGNY8 plugin not installed'); @@ -684,21 +669,6 @@ export default function SiteSettings() { Publishing
- - {/* Integration Status Indicator - Larger */} -
- - - {integrationStatus === 'connected' && 'Connected'} - {integrationStatus === 'configured' && 'Configured'} - {integrationStatus === 'not_configured' && 'Not Configured'} - -