Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(EX-2925): url for detail pool #2604

Merged
merged 5 commits into from
Feb 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 68 additions & 3 deletions src/pages/Earns/PoolExplorer/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { t } from '@lingui/macro'
import { useEffect, useState } from 'react'
import { useCallback, useEffect, useState } from 'react'
import { Info, Star } from 'react-feather'
import { useNavigate, useSearchParams } from 'react-router-dom'
import { useMedia } from 'react-use'
Expand All @@ -11,13 +11,16 @@ import { ReactComponent as IconHighlightedPool } from 'assets/svg/ic_pool_highli
import { ReactComponent as IconLowVolatility } from 'assets/svg/ic_pool_low_volatility.svg'
import { ReactComponent as IconSolidEarningPool } from 'assets/svg/ic_pool_solid_earning.svg'
import { ReactComponent as IconUserEarnPosition } from 'assets/svg/ic_user_earn_position.svg'
import { NotificationType } from 'components/Announcement/type'
import Pagination from 'components/Pagination'
import Search from 'components/Search'
import { MouseoverTooltip, MouseoverTooltipDesktopOnly } from 'components/Tooltip'
import { BFF_API } from 'constants/env'
import { APP_PATHS } from 'constants/index'
import useDebounce from 'hooks/useDebounce'
import useTheme from 'hooks/useTheme'
import SortIcon, { Direction } from 'pages/MarketOverview/SortIcon'
import { useNotify } from 'state/application/hooks'
import { MEDIA_WIDTHS } from 'theme'

import { IconArrowLeft } from '../PositionDetail/styles'
Expand Down Expand Up @@ -88,9 +91,10 @@ export const timings: MenuOption[] = [
const Earn = () => {
const [search, setSearch] = useState('')
const deboundedSearch = useDebounce(search, 300)
const [searchParams] = useSearchParams()
const [searchParams, setSearchParams] = useSearchParams()
const navigate = useNavigate()
const theme = useTheme()
const notify = useNotify()
const { filters, updateFilters } = useFilter(setSearch)
const { liquidityWidget, handleOpenZapInWidget } = useLiquidityWidget()
const { data: poolData, isError } = usePoolsExplorerQuery(filters, { pollingInterval: 5 * 60_000 })
Expand Down Expand Up @@ -123,6 +127,40 @@ const Earn = () => {
updateFilters('orderBy', '')
}

const handleFetchPoolData = async ({ chainId, address }: { chainId: number; address: string }) => {
try {
const response = await fetch(
`${BFF_API}/v1/pools` +
'?' +
new URLSearchParams({
chainId: chainId.toString(),
ids: address,
}).toString(),
)
const data = await response.json()
return data?.data?.pools?.[0]
} catch (error) {
console.log('Fetch Pool Data Error:', error)
return
}
}

const handleOpenZapInWidgetWithParams = (pool: { exchange: string; chainId?: number; address: string }) => {
const { exchange, chainId, address } = pool
searchParams.set('exchange', exchange)
searchParams.set('poolChainId', chainId ? chainId.toString() : filters.chainId.toString())
searchParams.set('poolAddress', address)
setSearchParams(searchParams)
handleOpenZapInWidget(pool)
}

const handleRemoveUrlParams = useCallback(() => {
searchParams.delete('exchange')
searchParams.delete('poolChainId')
searchParams.delete('poolAddress')
setSearchParams(searchParams)
}, [searchParams, setSearchParams])

useEffect(() => {
if (searchParams.get('q') && !search) {
setSearch(searchParams.get('q') || '')
Expand All @@ -136,6 +174,33 @@ const Earn = () => {
}
}, [deboundedSearch, filters.q, updateFilters])

useEffect(() => {
const exchange = searchParams.get('exchange')
const chainId = searchParams.get('poolChainId')
const address = searchParams.get('poolAddress')
if (!exchange || !chainId || !address) {
handleRemoveUrlParams()
return
}
;(async () => {
const pool = await handleFetchPoolData({ chainId: Number(chainId), address })
if (pool && pool.exchange === exchange)
handleOpenZapInWidget({ exchange, chainId: Number(chainId), address: pool.address })
else {
notify(
{
title: `Open pool detail failed`,
summary: `Invalid pool info`,
type: NotificationType.ERROR,
},
5000,
)
handleRemoveUrlParams()
}
})()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

return (
<PoolPageWrapper>
{liquidityWidget}
Expand Down Expand Up @@ -274,7 +339,7 @@ const Earn = () => {
<div />
</TableHeader>
)}
<TableContent onOpenZapInWidget={handleOpenZapInWidget} />
<TableContent onOpenZapInWidget={handleOpenZapInWidgetWithParams} />
</ContentWrapper>
{!isError && (
<Pagination
Expand Down
44 changes: 32 additions & 12 deletions src/pages/Earns/useLiquidityWidget.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import '@kyberswap/liquidity-widgets/dist/style.css'
import { ZapMigration, ChainId as ZapMigrationChainId, Dex as ZapMigrationDex } from '@kyberswap/zap-migration-widgets'
import '@kyberswap/zap-migration-widgets/dist/style.css'
import { useCallback, useEffect, useMemo, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate, useSearchParams } from 'react-router-dom'
import { usePreviousDistinct } from 'react-use'
import { EarnDex } from 'services/zapEarn'

Expand Down Expand Up @@ -91,6 +91,7 @@ const useLiquidityWidget = () => {
const { library } = useWeb3React()
const { account, chainId } = useActiveWeb3React()
const { filters } = useFilter()
const [searchParams, setSearchParams] = useSearchParams()

const [addLiquidityPureParams, setAddLiquidityPureParams] = useState<AddLiquidityPureParams | null>(null)
const [migrateLiquidityPureParams, setMigrateLiquidityPureParams] = useState<MigrateLiquidityPureParams | null>(null)
Expand Down Expand Up @@ -142,6 +143,14 @@ const useLiquidityWidget = () => {
[addLiquidityPureParams, notify],
)

const handleCloseZapInWidget = useCallback(() => {
searchParams.delete('exchange')
searchParams.delete('poolChainId')
searchParams.delete('poolAddress')
setSearchParams(searchParams)
setAddLiquidityPureParams(null)
}, [searchParams, setSearchParams])

const handleOpenZapInWidget = (
pool: { exchange: string; chainId?: number; address: string },
positionId?: string,
Expand Down Expand Up @@ -184,14 +193,14 @@ const useLiquidityWidget = () => {
source: 'KyberSwap-Earn',
referral: refCode,
onViewPosition: () => {
setAddLiquidityPureParams(null)
handleCloseZapInWidget()
navigate(`/earns/positions`)
},
connectedAccount: {
address: account,
chainId: chainId,
},
onClose: () => setAddLiquidityPureParams(null),
onClose: () => handleCloseZapInWidget(),
onConnectWallet: toggleWalletModal,
onSwitchChain: () => changeNetwork(addLiquidityPureParams.chainId as number),
onOpenZapMigration: handleOpenZapMigrationWidget,
Expand All @@ -211,14 +220,15 @@ const useLiquidityWidget = () => {
: null,
[
addLiquidityPureParams,
account,
refCode,
account,
chainId,
toggleWalletModal,
handleOpenZapMigrationWidget,
library,
changeNetwork,
handleCloseZapInWidget,
navigate,
changeNetwork,
library,
],
)

Expand All @@ -240,7 +250,7 @@ const useLiquidityWidget = () => {

onClose: () => {
setMigrateLiquidityPureParams(null)
setAddLiquidityPureParams(null)
handleCloseZapInWidget()
},
onBack: () => setMigrateLiquidityPureParams(null),
onConnectWallet: toggleWalletModal,
Expand All @@ -258,7 +268,17 @@ const useLiquidityWidget = () => {
},
}
: null,
[account, chainId, library, migrateLiquidityPureParams, changeNetwork, toggleWalletModal, navigate, refCode],
[
migrateLiquidityPureParams,
refCode,
account,
chainId,
toggleWalletModal,
navigate,
handleCloseZapInWidget,
changeNetwork,
library,
],
)

const [zapOutPureParams, setZapOutPureParams] = useState<{
Expand Down Expand Up @@ -332,16 +352,16 @@ const useLiquidityWidget = () => {
const previousAccount = usePreviousDistinct(account)
useEffect(() => {
if (account && previousAccount) {
setAddLiquidityPureParams(null)
handleCloseZapInWidget()
setMigrateLiquidityPureParams(null)
setZapOutPureParams(null)
}
}, [account, previousAccount])
}, [account, handleCloseZapInWidget, previousAccount])

const liquidityWidget = (
<>
{addLiquidityParams && (
<Modal isOpen mobileFullWidth maxWidth={760} width={'760px'} onDismiss={() => setAddLiquidityPureParams(null)}>
<Modal isOpen mobileFullWidth maxWidth={760} width={'760px'} onDismiss={handleCloseZapInWidget}>
<LiquidityWidget {...addLiquidityParams} />
</Modal>
)}
Expand All @@ -353,7 +373,7 @@ const useLiquidityWidget = () => {
width={'760px'}
onDismiss={() => {
setMigrateLiquidityPureParams(null)
setAddLiquidityPureParams(null)
handleCloseZapInWidget()
}}
zindex={9999}
>
Expand Down
Loading