@huma-finance/widgets 0.0.48-beta.294 → 0.0.48-beta.297

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huma-finance/widgets",
3
- "version": "0.0.48-beta.294+d5d9666",
3
+ "version": "0.0.48-beta.297+48b8509",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -30,8 +30,8 @@
30
30
  "@ethersproject/experimental": "^5.7.0",
31
31
  "@ethersproject/providers": "^5.6.0",
32
32
  "@ethersproject/units": "^5.6.0",
33
- "@huma-finance/sdk": "^0.0.48-beta.294+d5d9666",
34
- "@huma-finance/shared": "^0.0.48-beta.294+d5d9666",
33
+ "@huma-finance/sdk": "^0.0.48-beta.297+48b8509",
34
+ "@huma-finance/shared": "^0.0.48-beta.297+48b8509",
35
35
  "@mui/icons-material": "^5.3.0",
36
36
  "@mui/material": "^5.0.6",
37
37
  "@mui/styles": "^5.0.2",
@@ -193,5 +193,5 @@
193
193
  "optionalDependencies": {
194
194
  "encoding": "^0.1.13"
195
195
  },
196
- "gitHead": "d5d9666b16f7dae5d12bebac6124c5fd1f6772a3"
196
+ "gitHead": "48b8509c9aa8f1d267f77ab0982400b136e027d4"
197
197
  }
@@ -10,6 +10,7 @@ type Props = {
10
10
  subTitle: string
11
11
  actionText: string
12
12
  tokenSymbol: string
13
+ suffix?: string
13
14
  currentAmount: number | string
14
15
  maxAmount: number | string
15
16
  maxAmountText?: string
@@ -23,6 +24,7 @@ export function InputAmountModal({
23
24
  subTitle,
24
25
  actionText,
25
26
  tokenSymbol,
27
+ suffix: defaultSuffix,
26
28
  currentAmount,
27
29
  maxAmount,
28
30
  maxAmountText = 'MAX',
@@ -32,7 +34,7 @@ export function InputAmountModal({
32
34
  }: Props): React.ReactElement | null {
33
35
  const theme = useTheme()
34
36
  const [inputTouched, setInputTouched] = useState(false)
35
- const suffix = ` ${tokenSymbol}`
37
+ const suffix = ` ${defaultSuffix ?? tokenSymbol}`
36
38
 
37
39
  const styles = {
38
40
  inputAmountWrapper: css`
@@ -0,0 +1,114 @@
1
+ import { TrancheType } from '@huma-finance/shared'
2
+ import {
3
+ css,
4
+ FormControl,
5
+ FormControlLabel,
6
+ FormLabel,
7
+ Radio,
8
+ RadioGroup,
9
+ useTheme,
10
+ } from '@mui/material'
11
+ import React 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 { BottomButton } from '../../BottomButton'
17
+ import { WrapperModal } from '../../WrapperModal'
18
+
19
+ type Props = {
20
+ selectedTranche: TrancheType | undefined
21
+ changeTranche: (tranche: TrancheType) => void
22
+ }
23
+
24
+ export function ChooseTranche({
25
+ selectedTranche,
26
+ changeTranche,
27
+ }: Props): React.ReactElement | null {
28
+ const theme = useTheme()
29
+ const dispatch = useAppDispatch()
30
+
31
+ const styles = {
32
+ subTitle: css`
33
+ color: ${theme.palette.text.primary} !important;
34
+ font-family: 'Uni-Neue-Regular';
35
+ font-size: 16px;
36
+ line-height: 150%;
37
+ letter-spacing: 0.15px;
38
+ margin-top: ${theme.spacing(5)};
39
+ margin-left: ${theme.spacing(2)};
40
+ `,
41
+ radioGroup: css`
42
+ margin-left: ${theme.spacing(3)};
43
+ margin-top: ${theme.spacing(3)};
44
+ `,
45
+ formControl: css`
46
+ margin-bottom: ${theme.spacing(1)};
47
+
48
+ .MuiFormControlLabel-label {
49
+ color: ${theme.palette.text.primary};
50
+ font-family: 'Uni-Neue-Regular';
51
+ font-size: 16px;
52
+ line-height: 150%;
53
+ letter-spacing: 0.15px;
54
+ }
55
+ `,
56
+ }
57
+
58
+ const handleNext = () => {
59
+ dispatch(setStep(WIDGET_STEP.ChooseAmount))
60
+ }
61
+
62
+ const items: {
63
+ label: string
64
+ value: TrancheType
65
+ }[] = [
66
+ {
67
+ label: 'Senior',
68
+ value: 'senior',
69
+ },
70
+ {
71
+ label: 'Junior',
72
+ value: 'junior',
73
+ },
74
+ ]
75
+
76
+ return (
77
+ <WrapperModal title='Redemption'>
78
+ <FormControl>
79
+ <FormLabel css={styles.subTitle}>Select Tranche Type</FormLabel>
80
+ <RadioGroup
81
+ aria-labelledby='buttons-group-label'
82
+ name='radio-buttons-group'
83
+ css={styles.radioGroup}
84
+ onChange={(e) => changeTranche(e.target.value as TrancheType)}
85
+ >
86
+ {items.map((item) => (
87
+ <FormControlLabel
88
+ key={item.label}
89
+ value={item.value}
90
+ control={
91
+ <Radio
92
+ sx={{
93
+ '& .MuiSvgIcon-root': {
94
+ fontSize: 24,
95
+ },
96
+ }}
97
+ />
98
+ }
99
+ label={item.label}
100
+ css={styles.formControl}
101
+ />
102
+ ))}
103
+ </RadioGroup>
104
+ </FormControl>
105
+ <BottomButton
106
+ variant='contained'
107
+ disabled={!selectedTranche}
108
+ onClick={handleNext}
109
+ >
110
+ NEXT
111
+ </BottomButton>
112
+ </WrapperModal>
113
+ )
114
+ }
@@ -0,0 +1,61 @@
1
+ import { formatNumber, UnderlyingTokenInfo } from '@huma-finance/shared'
2
+ import { ethers } from 'ethers'
3
+ import React, { useState } from 'react'
4
+
5
+ import { TrancheInfo } from '.'
6
+ import { useAppDispatch } from '../../../hooks/useRedux'
7
+ import {
8
+ setRedeemAmount,
9
+ setRedeemShares,
10
+ setStep,
11
+ } from '../../../store/widgets.reducers'
12
+ import { WIDGET_STEP } from '../../../store/widgets.store'
13
+ import { InputAmountModal } from '../../InputAmountModal'
14
+
15
+ type Props = {
16
+ poolUnderlyingToken: UnderlyingTokenInfo
17
+ trancheInfo: TrancheInfo
18
+ }
19
+
20
+ export function ChooseAmount({
21
+ poolUnderlyingToken,
22
+ trancheInfo,
23
+ }: Props): React.ReactElement | null {
24
+ const dispatch = useAppDispatch()
25
+ const { symbol } = poolUnderlyingToken
26
+ const [currentAmount, setCurrentAmount] = useState<number>(0)
27
+ const [currentShares, setCurrentShares] = useState<number>(0)
28
+ const maxSharesFormatted = ethers.utils.formatUnits(
29
+ trancheInfo.shares,
30
+ poolUnderlyingToken.decimals,
31
+ )
32
+ const sharePrice =
33
+ trancheInfo.assets.toNumber() / trancheInfo.shares.toNumber()
34
+
35
+ const handleChangeShares = (newShares: number) => {
36
+ const amount = Number(newShares) * sharePrice
37
+ setCurrentShares(Number(newShares))
38
+ setCurrentAmount(amount)
39
+ dispatch(setRedeemShares(Number(newShares)))
40
+ dispatch(setRedeemAmount(amount))
41
+ }
42
+
43
+ const handleAction = () => {
44
+ dispatch(setStep(WIDGET_STEP.Transfer))
45
+ }
46
+
47
+ return (
48
+ <InputAmountModal
49
+ title='Redemption'
50
+ subTitle={`Enter number of shares to redeem from ${trancheInfo.tranche} tranche`}
51
+ tokenSymbol={symbol}
52
+ currentAmount={currentShares}
53
+ handleChangeAmount={handleChangeShares}
54
+ maxAmount={maxSharesFormatted}
55
+ info={`${String(formatNumber(currentAmount))} ${symbol}`}
56
+ suffix='Shares'
57
+ handleAction={handleAction}
58
+ actionText='REQUEST'
59
+ />
60
+ )
61
+ }
@@ -4,10 +4,10 @@ import {
4
4
  useTrancheVaultContractV2,
5
5
  } from '@huma-finance/shared'
6
6
  import { useWeb3React } from '@web3-react/core'
7
+ import { ethers } from 'ethers'
7
8
  import React, { useCallback } from 'react'
8
9
 
9
- import { ethers } from 'ethers'
10
- import { REDEMPTION_TYPE, RedemptionActionInfo } from '.'
10
+ import { TrancheInfo } from '.'
11
11
  import { useAppDispatch, useAppSelector } from '../../../hooks/useRedux'
12
12
  import { setStep } from '../../../store/widgets.reducers'
13
13
  import { selectWidgetState } from '../../../store/widgets.selectors'
@@ -17,43 +17,38 @@ import { TxSendModalV2 } from '../../TxSendModalV2'
17
17
  type Props = {
18
18
  poolInfo: PoolInfoV2
19
19
  poolUnderlyingToken: UnderlyingTokenInfo
20
- redemptionType: REDEMPTION_TYPE
20
+ trancheInfo: TrancheInfo
21
21
  }
22
22
 
23
23
  export function Transfer({
24
24
  poolInfo,
25
25
  poolUnderlyingToken,
26
- redemptionType,
26
+ trancheInfo,
27
27
  }: Props): React.ReactElement | null {
28
28
  const dispatch = useAppDispatch()
29
29
  const { decimals } = poolUnderlyingToken
30
30
  const { account, provider } = useWeb3React()
31
31
  const { redeemShares } = useAppSelector(selectWidgetState)
32
- const redemptionActionInfo = RedemptionActionInfo[redemptionType]
33
32
  const trancheVaultContract = useTrancheVaultContractV2(
34
33
  poolInfo.poolName,
35
- redemptionActionInfo.tranche,
34
+ trancheInfo.tranche,
36
35
  provider,
37
36
  account,
38
37
  )
39
38
  const redeemSharesBN = ethers.utils.parseUnits(String(redeemShares), decimals)
40
- const method =
41
- redemptionActionInfo.action === 'Create'
42
- ? 'addRedemptionRequest'
43
- : 'cancelRedemptionRequest'
44
39
 
45
40
  const handleSuccess = useCallback(() => {
46
41
  dispatch(setStep(WIDGET_STEP.Done))
47
42
  }, [dispatch])
48
43
 
49
- if (!trancheVaultContract || !account) {
44
+ if (!trancheVaultContract) {
50
45
  return null
51
46
  }
52
47
 
53
48
  return (
54
49
  <TxSendModalV2
55
50
  contract={trancheVaultContract}
56
- method={method}
51
+ method='addRedemptionRequest'
57
52
  params={[redeemSharesBN]}
58
53
  handleSuccess={handleSuccess}
59
54
  />
@@ -0,0 +1,20 @@
1
+ import { formatNumber } from '@huma-finance/shared'
2
+ import React from 'react'
3
+
4
+ import { useAppSelector } from '../../../hooks/useRedux'
5
+ import { selectWidgetState } from '../../../store/widgets.selectors'
6
+ import { TxDoneModal } from '../../TxDoneModal'
7
+
8
+ type Props = {
9
+ handleAction: () => void
10
+ }
11
+
12
+ export function Done({ handleAction }: Props): React.ReactElement {
13
+ const { redeemShares } = useAppSelector(selectWidgetState)
14
+
15
+ const content = [
16
+ `${formatNumber(redeemShares)} shares requested for redemption`,
17
+ ]
18
+
19
+ return <TxDoneModal handleAction={handleAction} content={content} />
20
+ }
@@ -0,0 +1,172 @@
1
+ import {
2
+ getTrancheAssetsAndShares,
3
+ POOL_NAME,
4
+ TrancheType,
5
+ usePoolInfoV2,
6
+ usePoolUnderlyingTokenInfoV2,
7
+ } from '@huma-finance/shared'
8
+ import { useWeb3React } from '@web3-react/core'
9
+ import { BigNumber } from 'ethers'
10
+ import React, { useCallback, useEffect, useState } from 'react'
11
+ import { useDispatch } from 'react-redux'
12
+
13
+ import { useAppSelector } from '../../../hooks/useRedux'
14
+ import { setStep } from '../../../store/widgets.reducers'
15
+ import { selectWidgetState } from '../../../store/widgets.selectors'
16
+ import { WIDGET_STEP } from '../../../store/widgets.store'
17
+ import { ErrorModal } from '../../ErrorModal'
18
+ import { WidgetWrapper } from '../../WidgetWrapper'
19
+ import { ChooseTranche } from './1-ChooseTranche'
20
+ import { ChooseAmount } from './2-ChooseAmount'
21
+ import { Transfer } from './3-Transfer'
22
+ import { Done } from './4-Done'
23
+
24
+ export type TrancheInfo = {
25
+ tranche: TrancheType
26
+ assets: BigNumber
27
+ shares: BigNumber
28
+ }
29
+
30
+ /**
31
+ * Lend pool add redemption props
32
+ * @typedef {Object} AddRedemptionPropsV2
33
+ * @property {POOL_NAME} poolName The name of the pool.
34
+ * @property {function():void} handleClose Function to notify to close the widget modal when user clicks the 'x' close button.
35
+ * @property {function((number|undefined)):void|undefined} handleSuccess Optional function to notify that the lending pool withdraw action is successful.
36
+ */
37
+ export type AddRedemptionPropsV2 = {
38
+ poolName: keyof typeof POOL_NAME
39
+ handleClose: () => void
40
+ handleSuccess?: (blockNumber?: number) => void
41
+ }
42
+
43
+ export function AddRedemptionV2({
44
+ poolName: poolNameStr,
45
+ handleClose,
46
+ handleSuccess,
47
+ }: AddRedemptionPropsV2): React.ReactElement | null {
48
+ const title = 'Redemption'
49
+ const dispatch = useDispatch()
50
+ const { account, chainId, provider } = useWeb3React()
51
+ const poolName = POOL_NAME[poolNameStr]
52
+ const poolInfo = usePoolInfoV2(poolName, chainId)
53
+ const { step, errorMessage, errorReason } = useAppSelector(selectWidgetState)
54
+ const poolUnderlyingToken = usePoolUnderlyingTokenInfoV2(poolName, provider)
55
+ const [seniorTrancheInfo, setSeniorTrancheInfo] = useState<TrancheInfo>()
56
+ const [juniorTrancheInfo, setJuniorTrancheInfo] = useState<TrancheInfo>()
57
+ const [trancheInfo, setTrancheInfo] = useState<TrancheInfo>()
58
+ const trancheInfoFetched = seniorTrancheInfo && juniorTrancheInfo
59
+
60
+ useEffect(() => {
61
+ if (account) {
62
+ getTrancheAssetsAndShares(poolName, 'senior', account, provider).then(
63
+ (info) => {
64
+ if (info) {
65
+ setSeniorTrancheInfo({ ...info, tranche: 'senior' })
66
+ }
67
+ },
68
+ )
69
+ getTrancheAssetsAndShares(poolName, 'junior', account, provider).then(
70
+ (info) => {
71
+ if (info) {
72
+ setJuniorTrancheInfo({ ...info, tranche: 'junior' })
73
+ }
74
+ },
75
+ )
76
+ }
77
+ }, [account, poolName, provider])
78
+
79
+ useEffect(() => {
80
+ if (!step && trancheInfoFetched) {
81
+ if (juniorTrancheInfo.assets.gt(0) && seniorTrancheInfo.assets.lte(0)) {
82
+ setTrancheInfo(juniorTrancheInfo)
83
+ dispatch(setStep(WIDGET_STEP.ChooseAmount))
84
+ return
85
+ }
86
+
87
+ if (seniorTrancheInfo.assets.gt(0) && juniorTrancheInfo.assets.lte(0)) {
88
+ setTrancheInfo(seniorTrancheInfo)
89
+ dispatch(setStep(WIDGET_STEP.ChooseAmount))
90
+ return
91
+ }
92
+
93
+ if (juniorTrancheInfo.assets.gt(0) && seniorTrancheInfo.assets.gt(0)) {
94
+ dispatch(setStep(WIDGET_STEP.ChooseTranche))
95
+ }
96
+ }
97
+ }, [dispatch, juniorTrancheInfo, seniorTrancheInfo, step, trancheInfoFetched])
98
+
99
+ const handleRedeemSuccess = useCallback(
100
+ (blockNumber: number) => {
101
+ if (handleSuccess) {
102
+ handleSuccess(blockNumber)
103
+ }
104
+ },
105
+ [handleSuccess],
106
+ )
107
+
108
+ const handleChangeTranche = useCallback(
109
+ (tranche: TrancheType) => {
110
+ if (tranche === 'senior') {
111
+ setTrancheInfo(seniorTrancheInfo)
112
+ } else if (tranche === 'junior') {
113
+ setTrancheInfo(juniorTrancheInfo)
114
+ } else {
115
+ setTrancheInfo(undefined)
116
+ }
117
+ },
118
+ [juniorTrancheInfo, seniorTrancheInfo],
119
+ )
120
+
121
+ if (!poolInfo || !poolUnderlyingToken || !trancheInfoFetched) {
122
+ return (
123
+ <WidgetWrapper
124
+ isOpen
125
+ isLoading
126
+ loadingTitle={title}
127
+ handleClose={handleClose}
128
+ handleSuccess={handleSuccess}
129
+ />
130
+ )
131
+ }
132
+
133
+ return (
134
+ <WidgetWrapper
135
+ isOpen
136
+ loadingTitle={title}
137
+ handleClose={handleClose}
138
+ handleSuccess={handleRedeemSuccess}
139
+ >
140
+ {step === WIDGET_STEP.ChooseTranche && (
141
+ <ChooseTranche
142
+ selectedTranche={trancheInfo?.tranche}
143
+ changeTranche={handleChangeTranche}
144
+ />
145
+ )}
146
+ {step === WIDGET_STEP.ChooseAmount && trancheInfo && (
147
+ <ChooseAmount
148
+ poolUnderlyingToken={poolUnderlyingToken}
149
+ trancheInfo={trancheInfo}
150
+ />
151
+ )}
152
+ {step === WIDGET_STEP.Transfer && trancheInfo && (
153
+ <Transfer
154
+ poolInfo={poolInfo}
155
+ poolUnderlyingToken={poolUnderlyingToken}
156
+ trancheInfo={trancheInfo}
157
+ />
158
+ )}
159
+ {step === WIDGET_STEP.Done && trancheInfo && (
160
+ <Done handleAction={handleClose} />
161
+ )}
162
+ {step === WIDGET_STEP.Error && (
163
+ <ErrorModal
164
+ title={title}
165
+ errorReason={errorReason}
166
+ errorMessage={errorMessage}
167
+ handleOk={handleClose}
168
+ />
169
+ )}
170
+ </WidgetWrapper>
171
+ )
172
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ PoolInfoV2,
3
+ TrancheType,
4
+ useTrancheVaultContractV2,
5
+ } from '@huma-finance/shared'
6
+ import { useWeb3React } from '@web3-react/core'
7
+ import React, { useCallback } from 'react'
8
+
9
+ import { RedemptionInfo } from '.'
10
+ import { useAppDispatch } from '../../../hooks/useRedux'
11
+ import { setStep } from '../../../store/widgets.reducers'
12
+ import { WIDGET_STEP } from '../../../store/widgets.store'
13
+ import { TxSendModalV2 } from '../../TxSendModalV2'
14
+
15
+ type Props = {
16
+ poolInfo: PoolInfoV2
17
+ trancheType: TrancheType
18
+ redemptionInfo: RedemptionInfo
19
+ }
20
+
21
+ export function Transfer({
22
+ poolInfo,
23
+ trancheType,
24
+ redemptionInfo,
25
+ }: Props): React.ReactElement | null {
26
+ const dispatch = useAppDispatch()
27
+ const { account, provider } = useWeb3React()
28
+ const trancheVaultContract = useTrancheVaultContractV2(
29
+ poolInfo.poolName,
30
+ trancheType,
31
+ provider,
32
+ account,
33
+ )
34
+
35
+ const handleSuccess = useCallback(() => {
36
+ dispatch(setStep(WIDGET_STEP.Done))
37
+ }, [dispatch])
38
+
39
+ if (!trancheVaultContract) {
40
+ return null
41
+ }
42
+
43
+ return (
44
+ <TxSendModalV2
45
+ contract={trancheVaultContract}
46
+ method='cancelRedemptionRequest'
47
+ params={[redemptionInfo.shares]}
48
+ handleSuccess={handleSuccess}
49
+ />
50
+ )
51
+ }
@@ -0,0 +1,29 @@
1
+ import { UnderlyingTokenInfo } from '@huma-finance/shared'
2
+ import { ethers } from 'ethers'
3
+ import React from 'react'
4
+
5
+ import { RedemptionInfo } from '.'
6
+ import { TxDoneModal } from '../../TxDoneModal'
7
+
8
+ type Props = {
9
+ poolUnderlyingToken: UnderlyingTokenInfo
10
+ redemptionInfo: RedemptionInfo
11
+ handleAction: () => void
12
+ }
13
+
14
+ export function Done({
15
+ poolUnderlyingToken,
16
+ redemptionInfo,
17
+ handleAction,
18
+ }: Props): React.ReactElement {
19
+ const shares = ethers.utils.formatUnits(
20
+ redemptionInfo.shares,
21
+ poolUnderlyingToken.decimals,
22
+ )
23
+
24
+ const content = [
25
+ `You successfully canceled ${shares} shares redemption request.`,
26
+ ]
27
+
28
+ return <TxDoneModal handleAction={handleAction} content={content} />
29
+ }
@@ -0,0 +1,120 @@
1
+ import {
2
+ POOL_NAME,
3
+ TrancheType,
4
+ useCancellableRedemptionInfoV2,
5
+ usePoolInfoV2,
6
+ usePoolUnderlyingTokenInfoV2,
7
+ } from '@huma-finance/shared'
8
+ import { useWeb3React } from '@web3-react/core'
9
+ import { BigNumber } from 'ethers'
10
+ import React, { useCallback, useEffect } from 'react'
11
+ import { useDispatch } from 'react-redux'
12
+
13
+ import { useAppSelector } from '../../../hooks/useRedux'
14
+ import { setStep } from '../../../store/widgets.reducers'
15
+ import { selectWidgetState } from '../../../store/widgets.selectors'
16
+ import { WIDGET_STEP } from '../../../store/widgets.store'
17
+ import { ErrorModal } from '../../ErrorModal'
18
+ import { WidgetWrapper } from '../../WidgetWrapper'
19
+ import { Transfer } from './1-Transfer'
20
+ import { Done } from './2-Done'
21
+
22
+ export type RedemptionInfo = {
23
+ shares: BigNumber
24
+ amount: BigNumber
25
+ }
26
+
27
+ /**
28
+ * Lend pool cancel redemption request props
29
+ * @typedef {Object} CancelRedemptionPropsV2
30
+ * @property {POOL_NAME} poolName The name of the pool.
31
+ * @property {TrancheType} trancheType The type of the tranche.
32
+ * @property {function():void} handleClose Function to notify to close the widget modal when user clicks the 'x' close button.
33
+ * @property {function((number|undefined)):void|undefined} handleSuccess Optional function to notify that the lending pool withdraw action is successful.
34
+ */
35
+ export type CancelRedemptionPropsV2 = {
36
+ poolName: keyof typeof POOL_NAME
37
+ trancheType: TrancheType
38
+ handleClose: () => void
39
+ handleSuccess?: (blockNumber?: number) => void
40
+ }
41
+
42
+ export function CancelRedemptionV2({
43
+ poolName: poolNameStr,
44
+ trancheType,
45
+ handleClose,
46
+ handleSuccess,
47
+ }: CancelRedemptionPropsV2): React.ReactElement | null {
48
+ const title = 'Cancel redemption'
49
+ const dispatch = useDispatch()
50
+ const { account, chainId, provider } = useWeb3React()
51
+ const poolName = POOL_NAME[poolNameStr]
52
+ const poolInfo = usePoolInfoV2(poolName, chainId)
53
+ const { step, errorMessage, errorReason } = useAppSelector(selectWidgetState)
54
+ const poolUnderlyingToken = usePoolUnderlyingTokenInfoV2(poolName, provider)
55
+ const [redemptionInfo] = useCancellableRedemptionInfoV2(
56
+ poolName,
57
+ trancheType,
58
+ account,
59
+ provider,
60
+ )
61
+
62
+ useEffect(() => {
63
+ if (!step) {
64
+ dispatch(setStep(WIDGET_STEP.Transfer))
65
+ }
66
+ }, [dispatch, step])
67
+
68
+ const handleRedeemSuccess = useCallback(
69
+ (blockNumber: number) => {
70
+ if (handleSuccess) {
71
+ handleSuccess(blockNumber)
72
+ }
73
+ },
74
+ [handleSuccess],
75
+ )
76
+
77
+ if (!poolInfo || !poolUnderlyingToken || !redemptionInfo) {
78
+ return (
79
+ <WidgetWrapper
80
+ isOpen
81
+ isLoading
82
+ loadingTitle={title}
83
+ handleClose={handleClose}
84
+ handleSuccess={handleSuccess}
85
+ />
86
+ )
87
+ }
88
+
89
+ return (
90
+ <WidgetWrapper
91
+ isOpen
92
+ loadingTitle={title}
93
+ handleClose={handleClose}
94
+ handleSuccess={handleRedeemSuccess}
95
+ >
96
+ {step === WIDGET_STEP.Transfer && (
97
+ <Transfer
98
+ poolInfo={poolInfo}
99
+ trancheType={trancheType}
100
+ redemptionInfo={redemptionInfo}
101
+ />
102
+ )}
103
+ {step === WIDGET_STEP.Done && (
104
+ <Done
105
+ poolUnderlyingToken={poolUnderlyingToken}
106
+ handleAction={handleClose}
107
+ redemptionInfo={redemptionInfo}
108
+ />
109
+ )}
110
+ {step === WIDGET_STEP.Error && (
111
+ <ErrorModal
112
+ title={title}
113
+ errorReason={errorReason}
114
+ errorMessage={errorMessage}
115
+ handleOk={handleClose}
116
+ />
117
+ )}
118
+ </WidgetWrapper>
119
+ )
120
+ }