import { useState, useEffect, useCallback } from 'react'; import Messages from './Messages.jsx'; import './Form.css'; function Form() { const [firstRender, setFirstRender] = useState(true); const [payerName, setPayerName] = useState(''); const [payerINN, setPayerINN] = useState(''); const [payerPhoneEmail, setPayerPhoneEmail] = useState(''); const [payerAddress, setPayerAddress] = useState(''); const [clientId, setClientId] = useState(''); const [payerBankAccount, setPayerBankAccount] = useState(''); const [amount, setAmount] = useState('0-00'); const [payerAccounts, setPayerAccounts] = useState([]); const [payerAccount, setPayerAccount] = useState(''); const [chargesDetails, setChargesDetails] = useState('OUR'); const [bnfAccount, setBNFAccount] = useState(''); const [bnfBankBic, setBNFBankBic] = useState(''); const [bnfINN, setBNFINN] = useState(''); const [bnfKPP, setBNFKPP] = useState(''); const [bnfName, setBNFName] = useState(''); const [bnfBankName, setBNFBankName] = useState(''); const [bnfBankAccounts, setBNFBankAccounts] = useState([ 'Выберите значение...', ]); const [bnfBankAccount, setBNFBankAccount] = useState('Выберите значение...'); const [paymentDetails, setPaymentDetails] = useState(''); const [codePurpose, setCodePurpose] = useState('1'); const [taxUINCode, setTaxUINCode] = useState(''); const [messages, setMessages] = useState([]); const fields = [ { name: 'payer_name', value: payerName, status: 'OK', message: '', values: [], }, { name: 'client_id', value: clientId, status: 'OK', message: '', values: [], }, { name: 'payer_inn', value: payerINN, status: 'OK', message: '', values: [], }, { name: 'payer_phone_email', value: payerPhoneEmail, status: 'OK', message: '', values: [], }, { name: 'payer_address', value: payerAddress, status: 'OK', message: '', values: [], }, { name: 'amount', value: amount, status: 'OK', message: '', values: [] }, { name: 'payer_account', value: payerAccount?.split('|')[0], status: 'OK', message: '', values: [], }, { name: 'details_of_charges', value: chargesDetails, status: 'OK', message: '', values: [], }, { name: 'bnf_account', value: bnfAccount, status: 'OK', message: '', values: [], }, { name: 'bnf_bank_bic', value: bnfBankBic, status: 'OK', message: '', values: [], }, { name: 'bnf_inn', value: bnfINN, status: 'OK', message: '', values: [] }, { name: 'bnf_kpp', value: bnfKPP, status: 'OK', message: '', values: [] }, { name: 'bnf_name', value: bnfName, status: 'OK', message: '', values: [] }, { name: 'bnf_bank_name', value: bnfBankName, status: 'OK', message: '', values: [], }, { name: 'bnf_bank_account', value: bnfBankAccount, status: 'OK', message: '', values: bnfBankAccounts, }, { name: 'payment_details', value: paymentDetails, status: 'OK', message: '', values: [], }, { name: 'code_purpose', value: codePurpose, status: 'OK', message: '', values: [], }, { name: 'tax_uin_code', value: taxUINCode, status: 'OK', message: '', values: [], }, { name: 'form_type', value: 'EXT-RUB', status: 'OK', message: '', values: [], }, { name: 'payment_type', values: [], value: 'regular_payment', status: 'OK', message: null, }, ]; const handlePressEnter = (e, field = null) => { if (e.key === 'Enter') { handleBlur(field); } }; const focusField = (fieldName) => { document.getElementById(fieldName).focus(); }; const getBorderColor = (fieldName) => { try { switch (messages[fieldName].status) { case 'ERROR': return 'red'; case 'WARNING': return 'orange'; default: return 'black'; } } catch { return 'black'; } }; const handleBlur = (field) => { setFirstRender(false); (async () => { const data = await requestPMTValidationAsyncAwait(fields, 'validate'); setMessages( data.fields?.reduce((acc, item) => { acc[item.name] = { status: item.status, message: item.message }; return acc; }, {}) ); })(); if (['bnf_account', 'bnf_bank_bic', 'bnf_inn'].includes(field)) { (async () => { const data = await requestPMTValidationAsyncAwait( fields, 'doActionForField', field ); setBNFBankName(data.fields[13].value); setBNFBankAccounts(data.fields[14].values); setBNFBankAccount(data.fields[14].values[0]); })(); } }; const requestPMTValidationAsyncAwait = async ( fields, action, currentField = null ) => { const response = await fetch('/pmtvalidation/validate/', { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ fields: fields, action: action, currentField: currentField, }), }); const data = await response.json(); console.log(data); return data; }; useEffect(() => { if (firstRender) { setFirstRender(false); return; } handleBlur(); }, [firstRender, bnfBankAccount, payerAccount]); useEffect(() => { const URLParams = new URLSearchParams(window.location.search); const cnum = URLParams.get('cnum'); const ftype = URLParams.get('type'); (async () => { const data = await requestPMTValidationAsyncAwait( [ { name: 'payer_account' }, { name: 'client_id', value: cnum }, { name: 'form_type', value: ftype }, ], 'getClientInfo' ); setPayerName(data.fields[3].value); setPayerINN(data.fields[4].value); setPayerPhoneEmail(data.fields[6].value); setPayerAddress(data.fields[7].value); setClientId(data.fields[1].value); setPayerBankAccount(data.fields[12].value); setPayerAccounts(data.accounts); setPayerAccount(data.accounts[0]?.cbAccountNumber); })(); }, []); return (