From 6b1ead7b8dd1efe2841f6c7bad529ff3e2e2afbf Mon Sep 17 00:00:00 2001 From: Ruven Salamon Date: Wed, 8 Dec 2021 21:22:37 +0100 Subject: [PATCH 1/7] rounding fix + deal repayment form improvements --- src/react/components/DealOverview.tsx | 46 +++++++++++++------ src/react/components/forms/CreateDealForm.tsx | 11 ++++- src/utils/format.utils.ts | 2 +- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/react/components/DealOverview.tsx b/src/react/components/DealOverview.tsx index 2eef1d6..eaab631 100644 --- a/src/react/components/DealOverview.tsx +++ b/src/react/components/DealOverview.tsx @@ -7,7 +7,7 @@ import React, { useCallback, useEffect, useState } from "react"; import { useNotify } from "react/hooks/useNotify"; import { useRefresh } from "react/hooks/useRefresh"; import { getClusterTime, getDealAccountData, repayDeal } from "store/api"; -import { Deal, DealStatus, RepaymentType } from "types/program.types"; +import { Deal, DealStatus } from "types/program.types"; import { createInterestRepaymentType, createPrincipalRepaymentType, @@ -18,7 +18,6 @@ import { import { toUIAmount, toUIPercentage } from "utils/format.utils"; import "../../styles/stakeform.scss"; -// TODO: store deal in state instead of every property separately export const DealOverview = () => { const wallet = useAnchorWallet(); const [placeholder, setPlaceholder] = useState("Connect wallet"); @@ -26,10 +25,8 @@ export const DealOverview = () => { const [deal, setDeal] = useState(); const [dealStatus, setDealStatus] = useState(); const [repaymentAmount, setRepaymentAmount] = useState(); - const [repaymentType, setRepaymentType] = useState(createInterestRepaymentType()); - const [repaymentSelectValue, setRepaymentSelectValue] = useState("interest"); + const [repaymentSelectValue, setRepaymentSelectValue] = useState("principal"); const notify = useNotify(); - const triggerRefresh = useRefresh(); const fetchDealData = useCallback(async () => { const _clusterTime = getClusterTime(connection.connection); @@ -48,6 +45,20 @@ export const DealOverview = () => { setDealStatus(dealStatus); }, [connection.connection, wallet]); + const triggerRefresh = useRefresh(fetchDealData); + + const determineRepaymentType = useCallback(() => { + if (!deal) { + return; + } + + const interestToRepay = getInterestToRepay(deal); + + setRepaymentSelectValue( + repaymentSelectValue === "interest" && interestToRepay ? "interest" : "principal" + ); + }, [deal, repaymentSelectValue]); + const calculateRepaymentAmount = useCallback(() => { if (!deal) { setRepaymentAmount(0); @@ -80,6 +91,10 @@ export const DealOverview = () => { calculateRepaymentAmount(); }, [calculateRepaymentAmount]); + useEffect(() => { + determineRepaymentType(); + }, [determineRepaymentType]); + const onSubmit = async (e: React.SyntheticEvent) => { e.preventDefault(); @@ -88,7 +103,11 @@ export const DealOverview = () => { } try { - await repayDeal(repaymentAmount, repaymentType, connection.connection, wallet as Wallet); + const repaymentTypeObj = + repaymentSelectValue === "interest" + ? createInterestRepaymentType() + : createPrincipalRepaymentType(); + await repayDeal(repaymentAmount, repaymentTypeObj, connection.connection, wallet as Wallet); const showFeeNotification = repaymentSelectValue === "interest"; const paymentNotification = `Successfully repaid ${toUIAmount(repaymentAmount)} USDC`; const feeNotification = ` with a ${toUIAmount( @@ -108,13 +127,6 @@ export const DealOverview = () => { const onRepaymentTypeChange = (e: any) => { if (repaymentSelectValue !== e.target.value) { - switch (e.target.value) { - case "interest": - setRepaymentType(createInterestRepaymentType()); - break; - default: - setRepaymentType(createPrincipalRepaymentType()); - } setRepaymentSelectValue(e.target.value); } }; @@ -173,8 +185,12 @@ export const DealOverview = () => { value={repaymentSelectValue} className="repayment-select credix-button MuiButton-root" > - Principal - Interest + + Principal + + + Interest +
diff --git a/src/react/components/forms/CreateDealForm.tsx b/src/react/components/forms/CreateDealForm.tsx index 35ec1d4..5b4628f 100644 --- a/src/react/components/forms/CreateDealForm.tsx +++ b/src/react/components/forms/CreateDealForm.tsx @@ -96,7 +96,14 @@ export const CreateDealForm = (props: Props) => { } return ( - wallet?.publicKey && principal && financingFee && borrower && validKey && !props.disabled + wallet?.publicKey && + principal && + financingFee && + borrower && + validKey && + !props.disabled && + timeToMaturity && + !(timeToMaturity % 30) ); }; @@ -161,7 +168,7 @@ export const CreateDealForm = (props: Props) => {