// Mobile-optimized CreateBank view function MobileCreateBank({ salesUrl, token }) { const [form, setForm] = React.useState({ bankName: '', accountNumber: '', holderName: '', address: '', phoneNumber: '', accountBalance: '' }); const [rows, setRows] = React.useState([]); const [saving, setSaving] = React.useState(false); const [error, setError] = React.useState(''); // Feature context const { features, getFeatureLimit, isLimitReached } = window.useSalesFeatures ? window.useSalesFeatures() : { features: {}, getFeatureLimit: () => 999, isLimitReached: () => false }; const bankLimit = getFeatureLimit('bank_account_limit', 'maxBankAccounts'); const [remoteBankLimit, setRemoteBankLimit] = React.useState(null); const currentBankCount = rows.length; const effectiveBankLimit = (typeof remoteBankLimit === 'number' && remoteBankLimit >= 0) ? remoteBankLimit : bankLimit; const isAtLimit = effectiveBankLimit > 0 ? (currentBankCount >= effectiveBankLimit) : false; const onChange = (e) => { const { name, value } = e.target; setForm((f) => ({ ...f, [name]: value })); }; const fetchBanks = async () => { try { setError(''); const res = await fetch(salesUrl + '/api/banks', { headers: { Authorization: 'Bearer ' + token } }); const data = await res.json(); if (!res.ok) throw new Error(data.message || 'Failed to load'); const list = Array.isArray(data.banks) ? data.banks : []; setRows(list); } catch (err) { setError(err.message); } }; React.useEffect(() => { fetchBanks(); }, [token]); React.useEffect(() => { let mounted = true; const fetchLimit = async () => { try { if (!token || (bankLimit && bankLimit > 0)) return; const res = await fetch(salesUrl + '/api/user/features/bank_account_limit/limits', { headers: { Authorization: 'Bearer ' + token } }); if (!res.ok) return; const data = await res.json(); const val = data?.limits?.maxBankAccounts; if (mounted && typeof val === 'number') setRemoteBankLimit(Number(val)); } catch (err) { } }; fetchLimit(); return () => { mounted = false; }; }, [token, salesUrl, bankLimit]); const submit = async (e) => { e.preventDefault(); if (isAtLimit) { window.checkSalesFeatureLimit('bank_account_limit', 'maxBankAccounts', currentBankCount, features, 'Bank Account'); return; } setSaving(true); setError(''); try { const res = await fetch(salesUrl + '/api/banks', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + token }, body: JSON.stringify({ bankName: form.bankName, accountNumber: form.accountNumber, holderName: form.holderName, address: form.address, phoneNumber: form.phoneNumber, accountBalance: form.accountBalance !== '' ? Number(form.accountBalance) : undefined, branchName: localStorage.getItem('branch_token') ? (function(){ try{ const p = JSON.parse(atob(localStorage.getItem('branch_token').split('.')[1].replace(/-/g,'+').replace(/_/g,'/'))); return p.name || ''; }catch(e){return '';} })() : undefined }) }); const data = await res.json(); if (!res.ok || !data.success) throw new Error(data.message || 'Save failed'); setForm({ bankName: '', accountNumber: '', holderName: '', address: '', phoneNumber: '', accountBalance: '' }); await fetchBanks(); } catch (err) { setError(err.message); } finally { setSaving(false); } }; const totalBalance = React.useMemo(() => rows.reduce((sum, r) => { const val = typeof r.accountBalance === 'number' ? r.accountBalance : Number(r.accountBalance); return sum + (Number.isFinite(val) ? val : 0); }, 0), [rows]); const formatCurrency = (n) => new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR', maximumFractionDigits: 2 }).format(n || 0); return (
{/* Limit Warning */} {React.createElement(window.LimitGuard, { featureKey: 'bank_account_limit', limitKey: 'maxBankAccounts', currentCount: currentBankCount, featureName: 'Bank Account', showWarningAt: 0.8 }, null)} {/* Create Form Card */}

💳 Add Payment Method

{bankLimit < 999 && `${currentBankCount}/${bankLimit} used`}

{isAtLimit && (
🚫 Bank account limit reached ({currentBankCount}/{bankLimit}).
)}
{error && (
⚠️ {error}
)}
{/* Banks List */}

💰 Your Payment Methods

Total Balance: {formatCurrency(totalBalance)}

{rows.length === 0 ? (
💳
No Payment Methods
Add your first payment method above
) : (
{rows.map((bank, idx) => (

💳 {bank.bankName}

{bank.accountNumber}

{formatCurrency(bank.accountBalance)}
👤 {bank.holderName}
{bank.phoneNumber && (
📞 {bank.phoneNumber}
)} {bank.address && (
📍 {bank.address}
)}
))}
)}
); } // Register globally window.MobileCreateBank = MobileCreateBank;