// 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 (
Add new bank account or payment method {bankLimit < 999 && ` (${currentBankCount}/${bankLimit} used)`}
Manage your bank accounts and payment methods
| 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)} |