// CreateBank view implementation with feature controls function CreateBank({ 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(''); const [page, setPage] = React.useState(1); const [pageSize] = React.useState(10); // Feature context const { features, getFeatureLimit, isLimitReached } = window.useSalesFeatures ? window.useSalesFeatures() : { features: {}, getFeatureLimit: () => 999, isLimitReached: () => false }; const bankLimit = getFeatureLimit('bank_accounts_limit', 'maxBankAccounts'); const [remoteBankLimit, setRemoteBankLimit] = React.useState(null); const currentBankCount = rows.length; // effective limit: prefer the remote fetched limit (direct API), else context-provided limit 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); setPage(1); } catch (err) { setError(err.message); } }; React.useEffect(() => { fetchBanks(); }, [token]); // Fetch the specific bank_accounts_limit directly if context returns 0 or missing React.useEffect(() => { let mounted = true; const fetchLimit = async () => { try { if (!token) return; // Only fetch if context limit is falsy (0) or remote not fetched yet if (bankLimit && bankLimit > 0) return; const res = await fetch(salesUrl + '/api/user/features/bank_accounts_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) { // ignore - remote fallback is optional } }; fetchLimit(); return () => { mounted = false; }; }, [token, salesUrl, bankLimit]); const submit = async (e) => { e.preventDefault(); // Check limit before creating if (isAtLimit) { window.checkSalesFeatureLimit('bank_accounts_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); } }; // pagination and helpers const total = rows.length; const startIndex = total === 0 ? 0 : (page - 1) * pageSize + 1; const endIndex = Math.min(page * pageSize, total); const totalPages = Math.max(1, Math.ceil(total / pageSize)); const visible = rows.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize); 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_accounts_limit', limitKey: 'maxBankAccounts', currentCount: currentBankCount, featureName: 'Bank Account', showWarningAt: 0.8 }, null)}

Create Payment Method

Add new bank account or payment method {bankLimit < 999 && ` (${currentBankCount}/${bankLimit} used)`}

{/* Show limit reached message */} {isAtLimit && (
🚫 Bank account limit reached ({currentBankCount}/{bankLimit}).
)}
{error && (
{error}
)}
{/* Statistics Cards */}
💰
Total Balance
{formatCurrency(totalBalance)}
Across all accounts
{/* Payment Methods Table */}

Payment Methods

Manage your bank accounts and payment methods

{visible.length === 0 ? (
No Payment Methods
Add your first bank account or payment method to get started
) : ( <>
{visible.map((r, i) => ( ))}
No. Branch Bank Name Account Number Holder Name Phone Number Balance Amount
{startIndex + i} {r.branchName || '-'} {r.bankName || '-'} {r.accountNumber || '-'} {r.holderName || '-'} {r.phoneNumber || '-'} {formatCurrency(r.accountBalance || 0)}
{total === 0 ? 'No payment methods found' : `Showing ${startIndex} to ${endIndex} of ${total} payment methods`}
Page {page} of {totalPages}
)}
); }