@huma-finance/widgets 0.0.37 → 0.0.38-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.env.example +2 -2
  2. package/.eslintignore +2 -2
  3. package/.eslintrc.js +64 -64
  4. package/.prettierignore +4 -4
  5. package/.prettierrc.js +16 -16
  6. package/API.md +404 -332
  7. package/LICENSE +660 -660
  8. package/README.md +48 -48
  9. package/babel.config.js +15 -15
  10. package/config-overrides.js +9 -9
  11. package/cosmos.config.json +7 -7
  12. package/cypress/e2e/01-invoice-factoring-borrow.test.ts +62 -62
  13. package/cypress/support/e2e.ts +76 -76
  14. package/cypress/support/ethereum.ts +142 -142
  15. package/cypress/tsconfig.json +9 -9
  16. package/cypress/utils/index.ts +54 -54
  17. package/cypress.config.ts +20 -20
  18. package/jsdoc2md.json +20 -20
  19. package/package.json +5 -5
  20. package/public/index.html +40 -40
  21. package/public/manifest.json +25 -25
  22. package/public/robots.txt +3 -3
  23. package/rollup.config.js +81 -81
  24. package/src/components/Activity.tsx +128 -128
  25. package/src/components/ApolloWrapper.tsx +15 -15
  26. package/src/components/ApproveAllowanceModal.tsx +138 -138
  27. package/src/components/BottomButton.tsx +33 -33
  28. package/src/components/ChainNotSupportedModal.tsx +33 -33
  29. package/src/components/ChooseAmountModal.tsx +322 -322
  30. package/src/components/ConfirmTransferModal.tsx +153 -153
  31. package/src/components/CreditLine/approve/1-ApproveAllowance.tsx +34 -34
  32. package/src/components/CreditLine/approve/2-Success.tsx +43 -43
  33. package/src/components/CreditLine/approve/index.tsx +85 -85
  34. package/src/components/CreditLine/borrow/1-Evaluation.tsx +157 -157
  35. package/src/components/CreditLine/borrow/2-ChooseAmount.tsx +74 -74
  36. package/src/components/CreditLine/borrow/3-ApproveAllowance.tsx +29 -29
  37. package/src/components/CreditLine/borrow/4-Transfer.tsx +34 -34
  38. package/src/components/CreditLine/borrow/5-Success.tsx +38 -38
  39. package/src/components/CreditLine/borrow/6-Notifications.tsx +10 -10
  40. package/src/components/CreditLine/borrow/index.tsx +136 -136
  41. package/src/components/CreditLine/payment/1-ChooseAmount.tsx +67 -67
  42. package/src/components/CreditLine/payment/2-ApproveAllowance.tsx +23 -23
  43. package/src/components/CreditLine/payment/3-Transfer.tsx +34 -34
  44. package/src/components/CreditLine/payment/4-Success.tsx +39 -39
  45. package/src/components/CreditLine/payment/index.tsx +94 -94
  46. package/src/components/ErrorModal.tsx +136 -136
  47. package/src/components/Factoring/FactoredList.tsx +143 -143
  48. package/src/components/Factoring/UpcomingList.tsx +90 -90
  49. package/src/components/Factoring/index.ts +2 -2
  50. package/src/components/HumaLoading.tsx +68 -68
  51. package/src/components/HumaSnackBar.tsx +60 -60
  52. package/src/components/HumaTable.tsx +203 -203
  53. package/src/components/InvoiceFactoring/borrow/1-Evaluation.tsx +49 -49
  54. package/src/components/InvoiceFactoring/borrow/2-ChooseAmount.tsx +88 -88
  55. package/src/components/InvoiceFactoring/borrow/3-ConfirmTransfer.tsx +37 -37
  56. package/src/components/InvoiceFactoring/borrow/4-ApproveNFT.tsx +55 -55
  57. package/src/components/InvoiceFactoring/borrow/5-Transfer.tsx +34 -34
  58. package/src/components/InvoiceFactoring/borrow/6-Success.tsx +20 -20
  59. package/src/components/InvoiceFactoring/borrow/index.tsx +94 -94
  60. package/src/components/InvoiceFactoring/payment/1-ChooseAmount.tsx +67 -67
  61. package/src/components/InvoiceFactoring/payment/2-ApproveAllowance.tsx +23 -23
  62. package/src/components/InvoiceFactoring/payment/3-Transfer.tsx +34 -34
  63. package/src/components/InvoiceFactoring/payment/4-Success.tsx +23 -23
  64. package/src/components/InvoiceFactoring/payment/index.tsx +86 -86
  65. package/src/components/Lend/supply/1-Evaluation/EvaluationEA.tsx +90 -90
  66. package/src/components/Lend/supply/1-Evaluation/EvaluationKYC.tsx +319 -319
  67. package/src/components/Lend/supply/1-Evaluation/index.tsx +31 -31
  68. package/src/components/Lend/supply/2-ChooseAmount.tsx +69 -69
  69. package/src/components/Lend/supply/3-ApproveAllowance.tsx +25 -25
  70. package/src/components/Lend/supply/4-Transfer.tsx +32 -32
  71. package/src/components/Lend/supply/5-Success.tsx +60 -60
  72. package/src/components/Lend/supply/6-Notifications.tsx +10 -10
  73. package/src/components/Lend/supply/index.tsx +167 -167
  74. package/src/components/Lend/withdraw/1-CheckWithdrawble.tsx +73 -73
  75. package/src/components/Lend/withdraw/2-ChooseAmount.tsx +50 -50
  76. package/src/components/Lend/withdraw/3-Transfer.tsx +32 -32
  77. package/src/components/Lend/withdraw/4-Success.tsx +49 -49
  78. package/src/components/Lend/withdraw/index.tsx +101 -101
  79. package/src/components/LoadingModal.tsx +49 -49
  80. package/src/components/Notifi/NotifiSubscriptionModal.tsx +268 -268
  81. package/src/components/StreamFactoring/borrow/1-Evaluation.tsx +55 -55
  82. package/src/components/StreamFactoring/borrow/2-ChooseAmount.tsx +127 -127
  83. package/src/components/StreamFactoring/borrow/3-ConfirmTransfer.tsx +42 -42
  84. package/src/components/StreamFactoring/borrow/4-ApproveAllowance.tsx +33 -33
  85. package/src/components/StreamFactoring/borrow/5-Permit.tsx +144 -144
  86. package/src/components/StreamFactoring/borrow/6-Transfer.tsx +37 -37
  87. package/src/components/StreamFactoring/borrow/7-Success.tsx +20 -20
  88. package/src/components/StreamFactoring/borrow/index.tsx +94 -94
  89. package/src/components/StreamFactoring/payment/ChooseAmount.tsx +54 -54
  90. package/src/components/StreamFactoring/payment/Success.tsx +23 -23
  91. package/src/components/StreamFactoring/payment/Transfer.tsx +34 -34
  92. package/src/components/StreamFactoring/payment/index.tsx +66 -66
  93. package/src/components/SuperfluidFactoring/SuperfluidFactoredList.tsx +69 -69
  94. package/src/components/SuperfluidFactoring/SuperfluidUpcomingList.tsx +166 -166
  95. package/src/components/SuperfluidFactoring/index.tsx +85 -85
  96. package/src/components/TxDoneModal.tsx +85 -85
  97. package/src/components/TxSendModal.tsx +59 -59
  98. package/src/components/ViewOnExplorer.tsx +23 -23
  99. package/src/components/WidgetWrapper.tsx +74 -74
  100. package/src/components/WrapperModal.tsx +54 -54
  101. package/src/components/buttons/TableActionButton.tsx +36 -36
  102. package/src/components/buttons/index.ts +1 -1
  103. package/src/components/humaModal/HumaModal.tsx +68 -68
  104. package/src/components/humaModal/HumaModalHeader.tsx +70 -70
  105. package/src/components/humaModal/index.tsx +2 -2
  106. package/src/components/icons/approve-lender.svg +58 -58
  107. package/src/components/icons/auto-payback.svg +139 -139
  108. package/src/components/icons/check-circle.svg +3 -3
  109. package/src/components/icons/check-green.svg +3 -3
  110. package/src/components/icons/check.svg +10 -10
  111. package/src/components/icons/donut.svg +904 -904
  112. package/src/components/icons/ellipse.svg +3 -3
  113. package/src/components/icons/huma-full.svg +22 -22
  114. package/src/components/icons/huma.svg +15 -15
  115. package/src/components/icons/index.tsx +93 -93
  116. package/src/components/icons/loader.svg +229 -229
  117. package/src/components/icons/metamask.svg +31 -31
  118. package/src/components/icons/polygon.svg +16 -16
  119. package/src/components/icons/receipt.svg +3 -3
  120. package/src/components/icons/separator.svg +3 -3
  121. package/src/components/icons/sorry.svg +17 -17
  122. package/src/components/icons/usdc.svg +5 -5
  123. package/src/components/icons/wallet-connect.svg +11 -11
  124. package/src/components/images/index.ts +3 -3
  125. package/src/cosmos/CreditLineBorrow.fixture.tsx +86 -86
  126. package/src/cosmos/CreditLinePayment.fixture.tsx +50 -50
  127. package/src/cosmos/InvoiceFactoringBorrow.fixture.tsx +111 -111
  128. package/src/cosmos/InvoiceFactoringPayment.fixture.tsx +67 -67
  129. package/src/cosmos/LendSupply.fixture.tsx +75 -75
  130. package/src/cosmos/LendWithdraw.fixture.tsx +43 -43
  131. package/src/cosmos/SDKTesting.fixture.tsx +616 -616
  132. package/src/cosmos/SuperfluidFactoringBorrow.fixture.tsx +15 -15
  133. package/src/cosmos/WalletWrapper.tsx +52 -52
  134. package/src/cosmos/abis/InvoiceNFT.json +644 -644
  135. package/src/cosmos/abis/ReceivableFactoringPool.json +1529 -1529
  136. package/src/cosmos/utils/env.ts +6 -6
  137. package/src/cosmos/utils/index.ts +169 -169
  138. package/src/fonts/Recoleta/Recoleta-Black.otf +0 -0
  139. package/src/fonts/Recoleta/Recoleta-Bold.otf +0 -0
  140. package/src/fonts/Recoleta/Recoleta-Light.otf +0 -0
  141. package/src/fonts/Recoleta/Recoleta-Medium.otf +0 -0
  142. package/src/fonts/Recoleta/Recoleta-Regular.otf +0 -0
  143. package/src/fonts/Recoleta/Recoleta-RegularDEMO.otf +0 -0
  144. package/src/fonts/Recoleta/Recoleta-SemiBold.otf +0 -0
  145. package/src/fonts/Recoleta/Recoleta-Thin.otf +0 -0
  146. package/src/hooks/useEA.ts +53 -53
  147. package/src/hooks/useElementDimensions.ts +30 -30
  148. package/src/hooks/useNotifi.ts +71 -71
  149. package/src/hooks/useRedux.ts +6 -6
  150. package/src/index.css +61 -61
  151. package/src/index.tsx +283 -283
  152. package/src/react-app-env.d.ts +1 -1
  153. package/src/reportWebVitals.ts +15 -15
  154. package/src/setupTests.ts +6 -6
  155. package/src/store/index.ts +27 -27
  156. package/src/store/widgets.reducers.ts +120 -120
  157. package/src/store/widgets.selectors.ts +3 -3
  158. package/src/store/widgets.store.ts +55 -55
  159. package/src/theme/breakpoints.ts +10 -10
  160. package/src/theme/components.ts +70 -70
  161. package/src/theme/coreThemeConstants.ts +29 -29
  162. package/src/theme/cssMixins.ts +92 -92
  163. package/src/theme/hooks/useGetSizes.ts +31 -31
  164. package/src/theme/index.ts +24 -24
  165. package/src/theme/palette.ts +150 -150
  166. package/src/theme/shape.ts +7 -7
  167. package/src/theme/theme.types.ts +80 -80
  168. package/src/theme/typography.ts +117 -117
  169. package/src/utilTypes.d.ts +30 -30
  170. package/src/utils/env.ts +10 -10
  171. package/tsconfig.build.json +7 -7
  172. package/tsconfig.json +32 -32
  173. package/webpack.cosmos.js +54 -54
  174. package/dist/assets/output-15e10f9f.css +0 -44
  175. package/dist/cjs/assets/output-15e10f9f.css +0 -44
  176. package/dist/cjs/index.cjs +0 -7742
  177. package/dist/cjs/index.cjs.map +0 -1
  178. package/dist/index.d.ts +0 -246
  179. package/dist/index.js +0 -7696
  180. package/dist/index.js.map +0 -1
@@ -1,88 +1,88 @@
1
- import {
2
- AccountStats,
3
- PoolInfoType,
4
- upScale,
5
- useFeeManager,
6
- } from '@huma-finance/shared'
7
- import React, { useCallback, useState } from 'react'
8
-
9
- import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
10
- import { setBorrowInfo } from '../../../store/widgets.reducers'
11
- import { selectWidgetState } from '../../../store/widgets.selectors'
12
- import { WIDGET_STEP } from '../../../store/widgets.store'
13
- import { ChooseAmountModal } from '../../ChooseAmountModal'
14
-
15
- type Props = {
16
- poolInfo: PoolInfoType
17
- accountStats: AccountStats
18
- }
19
-
20
- export function ChooseAmount({
21
- poolInfo,
22
- accountStats,
23
- }: Props): React.ReactElement | null {
24
- const dispatch = useAppDispatch()
25
- const { creditRecord } = accountStats
26
- const [chargedFees, setChargedFees] = useState(0)
27
- const [currentAmount, setCurrentAmount] = useState(0)
28
- const { approval } = useAppSelector(selectWidgetState)
29
- const { getFeesCharged } = useFeeManager(poolInfo.poolName, poolInfo.poolType)
30
- const [remainder, setRemainder] = useState<string | number | undefined>(
31
- approval!.receivable?.amountFormatted,
32
- )
33
-
34
- const getAvailableCreditLimit = () => {
35
- if (approval && creditRecord) {
36
- const principal = creditRecord.unbilledPrincipal
37
- .add(creditRecord.totalDue)
38
- .sub(creditRecord.feesAndInterestDue)
39
- .toNumber()
40
- return Number(approval.terms.creditLimitFormatted) - principal
41
- }
42
- return 0
43
- }
44
-
45
- const handleChangeAmount = useCallback(
46
- (newAmount: number) => {
47
- if (approval) {
48
- setCurrentAmount(newAmount)
49
- setChargedFees(getFeesCharged(newAmount))
50
- setRemainder(Number(approval.receivable!.amountFormatted) - newAmount)
51
- }
52
- },
53
- [approval, getFeesCharged],
54
- )
55
-
56
- const handleAction = useCallback(() => {
57
- dispatch(
58
- setBorrowInfo({
59
- borrowAmount: currentAmount,
60
- borrowAmountBN: upScale(currentAmount, approval?.token.decimal),
61
- chargedFees,
62
- remainder: Number(remainder!),
63
- nextStep: WIDGET_STEP.ConfirmTransfer,
64
- }),
65
- )
66
- }, [approval?.token.decimal, chargedFees, currentAmount, dispatch, remainder])
67
-
68
- if (!approval) {
69
- return null
70
- }
71
-
72
- return (
73
- <ChooseAmountModal
74
- title='Choose Amount'
75
- description1='Access up to 80% of your invoice value'
76
- description2='The remainder will be sent to your wallet when the invoice is paid'
77
- sliderMax={getAvailableCreditLimit()}
78
- currentAmount={currentAmount}
79
- tokenSymbol={approval.token.symbol}
80
- topLeft='Fees'
81
- topRight={`${chargedFees} ${approval.token.symbol}`}
82
- downLeft='Remainder'
83
- downRight={`${remainder} ${approval.token.symbol}`}
84
- handleChangeAmount={handleChangeAmount}
85
- handleAction={handleAction}
86
- />
87
- )
88
- }
1
+ import {
2
+ AccountStats,
3
+ PoolInfoType,
4
+ upScale,
5
+ useFeeManager,
6
+ } from '@huma-finance/shared'
7
+ import React, { useCallback, useState } from 'react'
8
+
9
+ import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
10
+ import { setBorrowInfo } from '../../../store/widgets.reducers'
11
+ import { selectWidgetState } from '../../../store/widgets.selectors'
12
+ import { WIDGET_STEP } from '../../../store/widgets.store'
13
+ import { ChooseAmountModal } from '../../ChooseAmountModal'
14
+
15
+ type Props = {
16
+ poolInfo: PoolInfoType
17
+ accountStats: AccountStats
18
+ }
19
+
20
+ export function ChooseAmount({
21
+ poolInfo,
22
+ accountStats,
23
+ }: Props): React.ReactElement | null {
24
+ const dispatch = useAppDispatch()
25
+ const { creditRecord } = accountStats
26
+ const [chargedFees, setChargedFees] = useState(0)
27
+ const [currentAmount, setCurrentAmount] = useState(0)
28
+ const { approval } = useAppSelector(selectWidgetState)
29
+ const { getFeesCharged } = useFeeManager(poolInfo.poolName, poolInfo.poolType)
30
+ const [remainder, setRemainder] = useState<string | number | undefined>(
31
+ approval!.receivable?.amountFormatted,
32
+ )
33
+
34
+ const getAvailableCreditLimit = () => {
35
+ if (approval && creditRecord) {
36
+ const principal = creditRecord.unbilledPrincipal
37
+ .add(creditRecord.totalDue)
38
+ .sub(creditRecord.feesAndInterestDue)
39
+ .toNumber()
40
+ return Number(approval.terms.creditLimitFormatted) - principal
41
+ }
42
+ return 0
43
+ }
44
+
45
+ const handleChangeAmount = useCallback(
46
+ (newAmount: number) => {
47
+ if (approval) {
48
+ setCurrentAmount(newAmount)
49
+ setChargedFees(getFeesCharged(newAmount))
50
+ setRemainder(Number(approval.receivable!.amountFormatted) - newAmount)
51
+ }
52
+ },
53
+ [approval, getFeesCharged],
54
+ )
55
+
56
+ const handleAction = useCallback(() => {
57
+ dispatch(
58
+ setBorrowInfo({
59
+ borrowAmount: currentAmount,
60
+ borrowAmountBN: upScale(currentAmount, approval?.token.decimal),
61
+ chargedFees,
62
+ remainder: Number(remainder!),
63
+ nextStep: WIDGET_STEP.ConfirmTransfer,
64
+ }),
65
+ )
66
+ }, [approval?.token.decimal, chargedFees, currentAmount, dispatch, remainder])
67
+
68
+ if (!approval) {
69
+ return null
70
+ }
71
+
72
+ return (
73
+ <ChooseAmountModal
74
+ title='Choose Amount'
75
+ description1='Access up to 80% of your invoice value'
76
+ description2='The remainder will be sent to your wallet when the invoice is paid'
77
+ sliderMax={getAvailableCreditLimit()}
78
+ currentAmount={currentAmount}
79
+ tokenSymbol={approval.token.symbol}
80
+ topLeft='Fees'
81
+ topRight={`${chargedFees} ${approval.token.symbol}`}
82
+ downLeft='Remainder'
83
+ downRight={`${remainder} ${approval.token.symbol}`}
84
+ handleChangeAmount={handleChangeAmount}
85
+ handleAction={handleAction}
86
+ />
87
+ )
88
+ }
@@ -1,37 +1,37 @@
1
- import { isEmpty } from '@huma-finance/shared'
2
- import React from 'react'
3
-
4
- import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
5
- import { setStep } from '../../../store/widgets.reducers'
6
- import { selectWidgetState } from '../../../store/widgets.selectors'
7
- import { WIDGET_STEP } from '../../../store/widgets.store'
8
- import { ConfirmTransferModal } from '../../ConfirmTransferModal'
9
-
10
- export function ConfirmTransfer(): React.ReactElement | null {
11
- const dispatch = useAppDispatch()
12
- const { borrowAmountNet, approval } = useAppSelector(selectWidgetState)
13
-
14
- const handleAction = () => {
15
- dispatch(setStep(WIDGET_STEP.ApproveNFT))
16
- }
17
-
18
- if (isEmpty(borrowAmountNet) || isEmpty(approval)) {
19
- return null
20
- }
21
-
22
- return (
23
- <ConfirmTransferModal
24
- title='Confirm transaction details'
25
- description={`Huma keeps your Invoice NFT as collateral until it's fully paid.`}
26
- items={[
27
- { leftText: 'Invoice NFT', rightText: 'Huma' },
28
- {
29
- leftText: `${borrowAmountNet!} ${approval?.token.symbol}`,
30
- rightText: 'You',
31
- },
32
- ]}
33
- actionText='APPROVE TRANSFER'
34
- handleAction={handleAction}
35
- />
36
- )
37
- }
1
+ import { isEmpty } from '@huma-finance/shared'
2
+ import React from 'react'
3
+
4
+ import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
5
+ import { setStep } from '../../../store/widgets.reducers'
6
+ import { selectWidgetState } from '../../../store/widgets.selectors'
7
+ import { WIDGET_STEP } from '../../../store/widgets.store'
8
+ import { ConfirmTransferModal } from '../../ConfirmTransferModal'
9
+
10
+ export function ConfirmTransfer(): React.ReactElement | null {
11
+ const dispatch = useAppDispatch()
12
+ const { borrowAmountNet, approval } = useAppSelector(selectWidgetState)
13
+
14
+ const handleAction = () => {
15
+ dispatch(setStep(WIDGET_STEP.ApproveNFT))
16
+ }
17
+
18
+ if (isEmpty(borrowAmountNet) || isEmpty(approval)) {
19
+ return null
20
+ }
21
+
22
+ return (
23
+ <ConfirmTransferModal
24
+ title='Confirm transaction details'
25
+ description={`Huma keeps your Invoice NFT as collateral until it's fully paid.`}
26
+ items={[
27
+ { leftText: 'Invoice NFT', rightText: 'Huma' },
28
+ {
29
+ leftText: `${borrowAmountNet!} ${approval?.token.symbol}`,
30
+ rightText: 'You',
31
+ },
32
+ ]}
33
+ actionText='APPROVE TRANSFER'
34
+ handleAction={handleAction}
35
+ />
36
+ )
37
+ }
@@ -1,55 +1,55 @@
1
- import { useWeb3React } from '@web3-react/core'
2
- import {
3
- PoolInfoType,
4
- sendTxAtom,
5
- txAtom,
6
- TxStateType,
7
- useInvoiceNFTContract,
8
- } from '@huma-finance/shared'
9
- import { useAtom } from 'jotai'
10
- import { useResetAtom } from 'jotai/utils'
11
- import React, { useEffect } from 'react'
12
-
13
- import { useAppDispatch } from '../../../hooks/useRedux'
14
- import { setStep } from '../../../store/widgets.reducers'
15
- import { WIDGET_STEP } from '../../../store/widgets.store'
16
- import { LoadingModal } from '../../LoadingModal'
17
- import { ViewOnExplorer } from '../../ViewOnExplorer'
18
-
19
- type Props = {
20
- poolInfo: PoolInfoType
21
- tokenId: string
22
- }
23
-
24
- export function ApproveNFT({ poolInfo, tokenId }: Props): React.ReactElement {
25
- const dispatch = useAppDispatch()
26
- const { provider } = useWeb3React()
27
- const [{ state, txHash }, send] = useAtom(sendTxAtom)
28
- const reset = useResetAtom(txAtom)
29
- const invoiceNFTContract = useInvoiceNFTContract(poolInfo.poolName)
30
-
31
- useEffect(() => {
32
- if (state === TxStateType.Success) {
33
- reset()
34
- dispatch(setStep(WIDGET_STEP.Transfer))
35
- }
36
- }, [dispatch, reset, state])
37
-
38
- useEffect(() => {
39
- send({
40
- contract: invoiceNFTContract!,
41
- method: 'approve',
42
- params: [poolInfo.pool, tokenId],
43
- provider,
44
- })
45
- }, [invoiceNFTContract, poolInfo.pool, provider, send, tokenId])
46
-
47
- return (
48
- <LoadingModal
49
- title='Approve Invoice Transfer'
50
- description='Waiting for approval confirmation...'
51
- >
52
- <ViewOnExplorer txHash={txHash} />
53
- </LoadingModal>
54
- )
55
- }
1
+ import { useWeb3React } from '@web3-react/core'
2
+ import {
3
+ PoolInfoType,
4
+ sendTxAtom,
5
+ txAtom,
6
+ TxStateType,
7
+ useInvoiceNFTContract,
8
+ } from '@huma-finance/shared'
9
+ import { useAtom } from 'jotai'
10
+ import { useResetAtom } from 'jotai/utils'
11
+ import React, { useEffect } from 'react'
12
+
13
+ import { useAppDispatch } from '../../../hooks/useRedux'
14
+ import { setStep } from '../../../store/widgets.reducers'
15
+ import { WIDGET_STEP } from '../../../store/widgets.store'
16
+ import { LoadingModal } from '../../LoadingModal'
17
+ import { ViewOnExplorer } from '../../ViewOnExplorer'
18
+
19
+ type Props = {
20
+ poolInfo: PoolInfoType
21
+ tokenId: string
22
+ }
23
+
24
+ export function ApproveNFT({ poolInfo, tokenId }: Props): React.ReactElement {
25
+ const dispatch = useAppDispatch()
26
+ const { provider } = useWeb3React()
27
+ const [{ state, txHash }, send] = useAtom(sendTxAtom)
28
+ const reset = useResetAtom(txAtom)
29
+ const invoiceNFTContract = useInvoiceNFTContract(poolInfo.poolName)
30
+
31
+ useEffect(() => {
32
+ if (state === TxStateType.Success) {
33
+ reset()
34
+ dispatch(setStep(WIDGET_STEP.Transfer))
35
+ }
36
+ }, [dispatch, reset, state])
37
+
38
+ useEffect(() => {
39
+ send({
40
+ contract: invoiceNFTContract!,
41
+ method: 'approve',
42
+ params: [poolInfo.pool, tokenId],
43
+ provider,
44
+ })
45
+ }, [invoiceNFTContract, poolInfo.pool, provider, send, tokenId])
46
+
47
+ return (
48
+ <LoadingModal
49
+ title='Approve Invoice Transfer'
50
+ description='Waiting for approval confirmation...'
51
+ >
52
+ <ViewOnExplorer txHash={txHash} />
53
+ </LoadingModal>
54
+ )
55
+ }
@@ -1,34 +1,34 @@
1
- import { PoolInfoType, toBigNumber, upScale } from '@huma-finance/shared'
2
- import React, { useCallback } from 'react'
3
-
4
- import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
5
- import { setStep } from '../../../store/widgets.reducers'
6
- import { selectWidgetState } from '../../../store/widgets.selectors'
7
- import { WIDGET_STEP } from '../../../store/widgets.store'
8
- import { TxSendModal } from '../../TxSendModal'
9
-
10
- type Props = {
11
- poolInfo: PoolInfoType
12
- tokenId: string
13
- }
14
-
15
- export function Transfer({ poolInfo, tokenId }: Props): React.ReactElement {
16
- const dispatch = useAppDispatch()
17
- const { decimals } = poolInfo.poolUnderlyingToken
18
- const { borrowAmount } = useAppSelector(selectWidgetState)
19
- const requestLoanBigNumber = toBigNumber(upScale(borrowAmount!, decimals))
20
-
21
- const handleSuccess = useCallback(() => {
22
- dispatch(setStep(WIDGET_STEP.Done))
23
- }, [dispatch])
24
-
25
- return (
26
- <TxSendModal
27
- poolInfo={poolInfo}
28
- title='Transfer Invoice and Money'
29
- method='drawdownWithReceivable'
30
- params={[requestLoanBigNumber, poolInfo.assetAddress, tokenId]}
31
- handleSuccess={handleSuccess}
32
- />
33
- )
34
- }
1
+ import { PoolInfoType, toBigNumber, upScale } from '@huma-finance/shared'
2
+ import React, { useCallback } from 'react'
3
+
4
+ import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
5
+ import { setStep } from '../../../store/widgets.reducers'
6
+ import { selectWidgetState } from '../../../store/widgets.selectors'
7
+ import { WIDGET_STEP } from '../../../store/widgets.store'
8
+ import { TxSendModal } from '../../TxSendModal'
9
+
10
+ type Props = {
11
+ poolInfo: PoolInfoType
12
+ tokenId: string
13
+ }
14
+
15
+ export function Transfer({ poolInfo, tokenId }: Props): React.ReactElement {
16
+ const dispatch = useAppDispatch()
17
+ const { decimals } = poolInfo.poolUnderlyingToken
18
+ const { borrowAmount } = useAppSelector(selectWidgetState)
19
+ const requestLoanBigNumber = toBigNumber(upScale(borrowAmount!, decimals))
20
+
21
+ const handleSuccess = useCallback(() => {
22
+ dispatch(setStep(WIDGET_STEP.Done))
23
+ }, [dispatch])
24
+
25
+ return (
26
+ <TxSendModal
27
+ poolInfo={poolInfo}
28
+ title='Transfer Invoice and Money'
29
+ method='drawdownWithReceivable'
30
+ params={[requestLoanBigNumber, poolInfo.assetAddress, tokenId]}
31
+ handleSuccess={handleSuccess}
32
+ />
33
+ )
34
+ }
@@ -1,20 +1,20 @@
1
- import React from 'react'
2
- import { useAppSelector } from '../../../hooks/useRedux'
3
- import { selectWidgetState } from '../../../store/widgets.selectors'
4
- import { TxDoneModal } from '../../TxDoneModal'
5
-
6
- type Props = {
7
- handleAction: () => void
8
- }
9
-
10
- export function Success({ handleAction }: Props): React.ReactElement {
11
- const { borrowAmountNet, remainder, approval } =
12
- useAppSelector(selectWidgetState)
13
-
14
- const content = [
15
- `${borrowAmountNet} ${approval?.token.symbol} is now in your wallet.`,
16
- `The remaining ${remainder} ${approval?.token.symbol} will be sent to your wallet when the invoice is paid.`,
17
- ]
18
-
19
- return <TxDoneModal handleAction={handleAction} content={content} />
20
- }
1
+ import React from 'react'
2
+ import { useAppSelector } from '../../../hooks/useRedux'
3
+ import { selectWidgetState } from '../../../store/widgets.selectors'
4
+ import { TxDoneModal } from '../../TxDoneModal'
5
+
6
+ type Props = {
7
+ handleAction: () => void
8
+ }
9
+
10
+ export function Success({ handleAction }: Props): React.ReactElement {
11
+ const { borrowAmountNet, remainder, approval } =
12
+ useAppSelector(selectWidgetState)
13
+
14
+ const content = [
15
+ `${borrowAmountNet} ${approval?.token.symbol} is now in your wallet.`,
16
+ `The remaining ${remainder} ${approval?.token.symbol} will be sent to your wallet when the invoice is paid.`,
17
+ ]
18
+
19
+ return <TxDoneModal handleAction={handleAction} content={content} />
20
+ }
@@ -1,94 +1,94 @@
1
- import { useWeb3React } from '@web3-react/core'
2
- import { BigNumber } from 'ethers'
3
- import {
4
- POOL_NAME,
5
- POOL_TYPE,
6
- useAccountStats,
7
- usePoolInfo,
8
- } from '@huma-finance/shared'
9
- import React, { useEffect } from 'react'
10
- import { useDispatch } from 'react-redux'
11
-
12
- import { useAppSelector } from '../../../hooks/useRedux'
13
- import { setStep } from '../../../store/widgets.reducers'
14
- import { selectWidgetState } from '../../../store/widgets.selectors'
15
- import { WIDGET_STEP } from '../../../store/widgets.store'
16
- import { ErrorModal } from '../../ErrorModal'
17
- import { WidgetWrapper } from '../../WidgetWrapper'
18
- import { Evaluation } from './1-Evaluation'
19
- import { ChooseAmount } from './2-ChooseAmount'
20
- import { ConfirmTransfer } from './3-ConfirmTransfer'
21
- import { ApproveNFT } from './4-ApproveNFT'
22
- import { Transfer } from './5-Transfer'
23
- import { Success } from './6-Success'
24
-
25
- /**
26
- * Invoice factoring pool borrow props
27
- * @typedef {Object} InvoiceFactoringBorrowProps
28
- * @property {POOL_NAME} poolName The name of the pool.
29
- * @property {POOL_TYPE} poolType The type of the pool.
30
- * @property {string|BigNumber} tokenId The NFT token id representing invoice.
31
- * @property {function():void} handleClose Function to notify to close the widget modal when user clicks the 'x' close button.
32
- * @property {function((number|undefined)):void|undefined} handleSuccess Optional function to notify that the invoice pool borrow action is successful.
33
- */
34
- export interface InvoiceFactoringBorrowProps {
35
- poolName: keyof typeof POOL_NAME
36
- poolType: keyof typeof POOL_TYPE
37
- tokenId: string | BigNumber
38
- handleClose: () => void
39
- handleSuccess?: (blockNumber?: number) => void
40
- }
41
-
42
- export function InvoiceFactoringBorrow({
43
- poolName: poolNameStr,
44
- poolType: poolTypeStr,
45
- tokenId,
46
- handleClose,
47
- handleSuccess,
48
- }: InvoiceFactoringBorrowProps): React.ReactElement | null {
49
- const dispatch = useDispatch()
50
- const { account } = useWeb3React()
51
- const poolName = POOL_NAME[poolNameStr]
52
- const poolType = POOL_TYPE[poolTypeStr]
53
- const poolInfo = usePoolInfo(poolName, poolType)
54
- const { step, errorMessage } = useAppSelector(selectWidgetState)
55
- const [accountStats] = useAccountStats(poolName, poolType, account)
56
-
57
- useEffect(() => {
58
- dispatch(setStep(WIDGET_STEP.Evaluation))
59
- }, [dispatch])
60
-
61
- if (!poolInfo) {
62
- return null
63
- }
64
-
65
- return (
66
- <WidgetWrapper
67
- isOpen
68
- handleClose={handleClose}
69
- handleSuccess={handleSuccess}
70
- >
71
- {step === WIDGET_STEP.Evaluation && (
72
- <Evaluation poolInfo={poolInfo} tokenId={tokenId.toString()} />
73
- )}
74
- {step === WIDGET_STEP.ChooseAmount && (
75
- <ChooseAmount poolInfo={poolInfo} accountStats={accountStats} />
76
- )}
77
- {step === WIDGET_STEP.ConfirmTransfer && <ConfirmTransfer />}
78
- {step === WIDGET_STEP.ApproveNFT && (
79
- <ApproveNFT poolInfo={poolInfo} tokenId={tokenId.toString()} />
80
- )}
81
- {step === WIDGET_STEP.Transfer && (
82
- <Transfer poolInfo={poolInfo} tokenId={tokenId.toString()} />
83
- )}
84
- {step === WIDGET_STEP.Done && <Success handleAction={handleClose} />}
85
- {step === WIDGET_STEP.Error && (
86
- <ErrorModal
87
- title='Invoice Factoring'
88
- errorMessage={errorMessage}
89
- handleOk={handleClose}
90
- />
91
- )}
92
- </WidgetWrapper>
93
- )
94
- }
1
+ import { useWeb3React } from '@web3-react/core'
2
+ import { BigNumber } from 'ethers'
3
+ import {
4
+ POOL_NAME,
5
+ POOL_TYPE,
6
+ useAccountStats,
7
+ usePoolInfo,
8
+ } from '@huma-finance/shared'
9
+ import React, { useEffect } from 'react'
10
+ import { useDispatch } from 'react-redux'
11
+
12
+ import { useAppSelector } from '../../../hooks/useRedux'
13
+ import { setStep } from '../../../store/widgets.reducers'
14
+ import { selectWidgetState } from '../../../store/widgets.selectors'
15
+ import { WIDGET_STEP } from '../../../store/widgets.store'
16
+ import { ErrorModal } from '../../ErrorModal'
17
+ import { WidgetWrapper } from '../../WidgetWrapper'
18
+ import { Evaluation } from './1-Evaluation'
19
+ import { ChooseAmount } from './2-ChooseAmount'
20
+ import { ConfirmTransfer } from './3-ConfirmTransfer'
21
+ import { ApproveNFT } from './4-ApproveNFT'
22
+ import { Transfer } from './5-Transfer'
23
+ import { Success } from './6-Success'
24
+
25
+ /**
26
+ * Invoice factoring pool borrow props
27
+ * @typedef {Object} InvoiceFactoringBorrowProps
28
+ * @property {POOL_NAME} poolName The name of the pool.
29
+ * @property {POOL_TYPE} poolType The type of the pool.
30
+ * @property {string|BigNumber} tokenId The NFT token id representing invoice.
31
+ * @property {function():void} handleClose Function to notify to close the widget modal when user clicks the 'x' close button.
32
+ * @property {function((number|undefined)):void|undefined} handleSuccess Optional function to notify that the invoice pool borrow action is successful.
33
+ */
34
+ export interface InvoiceFactoringBorrowProps {
35
+ poolName: keyof typeof POOL_NAME
36
+ poolType: keyof typeof POOL_TYPE
37
+ tokenId: string | BigNumber
38
+ handleClose: () => void
39
+ handleSuccess?: (blockNumber?: number) => void
40
+ }
41
+
42
+ export function InvoiceFactoringBorrow({
43
+ poolName: poolNameStr,
44
+ poolType: poolTypeStr,
45
+ tokenId,
46
+ handleClose,
47
+ handleSuccess,
48
+ }: InvoiceFactoringBorrowProps): React.ReactElement | null {
49
+ const dispatch = useDispatch()
50
+ const { account } = useWeb3React()
51
+ const poolName = POOL_NAME[poolNameStr]
52
+ const poolType = POOL_TYPE[poolTypeStr]
53
+ const poolInfo = usePoolInfo(poolName, poolType)
54
+ const { step, errorMessage } = useAppSelector(selectWidgetState)
55
+ const [accountStats] = useAccountStats(poolName, poolType, account)
56
+
57
+ useEffect(() => {
58
+ dispatch(setStep(WIDGET_STEP.Evaluation))
59
+ }, [dispatch])
60
+
61
+ if (!poolInfo) {
62
+ return null
63
+ }
64
+
65
+ return (
66
+ <WidgetWrapper
67
+ isOpen
68
+ handleClose={handleClose}
69
+ handleSuccess={handleSuccess}
70
+ >
71
+ {step === WIDGET_STEP.Evaluation && (
72
+ <Evaluation poolInfo={poolInfo} tokenId={tokenId.toString()} />
73
+ )}
74
+ {step === WIDGET_STEP.ChooseAmount && (
75
+ <ChooseAmount poolInfo={poolInfo} accountStats={accountStats} />
76
+ )}
77
+ {step === WIDGET_STEP.ConfirmTransfer && <ConfirmTransfer />}
78
+ {step === WIDGET_STEP.ApproveNFT && (
79
+ <ApproveNFT poolInfo={poolInfo} tokenId={tokenId.toString()} />
80
+ )}
81
+ {step === WIDGET_STEP.Transfer && (
82
+ <Transfer poolInfo={poolInfo} tokenId={tokenId.toString()} />
83
+ )}
84
+ {step === WIDGET_STEP.Done && <Success handleAction={handleClose} />}
85
+ {step === WIDGET_STEP.Error && (
86
+ <ErrorModal
87
+ title='Invoice Factoring'
88
+ errorMessage={errorMessage}
89
+ handleOk={handleClose}
90
+ />
91
+ )}
92
+ </WidgetWrapper>
93
+ )
94
+ }