diff --git a/admin-spa/src/components/ui/input.tsx b/admin-spa/src/components/ui/input.tsx index c35deca..9da723d 100644 --- a/admin-spa/src/components/ui/input.tsx +++ b/admin-spa/src/components/ui/input.tsx @@ -10,6 +10,8 @@ const Input = React.forwardRef>( className={cn( 'ui-ctrl', "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", + // Override browser default styles for all input types + "appearance-none [-webkit-appearance:none] [-moz-appearance:textfield]", className )} ref={ref} diff --git a/admin-spa/src/routes/Settings/Payments.tsx b/admin-spa/src/routes/Settings/Payments.tsx index 6bd69e7..6634781 100644 --- a/admin-spa/src/routes/Settings/Payments.tsx +++ b/admin-spa/src/routes/Settings/Payments.tsx @@ -53,6 +53,7 @@ export default function PaymentsPage() { const queryClient = useQueryClient(); const [selectedGateway, setSelectedGateway] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); + const [togglingGateway, setTogglingGateway] = useState(null); // Fetch all payment gateways const { data: gateways = [], isLoading, refetch } = useQuery({ @@ -64,27 +65,18 @@ export default function PaymentsPage() { // Toggle gateway mutation const toggleMutation = useMutation({ - mutationFn: ({ id, enabled }: { id: string; enabled: boolean }) => - api.post(`/payments/gateways/${id}/toggle`, { enabled }), - onMutate: async ({ id, enabled }) => { - // Optimistic update - await queryClient.cancelQueries({ queryKey: ['payment-gateways'] }); - const previous = queryClient.getQueryData(['payment-gateways']); - - queryClient.setQueryData(['payment-gateways'], (old: PaymentGateway[]) => - old.map((g) => (g.id === id ? { ...g, enabled } : g)) - ); - - return { previous }; - }, - onError: (_err, _variables, context) => { - queryClient.setQueryData(['payment-gateways'], context?.previous); - toast.error('Failed to update gateway'); + mutationFn: ({ id, enabled }: { id: string; enabled: boolean }) => { + setTogglingGateway(id); + return api.post(`/payments/gateways/${id}/toggle`, { enabled }); }, onSuccess: () => { - // Invalidate to fetch real state from server queryClient.invalidateQueries({ queryKey: ['payment-gateways'] }); toast.success('Gateway updated successfully'); + setTogglingGateway(null); + }, + onError: () => { + toast.error('Failed to update gateway'); + setTogglingGateway(null); }, }); @@ -191,6 +183,7 @@ export default function PaymentsPage() { label="" checked={gateway.enabled} onCheckedChange={(checked) => handleToggle(gateway.id, checked)} + disabled={togglingGateway === gateway.id} /> @@ -268,7 +261,7 @@ export default function PaymentsPage() { label="" checked={gateway.enabled} onCheckedChange={(checked) => handleToggle(gateway.id, checked)} - disabled={!gateway.requirements.met} + disabled={!gateway.requirements.met || togglingGateway === gateway.id} /> @@ -319,6 +312,7 @@ export default function PaymentsPage() { label="" checked={gateway.enabled} onCheckedChange={(checked) => handleToggle(gateway.id, checked)} + disabled={togglingGateway === gateway.id} /> diff --git a/includes/Compat/PaymentGatewaysProvider.php b/includes/Compat/PaymentGatewaysProvider.php index ef40a89..5283ebe 100644 --- a/includes/Compat/PaymentGatewaysProvider.php +++ b/includes/Compat/PaymentGatewaysProvider.php @@ -351,6 +351,9 @@ class PaymentGatewaysProvider { return new \WP_Error('invalid_gateway', 'Gateway does not extend WC_Payment_Gateway'); } + // Block external HTTP requests (analytics, tracking, etc.) + add_filter('pre_http_request', '__return_true', 999); + // Merge with existing settings $current_settings = get_option($gateway->get_option_key(), []); $new_settings = array_merge($current_settings, $settings); @@ -367,6 +370,9 @@ class PaymentGatewaysProvider { update_option($gateway->get_option_key(), $new_settings, 'yes'); } + // Re-enable HTTP requests + remove_filter('pre_http_request', '__return_true', 999); + // Clear cache wp_cache_delete('woocommerce_payment_gateways', 'options');