@huma-finance/widgets 0.0.36 → 0.0.37

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 (178) 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 +332 -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/dist/cjs/index.cjs +134 -134
  19. package/dist/cjs/index.cjs.map +1 -1
  20. package/dist/index.d.ts +223 -223
  21. package/dist/index.js +134 -134
  22. package/dist/index.js.map +1 -1
  23. package/jsdoc2md.json +20 -20
  24. package/package.json +4 -4
  25. package/public/index.html +40 -40
  26. package/public/manifest.json +25 -25
  27. package/public/robots.txt +3 -3
  28. package/rollup.config.js +81 -81
  29. package/src/components/Activity.tsx +128 -128
  30. package/src/components/ApolloWrapper.tsx +15 -15
  31. package/src/components/ApproveAllowanceModal.tsx +138 -138
  32. package/src/components/BottomButton.tsx +33 -33
  33. package/src/components/ChainNotSupportedModal.tsx +33 -33
  34. package/src/components/ChooseAmountModal.tsx +322 -322
  35. package/src/components/ConfirmTransferModal.tsx +153 -153
  36. package/src/components/CreditLine/approve/1-ApproveAllowance.tsx +34 -34
  37. package/src/components/CreditLine/approve/2-Success.tsx +43 -43
  38. package/src/components/CreditLine/approve/index.tsx +85 -85
  39. package/src/components/CreditLine/borrow/1-Evaluation.tsx +157 -157
  40. package/src/components/CreditLine/borrow/2-ChooseAmount.tsx +74 -74
  41. package/src/components/CreditLine/borrow/3-ApproveAllowance.tsx +29 -29
  42. package/src/components/CreditLine/borrow/4-Transfer.tsx +34 -34
  43. package/src/components/CreditLine/borrow/5-Success.tsx +38 -38
  44. package/src/components/CreditLine/borrow/6-Notifications.tsx +10 -10
  45. package/src/components/CreditLine/borrow/index.tsx +136 -136
  46. package/src/components/CreditLine/payment/1-ChooseAmount.tsx +67 -67
  47. package/src/components/CreditLine/payment/2-ApproveAllowance.tsx +23 -23
  48. package/src/components/CreditLine/payment/3-Transfer.tsx +34 -34
  49. package/src/components/CreditLine/payment/4-Success.tsx +39 -39
  50. package/src/components/CreditLine/payment/index.tsx +94 -94
  51. package/src/components/ErrorModal.tsx +136 -136
  52. package/src/components/Factoring/FactoredList.tsx +143 -143
  53. package/src/components/Factoring/UpcomingList.tsx +90 -90
  54. package/src/components/Factoring/index.ts +2 -2
  55. package/src/components/HumaLoading.tsx +68 -68
  56. package/src/components/HumaSnackBar.tsx +60 -60
  57. package/src/components/HumaTable.tsx +203 -203
  58. package/src/components/InvoiceFactoring/borrow/1-Evaluation.tsx +49 -49
  59. package/src/components/InvoiceFactoring/borrow/2-ChooseAmount.tsx +88 -88
  60. package/src/components/InvoiceFactoring/borrow/3-ConfirmTransfer.tsx +37 -37
  61. package/src/components/InvoiceFactoring/borrow/4-ApproveNFT.tsx +55 -55
  62. package/src/components/InvoiceFactoring/borrow/5-Transfer.tsx +34 -34
  63. package/src/components/InvoiceFactoring/borrow/6-Success.tsx +20 -20
  64. package/src/components/InvoiceFactoring/borrow/index.tsx +94 -94
  65. package/src/components/InvoiceFactoring/payment/1-ChooseAmount.tsx +67 -67
  66. package/src/components/InvoiceFactoring/payment/2-ApproveAllowance.tsx +23 -23
  67. package/src/components/InvoiceFactoring/payment/3-Transfer.tsx +34 -34
  68. package/src/components/InvoiceFactoring/payment/4-Success.tsx +23 -23
  69. package/src/components/InvoiceFactoring/payment/index.tsx +86 -86
  70. package/src/components/Lend/supply/1-Evaluation/EvaluationEA.tsx +90 -90
  71. package/src/components/Lend/supply/1-Evaluation/EvaluationKYC.tsx +319 -319
  72. package/src/components/Lend/supply/1-Evaluation/index.tsx +31 -31
  73. package/src/components/Lend/supply/2-ChooseAmount.tsx +69 -69
  74. package/src/components/Lend/supply/3-ApproveAllowance.tsx +25 -25
  75. package/src/components/Lend/supply/4-Transfer.tsx +32 -32
  76. package/src/components/Lend/supply/5-Success.tsx +60 -60
  77. package/src/components/Lend/supply/6-Notifications.tsx +10 -10
  78. package/src/components/Lend/supply/index.tsx +167 -167
  79. package/src/components/Lend/withdraw/1-CheckWithdrawble.tsx +73 -73
  80. package/src/components/Lend/withdraw/2-ChooseAmount.tsx +50 -50
  81. package/src/components/Lend/withdraw/3-Transfer.tsx +32 -32
  82. package/src/components/Lend/withdraw/4-Success.tsx +49 -49
  83. package/src/components/Lend/withdraw/index.tsx +101 -101
  84. package/src/components/LoadingModal.tsx +49 -49
  85. package/src/components/Notifi/NotifiSubscriptionModal.tsx +268 -268
  86. package/src/components/StreamFactoring/borrow/1-Evaluation.tsx +55 -55
  87. package/src/components/StreamFactoring/borrow/2-ChooseAmount.tsx +127 -127
  88. package/src/components/StreamFactoring/borrow/3-ConfirmTransfer.tsx +42 -42
  89. package/src/components/StreamFactoring/borrow/4-ApproveAllowance.tsx +33 -33
  90. package/src/components/StreamFactoring/borrow/5-Permit.tsx +144 -144
  91. package/src/components/StreamFactoring/borrow/6-Transfer.tsx +37 -37
  92. package/src/components/StreamFactoring/borrow/7-Success.tsx +20 -20
  93. package/src/components/StreamFactoring/borrow/index.tsx +94 -94
  94. package/src/components/StreamFactoring/payment/ChooseAmount.tsx +54 -54
  95. package/src/components/StreamFactoring/payment/Success.tsx +23 -23
  96. package/src/components/StreamFactoring/payment/Transfer.tsx +34 -34
  97. package/src/components/StreamFactoring/payment/index.tsx +66 -66
  98. package/src/components/SuperfluidFactoring/SuperfluidFactoredList.tsx +69 -69
  99. package/src/components/SuperfluidFactoring/SuperfluidUpcomingList.tsx +166 -166
  100. package/src/components/SuperfluidFactoring/index.tsx +85 -85
  101. package/src/components/TxDoneModal.tsx +85 -85
  102. package/src/components/TxSendModal.tsx +59 -59
  103. package/src/components/ViewOnExplorer.tsx +23 -23
  104. package/src/components/WidgetWrapper.tsx +74 -74
  105. package/src/components/WrapperModal.tsx +54 -54
  106. package/src/components/buttons/TableActionButton.tsx +36 -36
  107. package/src/components/buttons/index.ts +1 -1
  108. package/src/components/humaModal/HumaModal.tsx +68 -68
  109. package/src/components/humaModal/HumaModalHeader.tsx +70 -70
  110. package/src/components/humaModal/index.tsx +2 -2
  111. package/src/components/icons/approve-lender.svg +58 -58
  112. package/src/components/icons/auto-payback.svg +139 -139
  113. package/src/components/icons/check-circle.svg +3 -3
  114. package/src/components/icons/check-green.svg +3 -3
  115. package/src/components/icons/check.svg +10 -10
  116. package/src/components/icons/donut.svg +904 -904
  117. package/src/components/icons/ellipse.svg +3 -3
  118. package/src/components/icons/huma-full.svg +22 -22
  119. package/src/components/icons/huma.svg +15 -15
  120. package/src/components/icons/index.tsx +93 -93
  121. package/src/components/icons/loader.svg +229 -229
  122. package/src/components/icons/metamask.svg +31 -31
  123. package/src/components/icons/polygon.svg +16 -16
  124. package/src/components/icons/receipt.svg +3 -3
  125. package/src/components/icons/separator.svg +3 -3
  126. package/src/components/icons/sorry.svg +17 -17
  127. package/src/components/icons/usdc.svg +5 -5
  128. package/src/components/icons/wallet-connect.svg +11 -11
  129. package/src/components/images/index.ts +3 -3
  130. package/src/cosmos/CreditLineBorrow.fixture.tsx +86 -86
  131. package/src/cosmos/CreditLinePayment.fixture.tsx +50 -50
  132. package/src/cosmos/InvoiceFactoringBorrow.fixture.tsx +111 -111
  133. package/src/cosmos/InvoiceFactoringPayment.fixture.tsx +67 -67
  134. package/src/cosmos/LendSupply.fixture.tsx +75 -75
  135. package/src/cosmos/LendWithdraw.fixture.tsx +43 -43
  136. package/src/cosmos/SDKTesting.fixture.tsx +616 -616
  137. package/src/cosmos/SuperfluidFactoringBorrow.fixture.tsx +15 -15
  138. package/src/cosmos/WalletWrapper.tsx +52 -52
  139. package/src/cosmos/abis/InvoiceNFT.json +644 -644
  140. package/src/cosmos/abis/ReceivableFactoringPool.json +1529 -1529
  141. package/src/cosmos/utils/env.ts +6 -6
  142. package/src/cosmos/utils/index.ts +169 -169
  143. package/src/fonts/Recoleta/Recoleta-Black.otf +0 -0
  144. package/src/fonts/Recoleta/Recoleta-Bold.otf +0 -0
  145. package/src/fonts/Recoleta/Recoleta-Light.otf +0 -0
  146. package/src/fonts/Recoleta/Recoleta-Medium.otf +0 -0
  147. package/src/fonts/Recoleta/Recoleta-Regular.otf +0 -0
  148. package/src/fonts/Recoleta/Recoleta-RegularDEMO.otf +0 -0
  149. package/src/fonts/Recoleta/Recoleta-SemiBold.otf +0 -0
  150. package/src/fonts/Recoleta/Recoleta-Thin.otf +0 -0
  151. package/src/hooks/useEA.ts +53 -53
  152. package/src/hooks/useElementDimensions.ts +30 -30
  153. package/src/hooks/useNotifi.ts +71 -71
  154. package/src/hooks/useRedux.ts +6 -6
  155. package/src/index.css +61 -61
  156. package/src/index.tsx +283 -283
  157. package/src/react-app-env.d.ts +1 -1
  158. package/src/reportWebVitals.ts +15 -15
  159. package/src/setupTests.ts +6 -6
  160. package/src/store/index.ts +27 -27
  161. package/src/store/widgets.reducers.ts +120 -120
  162. package/src/store/widgets.selectors.ts +3 -3
  163. package/src/store/widgets.store.ts +55 -55
  164. package/src/theme/breakpoints.ts +10 -10
  165. package/src/theme/components.ts +70 -70
  166. package/src/theme/coreThemeConstants.ts +29 -29
  167. package/src/theme/cssMixins.ts +92 -92
  168. package/src/theme/hooks/useGetSizes.ts +31 -31
  169. package/src/theme/index.ts +24 -24
  170. package/src/theme/palette.ts +150 -150
  171. package/src/theme/shape.ts +7 -7
  172. package/src/theme/theme.types.ts +80 -80
  173. package/src/theme/typography.ts +117 -117
  174. package/src/utilTypes.d.ts +30 -30
  175. package/src/utils/env.ts +10 -10
  176. package/tsconfig.build.json +7 -7
  177. package/tsconfig.json +32 -32
  178. package/webpack.cosmos.js +54 -54
@@ -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
+ }