Created
August 21, 2019 22:09
-
-
Save stevenleelawson/b3a2d20f522b98502e015cd6a0abe670 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { Component } from 'react'; | |
import { connect } from 'react-redux'; | |
import PropTypes from 'prop-types'; | |
import { FormatCurrency } from 'num-format'; | |
import { Grid } from 'semantic-ui-react'; | |
import TypeCheck from 'typecheck-extended'; | |
import _ from 'lodash'; | |
import { UnderlineHeader } from '../../../../components/CustomUIElements'; | |
import Guarantors from './components/Guarantors'; | |
import GuarantorDetailsModal from './components/GuarantorDetailsModal'; | |
import DeleteGuarantorModal from './components/DeleteGuarantorModal'; | |
import { entityDetailsToState } from '../../services/AddToState/services/borrowersToState'; | |
import { ConcatName } from '../../../../services/Entities'; | |
import { | |
Entities, | |
Loans, | |
LoanRequest, | |
Relationships, | |
} from '../../../../services/ApiLib'; | |
export class GuarantorComponentObj extends Component { | |
constructor(props) { | |
super(props); | |
this.getLoanRequests = this.getLoanRequests.bind(this); | |
this.onSuccessRequest = this.onSuccessRequest.bind(this); | |
this.onError = this.onError.bind(this); | |
this.closeGuarantorModal = this.closeGuarantorModal.bind(this); | |
this.getThirdGuarantors = this.getThirdGuarantors.bind(this); | |
this.lookupThirdGuarantor = this.lookupThirdGuarantor.bind(this); | |
this.handleSelectedGuarantor = this.handleSelectedGuarantor.bind(this); | |
this.renderModal = this.renderModal.bind(this); | |
this.renderDeleteModal = this.renderDeleteModal.bind(this); | |
this.onThirdPostSuccess = this.onThirdPostSuccess.bind(this); | |
this.putThirdGuarantor = this.putThirdGuarantor.bind(this); | |
this.updateGuarantorThirdRelationship = this.updateGuarantorThirdRelationship.bind(this); | |
this.onDeleteSuccessThird = this.onDeleteSuccessThird.bind(this); | |
this.deleteThirdPartyGuarantor = this.deleteThirdPartyGuarantor.bind(this); | |
this.closeDeleteModal = this.closeDeleteModal.bind(this); | |
this.setThirdGuarantors = this.setThirdGuarantors.bind(this); | |
this.setBorrowers = this.setBorrowers.bind(this); | |
this.setOwnerGuarantorInfo = this.setOwnerGuarantorInfo.bind(this); | |
this.lookupOwnerGuarantor = this.lookupOwnerGuarantor.bind(this); | |
} | |
componentDidMount() { | |
this.getLoanRequests(); | |
} | |
componentDidUpdate(prevProps) { | |
const { | |
currentLoanRequest, | |
loanRequestsObj, | |
} = this.props; | |
if (loanRequestsObj[currentLoanRequest]) { | |
this.putThirdGuarantor(prevProps); | |
} | |
} | |
onSuccessRequest({ data }) { | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_SAVE_LOAN_REQUEST', | |
data, | |
}); | |
this.getBorrowers(this.props.loanAppUuid); | |
data.forEach((loanReq) => { | |
this.getThirdGuarantors(loanReq.uuid); | |
}); | |
} | |
onThirdPostSuccess({ data }, { ownerUuid, loanReqUuid }) { | |
this.props.dispatch({ | |
type: 'LOR_SAVE_THIRD_GUARANTOR_REL_UUID', | |
relationship_uuid: data.uuid, | |
id: ownerUuid, | |
loanReqUuid, | |
}); | |
this.props.dispatch({ | |
type: 'LOR_SAVE_CURRENT_LOAN_REQUEST', | |
loanReqUuid: '', | |
}); | |
this.props.loanRequests.forEach((loanReq) => { | |
this.getThirdGuarantors(loanReq.uuid); | |
}); | |
} | |
onError(err) { | |
// TODO make this onError appropriate to Guarantors render | |
this.props.dispatch({ | |
type: 'LOR_ENTITY_SEARCH_ERROR_MSG', | |
msg: 'Network Request Failed', | |
}); | |
console.warn('see error:', err); | |
} | |
onDeleteSuccessThird() { | |
this.props.dispatch({ | |
type: 'LOR_SAVE_CURRENT_EDIT_THIRD', | |
entityUuid: '', | |
}); | |
this.props.loanRequests.forEach((loanReq) => { | |
this.getThirdGuarantors(loanReq.uuid); | |
}); | |
} | |
setBorrowers({ data }) { | |
this.props.loanRequests.forEach((loanRequest) => { | |
data.forEach((loanApp) => { | |
this.props.dispatch({ | |
type: 'LOR_SAVE_PRIMARY_BORROWER_INST_UUID', | |
institutionUuid: loanApp.institution_uuid, | |
}); | |
loanApp.owners.forEach((owner) => { | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_SAVE_OWNERS', | |
id: loanRequest.uuid, | |
owner, | |
}); | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_SAVE_PRIMARY_BORROWER_UUID', | |
borrower: loanApp.entity_uuid, | |
}); | |
entityDetailsToState(loanApp.entity_uuid, this.props.dispatch, 'stepper'); | |
this.lookupOwnerGuarantor(owner.entity_uuid, loanApp.entity_uuid, loanRequest.uuid); | |
}); | |
}); | |
}); | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_OWNERS_DONE_LOADING', | |
}); | |
} | |
getBorrowers(loanAppUuid) { | |
TypeCheck(loanAppUuid, 'string'); | |
const relationship = { | |
rel_type: 'owner', | |
}; | |
const { jwt } = this.props; | |
Loans.getRelationships( | |
jwt, | |
this.setBorrowers, | |
() => { }, | |
loanAppUuid, | |
null, | |
relationship, | |
); | |
} | |
setThirdGuarantors({ data }, { loanRequestUuid }) { | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_SAVE_GUARANTORS', | |
guarantor: data, | |
id: loanRequestUuid, | |
}); | |
this.props.dispatch({ | |
type: 'LOR_GUARANTORS_THIRD_DONE_LOADING', | |
}); | |
data.forEach((relData) => { | |
entityDetailsToState(relData.entity_uuid, this.props.dispatch, 'stepper'); | |
}); | |
} | |
setOwnerGuarantorInfo({ data }, { borrower, loanRequest }) { | |
this.props.dispatch({ | |
type: 'LOR_SAVE_LOOKUP_OWNER_GUARANTOR_INFO', | |
id: data.uuid, | |
name: ConcatName(data), | |
tin: data.tin, | |
loanRequestId: loanRequest, | |
borrower, | |
}); | |
} | |
getLoanRequests() { | |
const { jwt, loanAppUuid } = this.props; | |
const { onSuccessRequest, onError } = this; | |
LoanRequest.get(jwt, onSuccessRequest, onError, null, null, { loan_app_uuid: loanAppUuid }); | |
} | |
getThirdGuarantors(loanReqId) { | |
TypeCheck(loanReqId, 'string'); | |
const relationship = { | |
rel_type: 'guarantor', | |
}; | |
const { jwt } = this.props; | |
Loans.getRelationships( | |
jwt, | |
this.setThirdGuarantors, | |
(err) => { console.log('err:', err); }, | |
loanReqId, | |
{ loanRequestUuid: loanReqId }, | |
relationship, | |
); | |
} | |
deleteThirdPartyGuarantor(entityUuid, loanReqId) { | |
const { jwt } = this.props; | |
this.props.dispatch({ | |
type: 'LOR_DELETE_THIRD_PARTY_GUARANTOR', | |
id: entityUuid, | |
loanReqId, | |
}); | |
if (this.props.deleteGuarantor.relationship_uuid) { | |
Relationships.remove( | |
this.props.deleteGuarantor.relationship_uuid, | |
jwt, | |
this.onDeleteSuccessThird, | |
this.onError, | |
{ thirdUuid: entityUuid }, | |
); | |
} | |
this.closeDeleteModal(); | |
} | |
lookupOwnerGuarantor(ownerUuid, borrowerUuid, loanReqUuid) { | |
TypeCheck(ownerUuid, 'string'); | |
const { jwt } = this.props; | |
Entities.get( | |
jwt, | |
this.setOwnerGuarantorInfo, | |
this.onError, | |
ownerUuid, | |
null, | |
{ | |
borrower: borrowerUuid, | |
loanRequest: loanReqUuid, | |
}, | |
); | |
} | |
closeDeleteModal() { | |
this.props.dispatch({ | |
type: 'LOR_CLOSE_DELETE_GUARANTOR_MODAL', | |
}); | |
} | |
putThirdGuarantor(prevProps) { | |
const { | |
currentEditRowThird, | |
currentLoanRequest, | |
loanRequestsObj, | |
} = this.props; | |
const curIndex = loanRequestsObj[currentLoanRequest].guarantors | |
.findIndex(g => g.entity_uuid === currentEditRowThird); | |
const thirdGuar = loanRequestsObj[currentLoanRequest].guarantors[curIndex]; | |
const prevThirdGuar = prevProps.loanRequestsObj[currentLoanRequest].guarantors[curIndex]; | |
if (!_.isEqual(prevThirdGuar, thirdGuar)) { | |
const amtGuar = parseInt(thirdGuar.amount_guaranteed, 10); | |
const pctGuar = parseInt(thirdGuar.percent_guaranteed, 10); | |
let body; | |
if (thirdGuar.percent_guaranteed) { | |
body = { | |
full_vs_limited: thirdGuar.full_vs_limited, | |
amount_or_percent: thirdGuar.amount_or_percent, | |
percent_guaranteed: pctGuar, | |
}; | |
} else if (thirdGuar.amount_guaranteed) { | |
body = { | |
full_vs_limited: thirdGuar.full_vs_limited, | |
amount_or_percent: thirdGuar.amount_or_percent, | |
amount_guaranteed: amtGuar, | |
}; | |
} else { | |
body = { | |
full_vs_limited: thirdGuar.full_vs_limited, | |
amount_or_percent: thirdGuar.amount_or_percent, | |
}; | |
} | |
this.updateGuarantorThirdRelationship(thirdGuar, body); | |
} | |
} | |
updateGuarantorThirdRelationship(thirdGuar, body) { | |
const { jwt } = this.props; | |
if (thirdGuar.relationship_uuid) { | |
Relationships.update( | |
thirdGuar.relationship_uuid, | |
jwt, | |
undefined, | |
this.onError, | |
body, | |
); | |
} | |
} | |
closeGuarantorModal() { | |
this.props.dispatch({ | |
type: 'LOR_CLOSE_GUARANTOR_MODAL', | |
}); | |
this.clearSelectedGuarantor(); | |
} | |
clearSelectedGuarantor() { | |
this.props.dispatch({ | |
type: 'LOR_CLEAR_SELECTED_GUARANTOR', | |
}); | |
} | |
handleSelectedGuarantor(data) { | |
this.props.dispatch({ | |
type: 'LOR_SAVE_GUARANTOR_UUID', | |
guarantor: data, | |
}); | |
} | |
lookupThirdGuarantor(e, entityUuid, loanRequestUuid) { | |
this.postGuarantorRelationship(entityUuid, loanRequestUuid); | |
this.closeGuarantorModal(); | |
} | |
postGuarantorRelationship(entityUuid, loanRequestUuid) { | |
const { | |
currentLoanRequest, | |
jwt, | |
institutionUuid, | |
} = this.props; | |
const relationshipGuarantor = { | |
parent_uuid: currentLoanRequest, | |
child_uuid: entityUuid, | |
institution_uuid: institutionUuid, | |
rel_type: 'guarantor', | |
}; | |
Relationships.add( | |
relationshipGuarantor, | |
jwt, | |
this.onThirdPostSuccess, | |
this.onError, | |
{ | |
ownerUuid: entityUuid, | |
loanReqUuid: loanRequestUuid, | |
}, | |
); | |
} | |
renderModal() { | |
return ( | |
<GuarantorDetailsModal | |
closeGuarantorModal={this.closeGuarantorModal} | |
entitySearchErrorMsg={this.props.entitySearchErrorMsg} | |
guarantorUuid={this.props.selectedGuarantorUuid} | |
loanRequestUuid={this.props.currentLoanRequest} | |
lookupThirdGuarantor={this.lookupThirdGuarantor} | |
onError={this.onError} | |
open={this.props.openGuarantorModal} | |
selectedEntityCallback={this.handleSelectedGuarantor} | |
primaryBorrowerInst={this.props.primaryBorrowerInst} | |
/> | |
); | |
} | |
renderDeleteModal() { | |
return ( | |
<DeleteGuarantorModal | |
open={this.props.deleteGuarantorModalOpen} | |
closeDeleteModal={this.closeDeleteModal} | |
guarantor={this.props.deleteGuarantor} | |
deleteThirdPartyGuarantor={this.deleteThirdPartyGuarantor} | |
loanReqId={this.props.deleteLoanReqId} | |
entityDetails={this.props.entityDetailsLookup} | |
/> | |
); | |
} | |
render() { | |
return ( | |
<div> | |
{this.renderModal()} | |
{this.renderDeleteModal()} | |
{(this.props.loanRequests).map((loanRequest, i) => ( | |
<div key={loanRequest.uuid} style={{ marginTop: '1em' }}> | |
<h1> | |
Guarantors for Loan Request | |
{` ${i + 1} - ${FormatCurrency(loanRequest.loan_amount || 0, false)}`} | |
</h1> | |
<UnderlineHeader /> | |
<Grid> | |
<Grid.Row columns={2}> | |
<Grid.Column> | |
</Grid.Column> | |
</Grid.Row> | |
</Grid> | |
<Guarantors | |
loanAppUuid={this.props.loanAppUuid} | |
loanRequestUuid={loanRequest.uuid} | |
openGuarantorModal={this.openGuarantorModal} | |
readOnly={this.props.readOnly} | |
/> | |
</div> | |
), this) | |
} | |
</div> | |
); | |
} | |
} | |
GuarantorComponentObj.propTypes = { | |
currentLoanRequest: PropTypes.string.isRequired, | |
currentEditRowThird: PropTypes.string.isRequired, | |
dispatch: PropTypes.func.isRequired, | |
entityDetailsLookup: PropTypes.objectOf(PropTypes.object).isRequired, | |
entitySearchErrorMsg: PropTypes.string.isRequired, | |
jwt: PropTypes.string.isRequired, | |
loanAppUuid: PropTypes.string.isRequired, | |
loanRequests: PropTypes.arrayOf(PropTypes.object).isRequired, | |
loanRequestsObj: PropTypes.objectOf(PropTypes.object).isRequired, | |
institutionUuid: PropTypes.string.isRequired, | |
selectedGuarantorUuid: PropTypes.string.isRequired, | |
openGuarantorModal: PropTypes.bool.isRequired, | |
deleteGuarantorModalOpen: PropTypes.bool.isRequired, | |
deleteGuarantor: PropTypes.shape({ | |
entity_uuid: PropTypes.string, | |
relationship_uuid: PropTypes.string, | |
}).isRequired, | |
deleteLoanReqId: PropTypes.string.isRequired, | |
primaryBorrowerInst: PropTypes.string.isRequired, | |
readOnly: PropTypes.bool.isRequired, | |
}; | |
const mapStateToProps = state => ( | |
{ | |
jwt: state.auth.jwt, | |
loanRequests: state.LorGuarantorReducer.loanRequests, | |
loanRequestsObj: state.LorGuarantorReducer.loanRequestsObj, | |
openGuarantorModal: state.LorGuarantorReducer.openGuarantorModal, | |
entitySearchErrorMsg: state.LorGuarantorReducer.entitySearchErrorMsg, | |
entityDetailsLookup: state.LorEntityDetailsReducer.entityDetailsLookup, | |
selectedGuarantorUuid: state.LorGuarantorReducer.selectedGuarantorUuid, | |
currentLoanRequest: state.LorGuarantorReducer.currentLoanRequest, | |
currentEditRowThird: state.LorGuarantorReducer.currentEditRowThird, | |
institutionUuid: state.auth.institutionUuid, | |
thirdPartyGuarantors: state.LorGuarantorReducer.thirdPartyGuarantors, | |
deleteGuarantorModalOpen: state.LorGuarantorReducer.deleteGuarantorModalOpen, | |
deleteLoanReqId: state.LorGuarantorReducer.deleteLoanReqId, | |
deleteGuarantor: state.LorGuarantorReducer.deleteGuarantor, | |
primaryBorrowerInst: state.LorGuarantorReducer.primaryBorrowerInst, | |
} | |
); | |
const GuarantorComponent = connect(mapStateToProps)(GuarantorComponentObj); | |
export default GuarantorComponent; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment