/** * Cart Rules Hook for Quantity Limits */ import { useState, useEffect, useCallback } from 'react' import type { CartRules } from '../types' declare const window: Window & { swiftCommerceData?: { apiUrl: string restNonce: string } } const getApiUrl = () => window.swiftCommerceData?.apiUrl || '/wp-json/swift-commerce/v1' const getNonce = () => window.swiftCommerceData?.restNonce || '' const defaultCartRules: CartRules = { min_qty_restriction: 0, max_qty_restriction: 0, enable_spend: false, min_spend: 0, max_spend: 0, include_shipping: false, excluded_products: [], } /** * Hook for managing cart quantity/spend rules */ export function useCartRules() { const [rules, setRules] = useState(defaultCartRules) const [isLoading, setIsLoading] = useState(true) const [isSaving, setIsSaving] = useState(false) const [error, setError] = useState(null) const fetchRules = useCallback(async () => { setIsLoading(true) setError(null) try { const response = await fetch(`${getApiUrl()}/quantity-limits/cart-rules`, { headers: { 'X-WP-Nonce': getNonce(), }, }) if (!response.ok) { throw new Error('Failed to fetch cart rules') } const data = await response.json() setRules(data.rules || defaultCartRules) } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred') } finally { setIsLoading(false) } }, []) useEffect(() => { fetchRules() }, [fetchRules]) const saveRules = async (newRules: CartRules) => { setIsSaving(true) setError(null) try { const response = await fetch(`${getApiUrl()}/quantity-limits/cart-rules`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': getNonce(), }, body: JSON.stringify({ rules: newRules }), }) if (!response.ok) { throw new Error('Failed to save cart rules') } const data = await response.json() if (!data.success) { // Pro feature not available - will be handled by main save return false } setRules(newRules) return true } catch (err) { const message = err instanceof Error ? err.message : 'An error occurred' setError(message) return false } finally { setIsSaving(false) } } return { rules, isLoading, isSaving, error, saveRules, refetch: fetchRules, } }