import React, { useState, useEffect } from 'react'; import { __ } from '@/lib/i18n'; import { Crown, Info } from 'lucide-react'; import { SettingsLayout } from './components/SettingsLayout'; import { SettingsCard } from './components/SettingsCard'; import { ToggleField } from './components/ToggleField'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { formatMoney, getStoreCurrency } from '@/lib/currency'; interface CustomerSettings { auto_register_members: boolean; multiple_addresses_enabled: boolean; wishlist_enabled: boolean; vip_min_spent: number; vip_min_orders: number; vip_timeframe: 'all' | '30' | '90' | '365'; vip_require_both: boolean; vip_exclude_refunded: boolean; } export default function CustomersSettings() { const [settings, setSettings] = useState({ auto_register_members: false, multiple_addresses_enabled: true, wishlist_enabled: true, vip_min_spent: 1000, vip_min_orders: 10, vip_timeframe: 'all', vip_require_both: true, vip_exclude_refunded: true, }); const [isLoading, setIsLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [message, setMessage] = useState(''); const store = getStoreCurrency(); useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { try { setIsLoading(true); const response = await fetch( `${(window as any).WNW_CONFIG?.restUrl || ''}/store/customer-settings`, { credentials: 'include', headers: { 'X-WP-Nonce': (window as any).WNW_CONFIG?.nonce || (window as any).wpApiSettings?.nonce || '', }, } ); if (!response.ok) throw new Error('Failed to fetch'); const data = await response.json(); setSettings(data); } catch (error) { console.error('Error:', error); setMessage('Failed to load settings'); } finally { setIsLoading(false); } }; const handleSave = async () => { try { setIsSaving(true); setMessage(''); const response = await fetch( `${(window as any).WNW_CONFIG?.restUrl || ''}/store/customer-settings`, { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': (window as any).WNW_CONFIG?.nonce || (window as any).wpApiSettings?.nonce || '', }, body: JSON.stringify(settings), } ); if (!response.ok) throw new Error('Failed to save'); const data = await response.json(); setMessage(data.message || 'Settings saved successfully'); if (data.settings) setSettings(data.settings); } catch (error) { console.error('Error:', error); setMessage('Failed to save settings'); } finally { setIsSaving(false); } }; if (isLoading) { return (
); } return ( {message && (
{message}
)}
setSettings({ ...settings, auto_register_members: checked })} /> setSettings({ ...settings, multiple_addresses_enabled: checked })} /> setSettings({ ...settings, wishlist_enabled: checked })} />

{__('What are VIP customers?')}

{__('VIP customers are high-value customers who meet your qualification criteria.')}

setSettings({ ...settings, vip_min_spent: parseFloat(e.target.value) || 0 })} />

{__('Minimum total amount a customer must spend')}

setSettings({ ...settings, vip_min_orders: parseInt(e.target.value) || 0 })} />

{__('Minimum number of orders a customer must place')}

{__('Time period to calculate totals')}

setSettings({ ...settings, vip_require_both: checked })} />

{settings.vip_require_both ? __('Customer must meet BOTH criteria') : __('Customer must meet EITHER criterion')}

setSettings({ ...settings, vip_exclude_refunded: checked })} />

{__('Do not count refunded orders')}

{__('Preview')}

{settings.vip_require_both ? __('Customer needs') : __('Customer needs')}{' '} {formatMoney(settings.vip_min_spent, { currency: store.currency, symbol: store.symbol, thousandSep: store.thousand_sep, decimalSep: store.decimal_sep, decimals: 0, preferSymbol: true, })} {' '} {settings.vip_require_both ? __('AND') : __('OR')}{' '} {settings.vip_min_orders} {__('orders')}

); }