Skip to content

Commit 4d4ddbc

Browse files
Merge pull request #1747 from curvefi/revert-1745-revert/refactor/routes
refactor: form tabs
2 parents 8dc6398 + 0edb275 commit 4d4ddbc

File tree

40 files changed

+654
-494
lines changed

40 files changed

+654
-494
lines changed

apps/main/src/lend/components/AlertNoLoanFound.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const AlertNoLoanFound = ({ alertType, owmId }: { alertType?: AlertType; owmId:
2525
size="large"
2626
onClick={() => {
2727
setStateByKeyMarkets('marketDetailsView', 'market')
28-
push(getLoanCreatePathname(params, owmId, 'create'))
28+
push(getLoanCreatePathname(params, owmId))
2929
}}
3030
>
3131
Create loan
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { useCallback } from 'react'
2+
import LoanFormCreate from '@/lend/components/PageLoanCreate/LoanFormCreate'
3+
import type { FormValues } from '@/lend/components/PageLoanCreate/types'
4+
import { DEFAULT_FORM_VALUES } from '@/lend/components/PageLoanCreate/utils'
5+
import networks from '@/lend/networks'
6+
import useStore from '@/lend/store/useStore'
7+
import { type MarketUrlParams, type PageContentProps } from '@/lend/types/lend.types'
8+
import { CreateLoanForm } from '@/llamalend/features/borrow/components/CreateLoanForm'
9+
import type { OnBorrowFormUpdate } from '@/llamalend/features/borrow/types'
10+
import { hasLeverage } from '@/llamalend/llama.utils'
11+
import { useDebounced } from '@ui-kit/hooks/useDebounce'
12+
import { useCreateLoanMuiForm } from '@ui-kit/hooks/useFeatureFlags'
13+
import { t } from '@ui-kit/lib/i18n'
14+
import { type FormTab, FormTabs } from '@ui-kit/shared/ui/FormTabs/FormTabs'
15+
import { Duration } from '@ui-kit/themes/design/0_primitives'
16+
17+
type CreateLoanProps = PageContentProps<MarketUrlParams>
18+
19+
/**
20+
* Callback that synchronizes the `ChartOhlc` component with the `RangeSlider` component in the new `BorrowTabContents`.
21+
*/
22+
const useOnFormUpdate = ({ api, market }: Pick<CreateLoanProps, 'api' | 'market'>): OnBorrowFormUpdate => {
23+
const [setFormValues] = useDebounced(
24+
useStore((store) => store.loanCreate.setFormValues),
25+
Duration.FormDebounce,
26+
)
27+
const [setStateByKeys] = useDebounced(
28+
useStore((store) => store.loanCreate.setStateByKeys),
29+
Duration.FormDebounce,
30+
)
31+
return useCallback(
32+
async ({ debt, userCollateral, range, slippage, leverageEnabled }) => {
33+
const formValues: FormValues = {
34+
...DEFAULT_FORM_VALUES,
35+
n: range,
36+
debt: `${debt ?? ''}`,
37+
userCollateral: `${userCollateral ?? ''}`,
38+
}
39+
await setFormValues(api, market, formValues, `${slippage}`, leverageEnabled)
40+
setStateByKeys({ isEditLiqRange: true })
41+
},
42+
[api, market, setFormValues, setStateByKeys],
43+
)
44+
}
45+
46+
function CreateLoanTab({ market, api, rChainId }: CreateLoanProps) {
47+
const onLoanCreated = useStore((state) => state.loanCreate.onLoanCreated)
48+
const onCreated = useCallback(
49+
async () => api && market && (await onLoanCreated(api, market)),
50+
[api, market, onLoanCreated],
51+
)
52+
const onUpdate = useOnFormUpdate({ market, api })
53+
return (
54+
<CreateLoanForm networks={networks} chainId={rChainId} market={market} onUpdate={onUpdate} onCreated={onCreated} />
55+
)
56+
}
57+
58+
const LendCreateTabsNewMenu = [
59+
{ value: 'create', label: t`Borrow`, component: CreateLoanTab },
60+
] satisfies FormTab<CreateLoanProps>[]
61+
62+
const LendCreateTabsOldMenu = [
63+
{ value: 'create', label: t`Create Loan`, component: LoanFormCreate },
64+
{
65+
value: 'leverage',
66+
label: t`Leverage`,
67+
component: (p) => <LoanFormCreate {...p} isLeverage />,
68+
visible: ({ market }) => market && hasLeverage(market),
69+
},
70+
] satisfies FormTab<CreateLoanProps>[]
71+
72+
export const LoanCreateTabs = (pageProps: CreateLoanProps) => {
73+
const menu = useCreateLoanMuiForm() ? LendCreateTabsNewMenu : LendCreateTabsOldMenu
74+
const shouldWrap = menu === LendCreateTabsOldMenu
75+
return <FormTabs params={pageProps} menu={menu} shouldWrap={shouldWrap} />
76+
}

apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ const LoanCreate = ({
412412
size="large"
413413
onClick={() => {
414414
setStateByKeyMarkets('marketDetailsView', 'user')
415-
push(getLoanManagePathname(params, rOwmId, 'loan'))
415+
push(getLoanManagePathname(params, rOwmId))
416416
}}
417417
>
418418
Manage loan
@@ -431,7 +431,7 @@ const LoanCreate = ({
431431
)}
432432
{steps && <Stepper steps={steps} />}
433433
{formStatus.isComplete && market && (
434-
<LinkButton variant="filled" size="large" href={getLoanManagePathname(params, market.id, 'loan')}>
434+
<LinkButton variant="filled" size="large" href={getLoanManagePathname(params, market.id)}>
435435
Manage loan
436436
</LinkButton>
437437
)}

apps/main/src/lend/components/PageLoanCreate/Page.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Address } from 'viem'
33
import CampaignRewardsBanner from '@/lend/components/CampaignRewardsBanner'
44
import { MarketInformationComp } from '@/lend/components/MarketInformationComp'
55
import { MarketInformationTabs } from '@/lend/components/MarketInformationTabs'
6-
import LoanCreate from '@/lend/components/PageLoanCreate/index'
6+
import { LoanCreateTabs } from '@/lend/components/PageLoanCreate/LoanCreateTabs'
77
import { useOneWayMarket } from '@/lend/entities/chain'
88
import { useLendPageTitle } from '@/lend/hooks/useLendPageTitle'
99
import { useMarketDetails } from '@/lend/hooks/useMarketDetails'
@@ -35,7 +35,7 @@ const { Spacing } = SizesAndSpaces
3535

3636
const Page = () => {
3737
const params = useParams<MarketUrlParams>()
38-
const { rMarket, rChainId, rFormType } = parseMarketParams(params)
38+
const { rMarket, rChainId } = parseMarketParams(params)
3939

4040
const { data: market, isSuccess } = useOneWayMarket(rChainId, rMarket)
4141
const { llamaApi: api = null, connectState } = useCurve()
@@ -88,7 +88,6 @@ const Page = () => {
8888
params,
8989
rChainId,
9090
rOwmId,
91-
rFormType,
9291
api,
9392
market,
9493
titleMapper,
@@ -97,7 +96,7 @@ const Page = () => {
9796
}
9897
const positionDetailsHrefs = {
9998
borrow: '',
100-
supply: getVaultPathname(params, rOwmId, 'deposit'),
99+
supply: getVaultPathname(params, rOwmId),
101100
}
102101

103102
return isSuccess && !market ? (
@@ -106,7 +105,7 @@ const Page = () => {
106105
<>
107106
<DetailPageStack>
108107
<AppPageFormsWrapper data-testid="form-wrapper">
109-
{rChainId && rOwmId && <LoanCreate {...pageProps} params={params} />}
108+
{rChainId && rOwmId && <LoanCreateTabs {...pageProps} params={params} />}
110109
</AppPageFormsWrapper>
111110
<Stack flexDirection="column" flexGrow={1} sx={{ gap: Spacing.md }}>
112111
<CampaignRewardsBanner

apps/main/src/lend/components/PageLoanCreate/index.tsx

Lines changed: 0 additions & 113 deletions
This file was deleted.

apps/main/src/lend/components/PageLoanCreate/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
import type { HealthMode } from '@/llamalend/llamalend.types'
1111
import type { Step } from '@ui/Stepper/types'
1212

13-
export type FormType = 'create' | 'vault' | 'leverage'
1413
export type StepKey = 'APPROVAL' | 'CREATE' | ''
1514
export type InpError = 'too-much' | 'too-much-max' | ''
1615

apps/main/src/lend/components/PageLoanManage/LoanBorrowMore/index.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { useLoanExists } from '@/llamalend/queries/loan-exists'
2626
import Stack from '@mui/material/Stack'
2727
import Typography from '@mui/material/Typography'
2828
import AlertBox from '@ui/AlertBox'
29+
import { AppFormContentWrapper } from '@ui/AppForm'
2930
import { getActiveStep } from '@ui/Stepper/helpers'
3031
import Stepper from '@ui/Stepper/Stepper'
3132
import type { Step } from '@ui/Stepper/types'
@@ -40,17 +41,18 @@ import { SizesAndSpaces } from '@ui-kit/themes/design/1_sizes_spaces'
4041

4142
const { Spacing } = SizesAndSpaces
4243

44+
export type LoanBorrowMoreProps = PageContentProps & { isLeverage?: boolean }
45+
4346
const LoanBorrowMore = ({
4447
rChainId,
4548
rOwmId,
46-
isLeverage = false,
4749
isLoaded,
4850
api,
4951
market,
5052
userActiveKey,
51-
}: PageContentProps & { isLeverage?: boolean }) => {
53+
isLeverage = false,
54+
}: LoanBorrowMoreProps) => {
5255
const isSubscribed = useRef(false)
53-
5456
const activeKey = useStore((state) => state.loanBorrowMore.activeKey)
5557
const activeKeyMax = useStore((state) => state.loanBorrowMore.activeKeyMax)
5658
const detailInfoLeverage = useStore((state) => state.loanBorrowMore.detailInfoLeverage[activeKey])
@@ -436,3 +438,14 @@ const LoanBorrowMore = ({
436438
}
437439

438440
export default LoanBorrowMore
441+
442+
/**
443+
* The new implementation of LoanBorrowMore with mui isn't ready yet. For now, we wrap the old one for styling.
444+
*/
445+
export const LoanBorrowMoreWrapped = (props: LoanBorrowMoreProps) => (
446+
<Stack sx={{ backgroundColor: (t) => t.design.Layer[1].Fill }}>
447+
<AppFormContentWrapper>
448+
<LoanBorrowMore {...props} />
449+
</AppFormContentWrapper>
450+
</Stack>
451+
)

apps/main/src/lend/components/PageLoanManage/LoanCollateralAdd/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import useStore from '@/lend/store/useStore'
1919
import { Api, OneWayMarketTemplate, PageContentProps } from '@/lend/types/lend.types'
2020
import { _showNoLoanFound } from '@/lend/utils/helpers'
2121
import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants'
22+
import { AddCollateralForm } from '@/llamalend/features/manage-loan/components/AddCollateralForm'
2223
import { useLoanExists } from '@/llamalend/queries/loan-exists'
2324
import AlertBox from '@ui/AlertBox'
2425
import { getActiveStep } from '@ui/Stepper/helpers'
@@ -258,3 +259,7 @@ const LoanCollateralAdd = ({ rChainId, rOwmId, api, isLoaded, market, userActive
258259
}
259260

260261
export default LoanCollateralAdd
262+
263+
export const LoanAddCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => (
264+
<AddCollateralForm networks={networks} chainId={rChainId} market={market} enabled={isLoaded} />
265+
)

apps/main/src/lend/components/PageLoanManage/LoanCollateralRemove/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import useStore from '@/lend/store/useStore'
2121
import { Api, OneWayMarketTemplate, PageContentProps } from '@/lend/types/lend.types'
2222
import { _showNoLoanFound } from '@/lend/utils/helpers'
2323
import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants'
24+
import { RemoveCollateralForm } from '@/llamalend/features/manage-loan/components/RemoveCollateralForm'
2425
import type { HealthMode } from '@/llamalend/llamalend.types'
2526
import { useLoanExists } from '@/llamalend/queries/loan-exists'
2627
import AlertBox from '@ui/AlertBox'
@@ -296,3 +297,7 @@ const LoanCollateralRemove = ({ rChainId, rOwmId, isLoaded, api, market, userAct
296297
}
297298

298299
export default LoanCollateralRemove
300+
301+
export const LoanRemoveCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => (
302+
<RemoveCollateralForm networks={networks} chainId={rChainId} market={market} enabled={isLoaded} />
303+
)

apps/main/src/lend/components/PageLoanManage/LoanRepay/index.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { Api, FormError, type MarketUrlParams, OneWayMarketTemplate, PageContent
2020
import { _showNoLoanFound } from '@/lend/utils/helpers'
2121
import { getCollateralListPathname } from '@/lend/utils/utilsRouter'
2222
import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants'
23+
import { RepayForm } from '@/llamalend/features/manage-loan/components/RepayForm'
2324
import type { HealthMode } from '@/llamalend/llamalend.types'
2425
import { useLoanExists } from '@/llamalend/queries/loan-exists'
2526
import Stack from '@mui/material/Stack'
@@ -537,3 +538,11 @@ const LoanRepay = ({
537538
}
538539

539540
export default LoanRepay
541+
542+
export const LoanRepayFromWalletTab = ({ rChainId, market, isLoaded }: PageContentProps) => (
543+
<RepayForm fromWallet networks={networks} chainId={rChainId} market={market} enabled={isLoaded} />
544+
)
545+
546+
export const LoanRepayFromCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => (
547+
<RepayForm fromCollateral networks={networks} chainId={rChainId} market={market} enabled={isLoaded} />
548+
)

0 commit comments

Comments
 (0)