From ca1e25170ceced97ea86eb87a9c1aaee89063751 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 8 Dec 2025 10:20:19 +0100 Subject: [PATCH 01/10] Revert "revert: "Merge pull request #1730 from curvefi/refactor/routes"" --- .../src/lend/components/AlertNoLoanFound.tsx | 2 +- .../PageLoanCreate/LoanCreateTabs.tsx | 66 +++++++ .../PageLoanCreate/LoanFormCreate/index.tsx | 4 +- .../lend/components/PageLoanCreate/Page.tsx | 9 +- .../lend/components/PageLoanCreate/index.tsx | 103 ----------- .../lend/components/PageLoanCreate/types.ts | 1 - .../PageLoanManage/LoanBorrowMore/index.tsx | 25 ++- .../LoanCollateralAdd/index.tsx | 5 + .../LoanCollateralRemove/index.tsx | 5 + .../PageLoanManage/LoanRepay/index.tsx | 9 + .../LoanSelfLiquidation/index.tsx | 2 +- .../PageLoanManage/ManageLoanTabs.tsx | 103 +++++++++++ .../lend/components/PageLoanManage/Page.tsx | 30 +-- .../lend/components/PageLoanManage/index.tsx | 157 ---------------- .../lend/components/PageLoanManage/types.ts | 4 - .../src/lend/components/PageVault/Page.tsx | 12 +- .../PageVault/VaultDepositMint/index.tsx | 5 +- .../components/PageVault/VaultStake/index.tsx | 3 +- .../lend/components/PageVault/VaultTabs.tsx | 32 ++++ .../PageVault/VaultUnstake/index.tsx | 3 +- .../PageVault/VaultWithdrawRedeem/index.tsx | 11 +- .../src/lend/components/PageVault/index.tsx | 72 -------- apps/main/src/lend/constants.ts | 14 +- .../lend/hooks/useBorrowPositionDetails.ts | 15 +- apps/main/src/lend/types/lend.types.ts | 13 +- apps/main/src/lend/utils/helpers.ts | 8 - apps/main/src/lend/utils/utilsRouter.ts | 20 +- .../components/AddCollateralForm.tsx | 2 +- .../components/RemoveCollateralForm.tsx | 2 +- .../manage-loan/components/RepayForm.tsx | 68 ++++--- .../manage-loan/hooks/useAddCollateralForm.ts | 2 +- .../hooks/useRemoveCollateralForm.ts | 2 +- .../manage-loan/hooks/useRepayForm.ts | 2 +- .../src/llamalend/mutations/repay.mutation.ts | 2 +- .../llamalend/mutations/useLlammaMutation.ts | 4 +- .../loan/components/PageLoanCreate/index.tsx | 2 +- .../loan/components/PageLoanManage/index.tsx | 3 + apps/main/src/routes/lend.routes.tsx | 21 +-- .../src/shared/ui/FormTabs/FormTabs.tsx | 117 ++++++++++++ .../shared/ui/stories/FormTabs.stories.tsx | 171 ++++++++++++++++++ 40 files changed, 641 insertions(+), 490 deletions(-) create mode 100644 apps/main/src/lend/components/PageLoanCreate/LoanCreateTabs.tsx delete mode 100644 apps/main/src/lend/components/PageLoanCreate/index.tsx create mode 100644 apps/main/src/lend/components/PageLoanManage/ManageLoanTabs.tsx delete mode 100644 apps/main/src/lend/components/PageLoanManage/index.tsx create mode 100644 apps/main/src/lend/components/PageVault/VaultTabs.tsx delete mode 100644 apps/main/src/lend/components/PageVault/index.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/FormTabs/FormTabs.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/stories/FormTabs.stories.tsx diff --git a/apps/main/src/lend/components/AlertNoLoanFound.tsx b/apps/main/src/lend/components/AlertNoLoanFound.tsx index 246931bbfa..d37cb33e5d 100644 --- a/apps/main/src/lend/components/AlertNoLoanFound.tsx +++ b/apps/main/src/lend/components/AlertNoLoanFound.tsx @@ -25,7 +25,7 @@ const AlertNoLoanFound = ({ alertType, owmId }: { alertType?: AlertType; owmId: size="large" onClick={() => { setStateByKeyMarkets('marketDetailsView', 'market') - push(getLoanCreatePathname(params, owmId, 'create')) + push(getLoanCreatePathname(params, owmId)) }} > Create loan diff --git a/apps/main/src/lend/components/PageLoanCreate/LoanCreateTabs.tsx b/apps/main/src/lend/components/PageLoanCreate/LoanCreateTabs.tsx new file mode 100644 index 0000000000..c9bd29fe8a --- /dev/null +++ b/apps/main/src/lend/components/PageLoanCreate/LoanCreateTabs.tsx @@ -0,0 +1,66 @@ +import { useCallback } from 'react' +import LoanFormCreate from '@/lend/components/PageLoanCreate/LoanFormCreate' +import type { FormValues } from '@/lend/components/PageLoanCreate/types' +import { DEFAULT_FORM_VALUES } from '@/lend/components/PageLoanCreate/utils' +import networks from '@/lend/networks' +import useStore from '@/lend/store/useStore' +import { type MarketUrlParams, type PageContentProps } from '@/lend/types/lend.types' +import { CreateLoanForm } from '@/llamalend/features/borrow/components/CreateLoanForm' +import type { OnBorrowFormUpdate } from '@/llamalend/features/borrow/types' +import { hasLeverage } from '@/llamalend/llama.utils' +import { useCreateLoanMuiForm } from '@ui-kit/hooks/useFeatureFlags' +import { t } from '@ui-kit/lib/i18n' +import { type FormTab, FormTabs } from '@ui-kit/shared/ui/FormTabs/FormTabs' + +type CreateLoanProps = PageContentProps + +/** + * Callback that synchronizes the `ChartOhlc` component with the `RangeSlider` component in the new `BorrowTabContents`. + */ +const useOnFormUpdate = ({ api, market }: Pick): OnBorrowFormUpdate => + useCallback( + async ({ debt, userCollateral, range, slippage, leverageEnabled }) => { + const { setFormValues, setStateByKeys } = useStore.getState().loanCreate + const formValues: FormValues = { + ...DEFAULT_FORM_VALUES, + n: range, + debt: `${debt ?? ''}`, + userCollateral: `${userCollateral ?? ''}`, + } + await setFormValues(api, market, formValues, `${slippage}`, leverageEnabled) + setStateByKeys({ isEditLiqRange: true }) + }, + [api, market], + ) + +function CreateLoanTab({ market, api, rChainId }: CreateLoanProps) { + const onLoanCreated = useStore((state) => state.loanCreate.onLoanCreated) + const onCreated = useCallback( + async () => api && market && (await onLoanCreated(api, market)), + [api, market, onLoanCreated], + ) + const onUpdate = useOnFormUpdate({ market, api }) + return ( + + ) +} + +const LendCreateTabsNewMenu = [ + { value: 'create', label: t`Borrow`, component: CreateLoanTab }, +] satisfies FormTab[] + +const LendCreateTabsOldMenu = [ + { value: 'create', label: t`Create Loan`, component: LoanFormCreate }, + { + value: 'leverage', + label: t`Leverage`, + component: (p) => , + visible: ({ market }) => market && hasLeverage(market), + }, +] satisfies FormTab[] + +export const LoanCreateTabs = (pageProps: CreateLoanProps) => { + const menu = useCreateLoanMuiForm() ? LendCreateTabsNewMenu : LendCreateTabsOldMenu + const shouldWrap = menu === LendCreateTabsOldMenu + return +} diff --git a/apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx b/apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx index 05549d74ad..f9f4426a09 100644 --- a/apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx +++ b/apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx @@ -412,7 +412,7 @@ const LoanCreate = ({ size="large" onClick={() => { setStateByKeyMarkets('marketDetailsView', 'user') - push(getLoanManagePathname(params, rOwmId, 'loan')) + push(getLoanManagePathname(params, rOwmId)) }} > Manage loan @@ -431,7 +431,7 @@ const LoanCreate = ({ )} {steps && } {formStatus.isComplete && market && ( - + Manage loan )} diff --git a/apps/main/src/lend/components/PageLoanCreate/Page.tsx b/apps/main/src/lend/components/PageLoanCreate/Page.tsx index 3841891282..64d881c17b 100644 --- a/apps/main/src/lend/components/PageLoanCreate/Page.tsx +++ b/apps/main/src/lend/components/PageLoanCreate/Page.tsx @@ -3,7 +3,7 @@ import type { Address } from 'viem' import CampaignRewardsBanner from '@/lend/components/CampaignRewardsBanner' import { MarketInformationComp } from '@/lend/components/MarketInformationComp' import { MarketInformationTabs } from '@/lend/components/MarketInformationTabs' -import LoanCreate from '@/lend/components/PageLoanCreate/index' +import { LoanCreateTabs } from '@/lend/components/PageLoanCreate/LoanCreateTabs' import { useOneWayMarket } from '@/lend/entities/chain' import { useLendPageTitle } from '@/lend/hooks/useLendPageTitle' import { useMarketDetails } from '@/lend/hooks/useMarketDetails' @@ -35,7 +35,7 @@ const { Spacing } = SizesAndSpaces const Page = () => { const params = useParams() - const { rMarket, rChainId, rFormType } = parseMarketParams(params) + const { rMarket, rChainId } = parseMarketParams(params) const { data: market, isSuccess } = useOneWayMarket(rChainId, rMarket) const { llamaApi: api = null, connectState } = useConnection() @@ -88,7 +88,6 @@ const Page = () => { params, rChainId, rOwmId, - rFormType, api, market, titleMapper, @@ -97,7 +96,7 @@ const Page = () => { } const positionDetailsHrefs = { borrow: '', - supply: getVaultPathname(params, rOwmId, 'deposit'), + supply: getVaultPathname(params, rOwmId), } return isSuccess && !market ? ( @@ -106,7 +105,7 @@ const Page = () => { <> - {rChainId && rOwmId && } + {rChainId && rOwmId && } - useCallback( - async ({ debt, userCollateral, range, slippage, leverageEnabled }) => { - const { setFormValues, setStateByKeys } = useStore.getState().loanCreate - const formValues: FormValues = { - ...DEFAULT_FORM_VALUES, - n: range, - debt: `${debt ?? ''}`, - userCollateral: `${userCollateral ?? ''}`, - } - await setFormValues(api, market, formValues, `${slippage}`, leverageEnabled) - setStateByKeys({ isEditLiqRange: true }) - }, - [api, market], - ) - -const LoanCreate = (pageProps: PageContentProps & { params: MarketUrlParams }) => { - const { rChainId, rOwmId, rFormType, market, params, api } = pageProps - const push = useNavigate() - const shouldUseBorrowUnifiedForm = useCreateLoanMuiForm() - const onUpdate = useOnFormUpdate(pageProps) - - const onLoanCreated = useStore((state) => state.loanCreate.onLoanCreated) - const resetState = useStore((state) => state.loanCreate.resetState) - - type Tab = 'create' | 'leverage' - const tabs: TabOption[] = useMemo( - () => - shouldUseBorrowUnifiedForm - ? // the new borrow form contains both create and leverage functionality - [{ value: 'create' as const, label: t`Borrow` }] - : [ - { value: 'create' as const, label: t`Create Loan` }, - ...(market?.leverage.hasLeverage() ? [{ value: 'leverage' as const, label: t`Leverage` }] : []), - ], - [market?.leverage, shouldUseBorrowUnifiedForm], - ) - - const onCreated = useCallback( - async () => api && market && (await onLoanCreated(api, market)), - [api, market, onLoanCreated], - ) - - return ( - - { - resetState({ rChainId, rOwmId, key }) - push(getLoanCreatePathname(params, rOwmId, key)) - }} - options={tabs} - /> - {shouldUseBorrowUnifiedForm ? ( - - ) : ( - t.design.Layer[1].Fill }}> - - - - - )} - - ) -} - -export default LoanCreate diff --git a/apps/main/src/lend/components/PageLoanCreate/types.ts b/apps/main/src/lend/components/PageLoanCreate/types.ts index b49d280ce8..4293951e40 100644 --- a/apps/main/src/lend/components/PageLoanCreate/types.ts +++ b/apps/main/src/lend/components/PageLoanCreate/types.ts @@ -10,7 +10,6 @@ import { import type { HealthMode } from '@/llamalend/llamalend.types' import type { Step } from '@ui/Stepper/types' -export type FormType = 'create' | 'vault' | 'leverage' export type StepKey = 'APPROVAL' | 'CREATE' | '' export type InpError = 'too-much' | 'too-much-max' | '' diff --git a/apps/main/src/lend/components/PageLoanManage/LoanBorrowMore/index.tsx b/apps/main/src/lend/components/PageLoanManage/LoanBorrowMore/index.tsx index 91ea35d726..0c655bf6f7 100644 --- a/apps/main/src/lend/components/PageLoanManage/LoanBorrowMore/index.tsx +++ b/apps/main/src/lend/components/PageLoanManage/LoanBorrowMore/index.tsx @@ -21,11 +21,13 @@ import useStore from '@/lend/store/useStore' import { Api, OneWayMarketTemplate, PageContentProps } from '@/lend/types/lend.types' import { _showNoLoanFound } from '@/lend/utils/helpers' import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants' +import { hasLeverage } from '@/llamalend/llama.utils' import type { HealthMode } from '@/llamalend/llamalend.types' import { useLoanExists } from '@/llamalend/queries/loan-exists' import Stack from '@mui/material/Stack' import Typography from '@mui/material/Typography' import AlertBox from '@ui/AlertBox' +import { AppFormContentWrapper } from '@ui/AppForm' import { getActiveStep } from '@ui/Stepper/helpers' import Stepper from '@ui/Stepper/Stepper' import type { Step } from '@ui/Stepper/types' @@ -40,17 +42,9 @@ import { SizesAndSpaces } from '@ui-kit/themes/design/1_sizes_spaces' const { Spacing } = SizesAndSpaces -const LoanBorrowMore = ({ - rChainId, - rOwmId, - isLeverage = false, - isLoaded, - api, - market, - userActiveKey, -}: PageContentProps & { isLeverage?: boolean }) => { +const LoanBorrowMore = ({ rChainId, rOwmId, isLoaded, api, market, userActiveKey }: PageContentProps) => { const isSubscribed = useRef(false) - + const isLeverage = !!market && hasLeverage(market) const activeKey = useStore((state) => state.loanBorrowMore.activeKey) const activeKeyMax = useStore((state) => state.loanBorrowMore.activeKeyMax) const detailInfoLeverage = useStore((state) => state.loanBorrowMore.detailInfoLeverage[activeKey]) @@ -436,3 +430,14 @@ const LoanBorrowMore = ({ } export default LoanBorrowMore + +/** + * The new implementation of LoanBorrowMore with mui isn't ready yet. For now, we wrap the old one for styling. + */ +export const LoanBorrowMoreWrapped = (props: PageContentProps) => ( + t.design.Layer[1].Fill }}> + + + + +) diff --git a/apps/main/src/lend/components/PageLoanManage/LoanCollateralAdd/index.tsx b/apps/main/src/lend/components/PageLoanManage/LoanCollateralAdd/index.tsx index 7fb4485c0b..eea70678a7 100644 --- a/apps/main/src/lend/components/PageLoanManage/LoanCollateralAdd/index.tsx +++ b/apps/main/src/lend/components/PageLoanManage/LoanCollateralAdd/index.tsx @@ -19,6 +19,7 @@ import useStore from '@/lend/store/useStore' import { Api, OneWayMarketTemplate, PageContentProps } from '@/lend/types/lend.types' import { _showNoLoanFound } from '@/lend/utils/helpers' import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants' +import { AddCollateralForm } from '@/llamalend/features/manage-loan/components/AddCollateralForm' import { useLoanExists } from '@/llamalend/queries/loan-exists' import AlertBox from '@ui/AlertBox' import { getActiveStep } from '@ui/Stepper/helpers' @@ -258,3 +259,7 @@ const LoanCollateralAdd = ({ rChainId, rOwmId, api, isLoaded, market, userActive } export default LoanCollateralAdd + +export const LoanAddCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => ( + +) diff --git a/apps/main/src/lend/components/PageLoanManage/LoanCollateralRemove/index.tsx b/apps/main/src/lend/components/PageLoanManage/LoanCollateralRemove/index.tsx index aa959653e8..0a2e54f410 100644 --- a/apps/main/src/lend/components/PageLoanManage/LoanCollateralRemove/index.tsx +++ b/apps/main/src/lend/components/PageLoanManage/LoanCollateralRemove/index.tsx @@ -21,6 +21,7 @@ import useStore from '@/lend/store/useStore' import { Api, OneWayMarketTemplate, PageContentProps } from '@/lend/types/lend.types' import { _showNoLoanFound } from '@/lend/utils/helpers' import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants' +import { RemoveCollateralForm } from '@/llamalend/features/manage-loan/components/RemoveCollateralForm' import type { HealthMode } from '@/llamalend/llamalend.types' import { useLoanExists } from '@/llamalend/queries/loan-exists' import AlertBox from '@ui/AlertBox' @@ -296,3 +297,7 @@ const LoanCollateralRemove = ({ rChainId, rOwmId, isLoaded, api, market, userAct } export default LoanCollateralRemove + +export const LoanRemoveCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => ( + +) diff --git a/apps/main/src/lend/components/PageLoanManage/LoanRepay/index.tsx b/apps/main/src/lend/components/PageLoanManage/LoanRepay/index.tsx index aa58edd63f..8c4c51015e 100644 --- a/apps/main/src/lend/components/PageLoanManage/LoanRepay/index.tsx +++ b/apps/main/src/lend/components/PageLoanManage/LoanRepay/index.tsx @@ -20,6 +20,7 @@ import { Api, FormError, type MarketUrlParams, OneWayMarketTemplate, PageContent import { _showNoLoanFound } from '@/lend/utils/helpers' import { getCollateralListPathname } from '@/lend/utils/utilsRouter' import { DEFAULT_HEALTH_MODE } from '@/llamalend/constants' +import { RepayForm } from '@/llamalend/features/manage-loan/components/RepayForm' import type { HealthMode } from '@/llamalend/llamalend.types' import { useLoanExists } from '@/llamalend/queries/loan-exists' import Stack from '@mui/material/Stack' @@ -537,3 +538,11 @@ const LoanRepay = ({ } export default LoanRepay + +export const LoanRepayFromWalletTab = ({ rChainId, market, isLoaded }: PageContentProps) => ( + +) + +export const LoanRepayFromCollateralTab = ({ rChainId, market, isLoaded }: PageContentProps) => ( + +) diff --git a/apps/main/src/lend/components/PageLoanManage/LoanSelfLiquidation/index.tsx b/apps/main/src/lend/components/PageLoanManage/LoanSelfLiquidation/index.tsx index b1647b2693..15efbecd39 100644 --- a/apps/main/src/lend/components/PageLoanManage/LoanSelfLiquidation/index.tsx +++ b/apps/main/src/lend/components/PageLoanManage/LoanSelfLiquidation/index.tsx @@ -45,7 +45,7 @@ const LoanSelfLiquidation = ({ market, userActiveKey, params, -}: PageContentProps & { params: MarketUrlParams }) => { +}: PageContentProps) => { const isSubscribed = useRef(false) const formEstGas = useStore((state) => state.loanSelfLiquidation.formEstGas) const formStatus = useStore((state) => state.loanSelfLiquidation.formStatus) diff --git a/apps/main/src/lend/components/PageLoanManage/ManageLoanTabs.tsx b/apps/main/src/lend/components/PageLoanManage/ManageLoanTabs.tsx new file mode 100644 index 0000000000..ee4e2ad5a4 --- /dev/null +++ b/apps/main/src/lend/components/PageLoanManage/ManageLoanTabs.tsx @@ -0,0 +1,103 @@ +import LoanBorrowMore, { LoanBorrowMoreWrapped } from '@/lend/components/PageLoanManage/LoanBorrowMore' +import LoanCollateralAdd, { LoanAddCollateralTab } from '@/lend/components/PageLoanManage/LoanCollateralAdd' +import LoanCollateralRemove, { LoanRemoveCollateralTab } from '@/lend/components/PageLoanManage/LoanCollateralRemove' +import LoanRepay, { + LoanRepayFromCollateralTab, + LoanRepayFromWalletTab, +} from '@/lend/components/PageLoanManage/LoanRepay' +import LoanSelfLiquidation from '@/lend/components/PageLoanManage/LoanSelfLiquidation' +import networks from '@/lend/networks' +import { type MarketUrlParams, PageContentProps } from '@/lend/types/lend.types' +import { useClosePositionTab } from '@/llamalend/features/manage-soft-liquidation/hooks/useClosePositionTab' +import { useImproveHealthTab } from '@/llamalend/features/manage-soft-liquidation/hooks/useImproveHealthTab' +import { ClosePosition } from '@/llamalend/features/manage-soft-liquidation/ui/tabs/ClosePosition' +import { ImproveHealth } from '@/llamalend/features/manage-soft-liquidation/ui/tabs/ImproveHealth' +import { useManageLoanMuiForm, useManageSoftLiquidation } from '@ui-kit/hooks/useFeatureFlags' +import { t } from '@ui-kit/lib/i18n' +import { type FormTab, FormTabs } from '@ui-kit/shared/ui/FormTabs/FormTabs' + +type ManageLoanProps = PageContentProps + +const ImproveHealthTab = ({ rChainId, rOwmId }: ManageLoanProps) => ( + +) + +const ClosePositionTab = ({ rChainId, rOwmId }: ManageLoanProps) => ( + +) + +const LendManageLegacyMenu = [ + { + value: 'loan', + label: t`Borrow`, + subTabs: [ + { value: 'loan-increase', label: t`Borrow more`, component: LoanBorrowMore }, + { value: 'loan-decrease', label: t`Repay`, component: LoanRepay }, + { value: 'loan-liquidate', label: t`Self-liquidate`, component: LoanSelfLiquidation }, + ], + }, + { + value: 'collateral', + label: t`Borrow`, + subTabs: [ + { value: 'collateral-increase', label: t`Add collateral`, component: LoanCollateralAdd }, + { value: 'collateral-decrease', label: t`Remove collateral`, component: LoanCollateralRemove }, + ], + }, + { + value: 'leverage', + label: t`Leverage`, + visible: ({ market }) => market?.leverage?.hasLeverage(), + component: LoanBorrowMore, + }, +] satisfies FormTab[] + +const LendManageNewMenu = [ + { + value: 'borrow', + label: ({ market }) => (market?.leverage?.hasLeverage() ? t`Leverage` : t`Borrow`), + component: LoanBorrowMoreWrapped, + }, + { + value: 'repay', + label: t`Repay`, + subTabs: [ + { value: 'from-wallet', label: t`From wallet`, component: LoanRepayFromWalletTab }, + { value: 'from-collateral', label: t`From collateral`, component: LoanRepayFromCollateralTab }, + ], + }, + { + value: 'collateral', + label: t`Collateral`, + subTabs: [ + { value: 'add', label: t`Add`, component: LoanAddCollateralTab }, + { value: 'remove', label: t`Remove`, component: LoanRemoveCollateralTab }, + ], + }, +] satisfies FormTab[] + +const LendManageSoftLiquidationMenu = [ + { + value: 'soft-liquidation', + label: t`Manage soft liquidation`, + subTabs: [ + { value: 'improve-health', label: t`Improve health`, component: ImproveHealthTab }, + { value: 'close-position', label: t`Close position`, component: ClosePositionTab }, + ], + }, +] satisfies FormTab[] + +export const ManageLoanTabs = ({ + isInSoftLiquidation, + ...pageProps +}: ManageLoanProps & { isInSoftLiquidation: boolean | undefined }) => { + const shouldUseSoftLiquidation = useManageSoftLiquidation() && isInSoftLiquidation + const shouldUseManageLoanMuiForm = useManageLoanMuiForm() + const menu = shouldUseSoftLiquidation + ? LendManageSoftLiquidationMenu + : shouldUseManageLoanMuiForm + ? LendManageNewMenu + : LendManageLegacyMenu + const shouldWrap = menu === LendManageLegacyMenu + return +} diff --git a/apps/main/src/lend/components/PageLoanManage/Page.tsx b/apps/main/src/lend/components/PageLoanManage/Page.tsx index 4613d40239..0ca3e148c9 100644 --- a/apps/main/src/lend/components/PageLoanManage/Page.tsx +++ b/apps/main/src/lend/components/PageLoanManage/Page.tsx @@ -3,8 +3,7 @@ import type { Address } from 'viem' import CampaignRewardsBanner from '@/lend/components/CampaignRewardsBanner' import { MarketInformationComp } from '@/lend/components/MarketInformationComp' import { MarketInformationTabs } from '@/lend/components/MarketInformationTabs' -import LoanMange from '@/lend/components/PageLoanManage/index' -import type { DetailInfoTypes } from '@/lend/components/PageLoanManage/types' +import { ManageLoanTabs } from '@/lend/components/PageLoanManage/ManageLoanTabs' import { useOneWayMarket } from '@/lend/entities/chain' import { useBorrowPositionDetails } from '@/lend/hooks/useBorrowPositionDetails' import { useLendPageTitle } from '@/lend/hooks/useLendPageTitle' @@ -16,7 +15,6 @@ import useStore from '@/lend/store/useStore' import { type MarketUrlParams } from '@/lend/types/lend.types' import { getVaultPathname, parseMarketParams } from '@/lend/utils/helpers' import { getCollateralListPathname } from '@/lend/utils/utilsRouter' -import { ManageSoftLiquidation } from '@/llamalend/features/manage-soft-liquidation' import { MarketDetails } from '@/llamalend/features/market-details' import { BorrowPositionDetails, NoPosition } from '@/llamalend/features/market-position-details' import { UserPositionHistory } from '@/llamalend/features/user-position-history' @@ -30,7 +28,6 @@ import Box from '@ui/Box' import { ConnectWalletPrompt, isLoading, useConnection, useWallet } from '@ui-kit/features/connect-wallet' import { useLayoutStore } from '@ui-kit/features/layout' import { useParams } from '@ui-kit/hooks/router' -import { useManageSoftLiquidation } from '@ui-kit/hooks/useFeatureFlags' import { t } from '@ui-kit/lib/i18n' import { REFRESH_INTERVAL } from '@ui-kit/lib/model' import { ErrorPage } from '@ui-kit/pages/ErrorPage' @@ -40,13 +37,12 @@ const { Spacing } = SizesAndSpaces const Page = () => { const params = useParams() - const { rMarket, rChainId, rFormType } = parseMarketParams(params) + const { rMarket, rChainId } = parseMarketParams(params) const { llamaApi: api = null, connectState } = useConnection() const titleMapper = useTitleMapper() const { data: market, isSuccess } = useOneWayMarket(rChainId, rMarket) const rOwmId = market?.id ?? '' const userActiveKey = helpers.getUserActiveKey(api, market!) - const isMdUp = useLayoutStore((state) => state.isMdUp) const isPageVisible = useLayoutStore((state) => state.isPageVisible) const fetchAllMarketDetails = useStore((state) => state.markets.fetchAll) const fetchAllUserMarketDetails = useStore((state) => state.user.fetchAll) @@ -88,15 +84,8 @@ const Page = () => { network, }) - const isManageSoftLiq = - useManageSoftLiquidation() && - (borrowPositionDetails.liquidationAlert.softLiquidation || borrowPositionDetails.liquidationAlert.hardLiquidation) - - // set tabs - const DETAIL_INFO_TYPES: { key: DetailInfoTypes; label: string }[] = [{ label: t`Market Details`, key: 'market' }] - if (signerAddress) { - DETAIL_INFO_TYPES.push({ label: t`Your Details`, key: 'user' }) - } + const isInSoftLiquidation = + borrowPositionDetails.liquidationAlert.softLiquidation || borrowPositionDetails.liquidationAlert.hardLiquidation useEffect(() => { if (api && market && isPageVisible) { @@ -123,7 +112,6 @@ const Page = () => { params, rChainId, rOwmId, - rFormType, isLoaded, api, market, @@ -133,7 +121,7 @@ const Page = () => { const positionDetailsHrefs = { borrow: '', - supply: getVaultPathname(params, rOwmId, 'deposit'), + supply: getVaultPathname(params, rOwmId), } return isSuccess && !market ? ( @@ -142,13 +130,7 @@ const Page = () => { <> - {rChainId && - rOwmId && - (isManageSoftLiq ? ( - - ) : ( - - ))} + {rChainId && rOwmId && } [] = [ - { value: 'loan-increase', label: t`Borrow more` }, - { value: 'loan-decrease', label: t`Repay` }, - { value: 'loan-liquidate', label: t`Self-liquidate` }, -] - -const tabsCollateral: TabOption[] = [ - { value: 'collateral-increase', label: t`Add collateral` }, - { value: 'collateral-decrease', label: t`Remove collateral` }, -] - -const ManageLoan = (pageProps: PageContentProps & { params: MarketUrlParams }) => { - const { rChainId, rOwmId, rFormType, market, params, isLoaded } = pageProps - const push = useNavigate() - const shouldUseManageLoanMuiForm = useManageLoanMuiForm() - const useMuiForm = shouldUseManageLoanMuiForm && !!market - - type Tab = 'loan' | 'collateral' | 'leverage' - const tabs: TabOption[] = useMemo( - () => [ - { value: 'loan' as const, label: t`Loan` }, - { value: 'collateral' as const, label: t`Collateral` }, - ...(market?.leverage?.hasLeverage() ? [{ value: 'leverage' as const, label: t`Leverage` }] : []), - ], - [market?.leverage], - ) - - type SubTab = LoanFormType | CollateralFormType | LeverageFormType - const [subTab, setSubTab] = useState('loan-increase') - - const subTabs = useMemo( - () => (!rFormType || rFormType === 'loan' ? tabsLoan : rFormType === 'collateral' ? tabsCollateral : []), - [rFormType], - ) - - useEffect(() => setSubTab(subTabs[0]?.value), [subTabs]) - - return ( - - push(getLoanManagePathname(params, rOwmId, key))} - options={tabs} - /> - {useMuiForm ? ( - <> - - - {subTab === 'loan-increase' && ( - t.design.Layer[1].Fill }}> - - - - - )} - {subTab === 'loan-decrease' && market && ( - {}} - /> - )} - {subTab === 'loan-liquidate' && } - {subTab === 'collateral-increase' && market && ( - {}} - /> - )} - {subTab === 'collateral-decrease' && market && ( - {}} - /> - )} - {/** Leverage has no subtabs */} - {rFormType === 'leverage' && ( - t.design.Layer[1].Fill }}> - - - - - )} - - ) : ( - t.design.Layer[1].Fill }}> - - - - {subTab === 'loan-increase' && } - {subTab === 'loan-decrease' && } - {subTab === 'loan-liquidate' && } - {subTab === 'collateral-increase' && } - {subTab === 'collateral-decrease' && } - {/** Leverage has no subtabs */} - {rFormType === 'leverage' && } - - - )} - - ) -} - -export default ManageLoan diff --git a/apps/main/src/lend/components/PageLoanManage/types.ts b/apps/main/src/lend/components/PageLoanManage/types.ts index b57bb5ee69..a1a7aef085 100644 --- a/apps/main/src/lend/components/PageLoanManage/types.ts +++ b/apps/main/src/lend/components/PageLoanManage/types.ts @@ -1,10 +1,6 @@ import { FutureRates } from '@/lend/types/lend.types' export type DetailInfoTypes = 'user' | 'market' -export type FormType = 'loan' | 'collateral' | 'leverage' -export type LoanFormType = 'loan-increase' | 'loan-decrease' | 'loan-liquidate' -export type CollateralFormType = 'collateral-increase' | 'collateral-decrease' -export type LeverageFormType = 'leverage-borrow-more' export type FormStatus = { isApproved: boolean diff --git a/apps/main/src/lend/components/PageVault/Page.tsx b/apps/main/src/lend/components/PageVault/Page.tsx index c93412ea6b..8aa4162fa3 100644 --- a/apps/main/src/lend/components/PageVault/Page.tsx +++ b/apps/main/src/lend/components/PageVault/Page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import CampaignRewardsBanner from '@/lend/components/CampaignRewardsBanner' import { MarketInformationComp } from '@/lend/components/MarketInformationComp' import { MarketInformationTabs } from '@/lend/components/MarketInformationTabs' -import Vault from '@/lend/components/PageVault/index' +import { VaultTabs } from '@/lend/components/PageVault/VaultTabs' import { useOneWayMarket } from '@/lend/entities/chain' import { useLendPageTitle } from '@/lend/hooks/useLendPageTitle' import { useMarketDetails } from '@/lend/hooks/useMarketDetails' @@ -36,7 +36,7 @@ const { Spacing } = SizesAndSpaces const Page = () => { const params = useParams() - const { rMarket, rChainId, rFormType } = parseMarketParams(params) + const { rMarket, rChainId } = parseMarketParams(params) const { connect, provider } = useWallet() const { llamaApi: api = null, connectState } = useConnection() const titleMapper = useTitleMapper() @@ -99,7 +99,6 @@ const Page = () => { params, rChainId, rOwmId, - rFormType, isLoaded, api, market, @@ -108,10 +107,7 @@ const Page = () => { } const borrowPathnameFn = loanExists ? getLoanManagePathname : getLoanCreatePathname - const positionDetailsHrefs = { - borrow: borrowPathnameFn(params, rOwmId, ''), - supply: '', - } + const positionDetailsHrefs = { borrow: borrowPathnameFn(params, rOwmId), supply: '' } const hasSupplyPosition = (supplyPositionDetails.shares.value ?? 0) > 0 return isSuccess && !market ? ( @@ -119,7 +115,7 @@ const Page = () => { ) : provider ? ( <> - {rChainId && rOwmId && } + {rChainId && rOwmId && } { +const VaultDepositMint = ({ rChainId, rOwmId, isLoaded, api, market, userActiveKey }: PageContentProps) => { + const rFormType = 'deposit' const isSubscribed = useRef(false) const marketAlert = useMarketAlert(rChainId, rOwmId) @@ -176,7 +177,7 @@ const VaultDepositMint = ({ rChainId, rOwmId, rFormType, isLoaded, api, market, // steps useEffect(() => { - if (isLoaded && api && market && rFormType) { + if (isLoaded && api && market) { const updatedSteps = getSteps(activeKey, rFormType, api, market, formStatus, formValues, steps) setSteps(updatedSteps) } diff --git a/apps/main/src/lend/components/PageVault/VaultStake/index.tsx b/apps/main/src/lend/components/PageVault/VaultStake/index.tsx index 7a20024fdd..c88b03bf1c 100644 --- a/apps/main/src/lend/components/PageVault/VaultStake/index.tsx +++ b/apps/main/src/lend/components/PageVault/VaultStake/index.tsx @@ -24,7 +24,8 @@ import { t } from '@ui-kit/lib/i18n' import { LargeTokenInput } from '@ui-kit/shared/ui/LargeTokenInput' import { decimal, type Decimal } from '@ui-kit/utils' -const VaultStake = ({ rChainId, rOwmId, rFormType, isLoaded, api, market, userActiveKey }: PageContentProps) => { +const VaultStake = ({ rChainId, rOwmId, isLoaded, api, market, userActiveKey }: PageContentProps) => { + const rFormType = 'stake' const isSubscribed = useRef(false) const activeKey = useStore((state) => state.vaultStake.activeKey) diff --git a/apps/main/src/lend/components/PageVault/VaultTabs.tsx b/apps/main/src/lend/components/PageVault/VaultTabs.tsx new file mode 100644 index 0000000000..49e8e0ba1f --- /dev/null +++ b/apps/main/src/lend/components/PageVault/VaultTabs.tsx @@ -0,0 +1,32 @@ +import VaultClaim from '@/lend/components/PageVault/VaultClaim' +import VaultDepositMint from '@/lend/components/PageVault/VaultDepositMint' +import VaultStake from '@/lend/components/PageVault/VaultStake' +import VaultUnstake from '@/lend/components/PageVault/VaultUnstake' +import VaultWithdrawRedeem from '@/lend/components/PageVault/VaultWithdrawRedeem' +import { type MarketUrlParams, PageContentProps } from '@/lend/types/lend.types' +import { t } from '@ui-kit/lib/i18n' +import { FormTab, FormTabs } from '@ui-kit/shared/ui/FormTabs/FormTabs' + +type VaultProps = PageContentProps + +const menu = [ + { + value: 'deposit', + label: t`Deposit`, + subTabs: [ + { value: 'deposit', label: t`Deposit`, component: VaultDepositMint }, + { value: 'stake', label: t`Stake`, component: VaultStake }, + ], + }, + { + value: 'withdraw', + label: t`Withdraw`, + subTabs: [ + { value: 'withdraw', label: t`Withdraw`, component: VaultWithdrawRedeem }, + { value: 'unstake', label: t`Unstake`, component: VaultUnstake }, + { value: 'claim', label: t`Claim Rewards`, component: VaultClaim }, + ], + }, +] satisfies FormTab[] + +export const VaultTabs = (pageProps: VaultProps) => diff --git a/apps/main/src/lend/components/PageVault/VaultUnstake/index.tsx b/apps/main/src/lend/components/PageVault/VaultUnstake/index.tsx index 94278d61f5..4949ab340f 100644 --- a/apps/main/src/lend/components/PageVault/VaultUnstake/index.tsx +++ b/apps/main/src/lend/components/PageVault/VaultUnstake/index.tsx @@ -23,7 +23,8 @@ import { t } from '@ui-kit/lib/i18n' import { LargeTokenInput } from '@ui-kit/shared/ui/LargeTokenInput' import { decimal, type Decimal } from '@ui-kit/utils' -const VaultUnstake = ({ rChainId, rOwmId, rFormType, isLoaded, api, market, userActiveKey }: PageContentProps) => { +const VaultUnstake = ({ rChainId, rOwmId, isLoaded, api, market, userActiveKey }: PageContentProps) => { + const rFormType = 'unstake' const isSubscribed = useRef(false) const activeKey = useStore((state) => state.vaultUnstake.activeKey) diff --git a/apps/main/src/lend/components/PageVault/VaultWithdrawRedeem/index.tsx b/apps/main/src/lend/components/PageVault/VaultWithdrawRedeem/index.tsx index b44ea416ba..e4a2d01044 100644 --- a/apps/main/src/lend/components/PageVault/VaultWithdrawRedeem/index.tsx +++ b/apps/main/src/lend/components/PageVault/VaultWithdrawRedeem/index.tsx @@ -27,15 +27,8 @@ import { t } from '@ui-kit/lib/i18n' import { LargeTokenInput } from '@ui-kit/shared/ui/LargeTokenInput' import { decimal, type Decimal } from '@ui-kit/utils' -const VaultWithdrawRedeem = ({ - rChainId, - rOwmId, - rFormType, - isLoaded, - api, - market, - userActiveKey, -}: PageContentProps) => { +const VaultWithdrawRedeem = ({ rChainId, rOwmId, isLoaded, api, market, userActiveKey }: PageContentProps) => { + const rFormType = 'withdraw' const isSubscribed = useRef(false) const activeKey = useStore((state) => state.vaultWithdrawRedeem.activeKey) diff --git a/apps/main/src/lend/components/PageVault/index.tsx b/apps/main/src/lend/components/PageVault/index.tsx deleted file mode 100644 index a9e44c57c5..0000000000 --- a/apps/main/src/lend/components/PageVault/index.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { useEffect, useMemo, useState } from 'react' -import VaultClaim from '@/lend/components/PageVault/VaultClaim' -import VaultDepositMint from '@/lend/components/PageVault/VaultDepositMint' -import VaultStake from '@/lend/components/PageVault/VaultStake' -import VaultUnstake from '@/lend/components/PageVault/VaultUnstake' -import VaultWithdrawRedeem from '@/lend/components/PageVault/VaultWithdrawRedeem' -import { - type MarketUrlParams, - PageContentProps, - type VaultDepositFormType, - type VaultWithdrawFormType, -} from '@/lend/types/lend.types' -import { getVaultPathname } from '@/lend/utils/utilsRouter' -import Stack from '@mui/material/Stack' -import { AppFormContentWrapper } from '@ui/AppForm' -import { useNavigate } from '@ui-kit/hooks/router' -import { t } from '@ui-kit/lib/i18n' -import { type TabOption, TabsSwitcher } from '@ui-kit/shared/ui/TabsSwitcher' - -type FormType = 'deposit' | 'withdraw' - -const tabs: TabOption[] = [ - { value: 'deposit', label: t`Deposit` }, - { value: 'withdraw', label: t`Withdraw` }, -] - -const tabsDeposit: TabOption[] = [ - { value: 'deposit', label: t`Deposit` }, - { value: 'stake', label: t`Stake` }, -] - -const tabsWithdraw: TabOption[] = [ - { value: 'withdraw', label: t`Withdraw` }, - { value: 'unstake', label: t`Unstake` }, - { value: 'claim', label: t`Claim Rewards` }, -] - -const Vault = (pageProps: PageContentProps & { params: MarketUrlParams }) => { - const { rOwmId, rFormType, params } = pageProps - const push = useNavigate() - - type SubTab = VaultDepositFormType | VaultWithdrawFormType - const [subTab, setSubTab] = useState('deposit') - - const subTabs = useMemo(() => (!rFormType || rFormType === 'deposit' ? tabsDeposit : tabsWithdraw), [rFormType]) - useEffect(() => setSubTab(subTabs[0]?.value), [subTabs]) - - return ( - t.design.Layer[1].Fill }}> - push(getVaultPathname(params, rOwmId, key))} - options={tabs} - fullWidth - /> - - - - - {subTab === 'deposit' && } - {subTab === 'stake' && } - {subTab === 'withdraw' && } - {subTab === 'unstake' && } - {subTab === 'claim' && } - - - ) -} - -export default Vault diff --git a/apps/main/src/lend/constants.ts b/apps/main/src/lend/constants.ts index cac97898b8..06c99b8b98 100644 --- a/apps/main/src/lend/constants.ts +++ b/apps/main/src/lend/constants.ts @@ -1,13 +1,19 @@ import { LEND_ROUTES } from '@ui-kit/shared/routes' -export const ROUTE = { - ...LEND_ROUTES, - PAGE_INTEGRATIONS: '/integrations', +export const MARKET_ROUTES = { PAGE_CREATE: '/create', PAGE_MANAGE: '/manage', PAGE_VAULT: '/vault', +} as const + +export type LendMarketRoute = (typeof MARKET_ROUTES)[keyof typeof MARKET_ROUTES] + +export const ROUTE = { + ...LEND_ROUTES, + PAGE_INTEGRATIONS: '/integrations', + ...MARKET_ROUTES, PAGE_404: '/404', -} +} as const // TODO: translation export const NOFITY_MESSAGE = { diff --git a/apps/main/src/lend/hooks/useBorrowPositionDetails.ts b/apps/main/src/lend/hooks/useBorrowPositionDetails.ts index b465193a93..653c9dff10 100644 --- a/apps/main/src/lend/hooks/useBorrowPositionDetails.ts +++ b/apps/main/src/lend/hooks/useBorrowPositionDetails.ts @@ -34,11 +34,19 @@ export const useBorrowPositionDetails = ({ }: UseBorrowPositionDetailsProps): BorrowPositionDetailsProps => { const { controller } = market?.addresses ?? {} const { address: userAddress } = useAccount() - const { data: userLoanDetails, isLoading: isUserLoanDetailsLoading } = useUserLoanDetails({ + const { data: loanExists } = useLoanExists({ chainId, marketId, userAddress, }) + const { data: userLoanDetails, isLoading: isUserLoanDetailsLoading } = useUserLoanDetails( + { + chainId, + marketId, + userAddress, + }, + !!loanExists, + ) const { bands, health, @@ -49,11 +57,6 @@ export const useBorrowPositionDetails = ({ state: { collateral, borrowed, debt } = {}, } = userLoanDetails ?? {} const prices = useStore((state) => state.markets.pricesMapper[chainId]?.[marketId]) - const { data: loanExists } = useLoanExists({ - chainId, - marketId, - userAddress, - }) const { data: userPnl, isLoading: isUserPnlLoading } = useUserPnl({ chainId, marketId, diff --git a/apps/main/src/lend/types/lend.types.ts b/apps/main/src/lend/types/lend.types.ts index 3da350ce59..9f3639f2af 100644 --- a/apps/main/src/lend/types/lend.types.ts +++ b/apps/main/src/lend/types/lend.types.ts @@ -19,7 +19,7 @@ export type EstimatedGas = number | number[] | null export type OneWayMarketTemplate = LendMarketTemplate // todo: use LendMarketTemplate consistently export type NetworkUrlParams = { network: NetworkEnum } -export type MarketUrlParams = NetworkUrlParams & { market: string; formType?: RFormType } +export type MarketUrlParams = NetworkUrlParams & { market: string } export type UrlParams = NetworkUrlParams & Partial export interface NetworkConfig extends BaseConfig< @@ -80,17 +80,10 @@ export type ExpectedBorrowed = { avgPrice: string } -export type VaultCreateFormType = 'create' | 'leverage' -export type VaultDepositFormType = 'deposit' | 'stake' -export type VaultWithdrawFormType = 'withdraw' | 'unstake' | 'claim' -export type VaultManageFormType = 'loan' | 'collateral' -export type RFormType = VaultCreateFormType | VaultDepositFormType | VaultWithdrawFormType | VaultManageFormType | '' - -export type PageContentProps = { - params: UrlParams +export type PageContentProps = { + params: T rChainId: ChainId rOwmId: string - rFormType: RFormType userActiveKey: string isLoaded: boolean api: LlamaApi | null diff --git a/apps/main/src/lend/utils/helpers.ts b/apps/main/src/lend/utils/helpers.ts index 72f14081fe..141a72dd62 100644 --- a/apps/main/src/lend/utils/helpers.ts +++ b/apps/main/src/lend/utils/helpers.ts @@ -30,14 +30,6 @@ export function getErrorMessage(error: CustomError, defaultErrorMessage: string) return errorMessage } -export function scrollToTop() { - window.scroll({ - top: 0, - left: 0, - behavior: 'smooth', - }) -} - export function fulfilledValue(result: PromiseSettledResult) { if (result.status === 'fulfilled') { return result.value diff --git a/apps/main/src/lend/utils/utilsRouter.ts b/apps/main/src/lend/utils/utilsRouter.ts index 2c490a76f1..ac2bbde7c8 100644 --- a/apps/main/src/lend/utils/utilsRouter.ts +++ b/apps/main/src/lend/utils/utilsRouter.ts @@ -1,4 +1,4 @@ -import { ROUTE } from '@/lend/constants' +import { type LendMarketRoute, ROUTE } from '@/lend/constants' import { networksIdMapper } from '@/lend/networks' import { type MarketUrlParams, NetworkUrlParams, type UrlParams } from '@/lend/types/lend.types' import { getInternalUrl, LLAMALEND_ROUTES } from '@ui-kit/shared/routes' @@ -9,17 +9,19 @@ export const getPath = ({ network }: UrlParams, route: string) => getInternalUrl export const getCollateralListPathname = ({ network }: NetworkUrlParams) => getInternalUrl('llamalend', network, LLAMALEND_ROUTES.PAGE_MARKETS) -export const getLoanCreatePathname = (params: UrlParams, owmId: string, formType: string) => - getPath(params, `${ROUTE.PAGE_MARKETS}/${owmId}${ROUTE.PAGE_CREATE}${formType === 'create' ? '' : `/${formType}`}`) +const getMarketPathname = ({ network }: UrlParams, marketId: string, page: LendMarketRoute) => + `${getInternalUrl('lend', network, ROUTE.PAGE_MARKETS)}/${marketId}${page}` -export const getLoanManagePathname = (params: UrlParams, owmId: string, formType: string) => - getPath(params, `${ROUTE.PAGE_MARKETS}/${owmId}${ROUTE.PAGE_MANAGE}/${formType}`) +export const getLoanCreatePathname = (params: UrlParams, marketId: string) => + getMarketPathname(params, marketId, ROUTE.PAGE_CREATE) -export const getVaultPathname = (params: UrlParams, owmId: string, formType: string) => - getPath(params, `${ROUTE.PAGE_MARKETS}/${owmId}${ROUTE.PAGE_VAULT}${formType === 'vault' ? '' : `/${formType}`}`) +export const getLoanManagePathname = (params: UrlParams, marketId: string) => + getMarketPathname(params, marketId, ROUTE.PAGE_MANAGE) -export const parseMarketParams = ({ formType, market, network }: MarketUrlParams) => ({ +export const getVaultPathname = (params: UrlParams, marketId: string) => + getMarketPathname(params, marketId, ROUTE.PAGE_VAULT) + +export const parseMarketParams = ({ market, network }: MarketUrlParams) => ({ rMarket: market.toLowerCase(), rChainId: networksIdMapper[network], - rFormType: formType ?? '', }) diff --git a/apps/main/src/llamalend/features/manage-loan/components/AddCollateralForm.tsx b/apps/main/src/llamalend/features/manage-loan/components/AddCollateralForm.tsx index e220cdcd39..2b7996d65b 100644 --- a/apps/main/src/llamalend/features/manage-loan/components/AddCollateralForm.tsx +++ b/apps/main/src/llamalend/features/manage-loan/components/AddCollateralForm.tsx @@ -25,7 +25,7 @@ export const AddCollateralForm = ({ networks: NetworkDict chainId: ChainId enabled?: boolean - onAdded: NonNullable + onAdded?: NonNullable }) => { const network = networks[chainId] const [isOpen, , , toggle] = useSwitch(false) diff --git a/apps/main/src/llamalend/features/manage-loan/components/RemoveCollateralForm.tsx b/apps/main/src/llamalend/features/manage-loan/components/RemoveCollateralForm.tsx index 627257bccf..9041ad73ab 100644 --- a/apps/main/src/llamalend/features/manage-loan/components/RemoveCollateralForm.tsx +++ b/apps/main/src/llamalend/features/manage-loan/components/RemoveCollateralForm.tsx @@ -27,7 +27,7 @@ export const RemoveCollateralForm = ({ networks: NetworkDict chainId: ChainId enabled?: boolean - onRemoved: NonNullable + onRemoved?: NonNullable }) => { const network = networks[chainId] const [isOpen, , , toggle] = useSwitch(false) diff --git a/apps/main/src/llamalend/features/manage-loan/components/RepayForm.tsx b/apps/main/src/llamalend/features/manage-loan/components/RepayForm.tsx index ea5a326864..2a3eead762 100644 --- a/apps/main/src/llamalend/features/manage-loan/components/RepayForm.tsx +++ b/apps/main/src/llamalend/features/manage-loan/components/RepayForm.tsx @@ -20,12 +20,18 @@ export const RepayForm = ({ chainId, enabled, onRepaid, + fromCollateral, + fromWallet, + fromBorrowed, }: { market: LlamaMarketTemplate | undefined networks: NetworkDict chainId: ChainId enabled?: boolean - onRepaid: NonNullable + onRepaid?: RepayOptions['onRepaid'] + fromCollateral?: boolean + fromWallet?: boolean + fromBorrowed?: boolean }) => { const network = networks[chainId] const [isOpen, , , toggle] = useSwitch(false) @@ -86,33 +92,39 @@ export const RepayForm = ({ } > }> - - - + {fromCollateral && ( + + )} + {fromWallet && ( + + )} + {fromBorrowed && ( + + )}