mango-v4-ui/components/trade/MarketSelectDropdown.tsx

182 lines
7.3 KiB
TypeScript
Raw Normal View History

2023-02-22 11:04:18 -08:00
// import ChartRangeButtons from '@components/shared/ChartRangeButtons'
2023-04-03 19:48:31 -07:00
import Change from '@components/shared/Change'
2022-11-30 07:46:20 -08:00
import FavoriteMarketButton from '@components/shared/FavoriteMarketButton'
2023-04-03 19:48:31 -07:00
import SheenLoader from '@components/shared/SheenLoader'
import { getOneDayPerpStats } from '@components/stats/PerpMarketsTable'
2022-11-30 07:46:20 -08:00
import { Popover } from '@headlessui/react'
import { ChevronDownIcon } from '@heroicons/react/20/solid'
import mangoStore from '@store/mangoStore'
2023-04-03 19:48:31 -07:00
import { useBirdeyeMarketPrices } from 'hooks/useBirdeyeMarketPrices'
import useMangoGroup from 'hooks/useMangoGroup'
2022-11-30 07:46:20 -08:00
import useSelectedMarket from 'hooks/useSelectedMarket'
2023-02-22 11:04:18 -08:00
import { useTranslation } from 'next-i18next'
2022-11-30 07:46:20 -08:00
import Link from 'next/link'
2023-02-22 11:04:18 -08:00
import { useMemo } from 'react'
2022-11-30 07:46:20 -08:00
import { DEFAULT_MARKET_NAME } from 'utils/constants'
import MarketLogos from './MarketLogos'
const MarketSelectDropdown = () => {
2023-02-22 11:04:18 -08:00
const { t } = useTranslation('common')
2022-11-30 07:46:20 -08:00
const { selectedMarket } = useSelectedMarket()
const serumMarkets = mangoStore((s) => s.serumMarkets)
2023-01-19 20:17:43 -08:00
const allPerpMarkets = mangoStore((s) => s.perpMarkets)
2023-04-03 19:48:31 -07:00
const perpStats = mangoStore((s) => s.perpStats.data)
const loadingPerpStats = mangoStore((s) => s.perpStats.loading)
const { group } = useMangoGroup()
const { data: birdeyePrices, isLoading: loadingPrices } =
useBirdeyeMarketPrices()
2023-02-22 11:04:18 -08:00
// const [spotBaseFilter, setSpotBaseFilter] = useState('All')
2022-11-30 07:46:20 -08:00
2023-01-19 20:17:43 -08:00
const perpMarkets = useMemo(() => {
2023-02-13 16:37:23 -08:00
return allPerpMarkets
.filter(
(p) =>
p.publicKey.toString() !==
'9Y8paZ5wUpzLFfQuHz8j2RtPrKsDtHx9sbgFmWb5abCw'
)
.sort((a, b) => a.name.localeCompare(b.name))
2023-01-19 20:17:43 -08:00
}, [allPerpMarkets])
2023-02-22 11:04:18 -08:00
// const spotBaseTokens: string[] = useMemo(() => {
// if (serumMarkets.length) {
// const baseTokens: string[] = []
// serumMarkets.map((m) => {
// const base = m.name.split('/')[1]
// if (!baseTokens.includes(base)) {
// baseTokens.push(base)
// }
// })
// return baseTokens
// }
// return []
// }, [serumMarkets])
2022-11-30 07:46:20 -08:00
return (
<Popover>
2023-02-22 11:04:18 -08:00
{({ open, close }) => (
2022-11-30 07:46:20 -08:00
<div
className="relative -ml-2 flex flex-col overflow-visible"
2022-11-30 07:46:20 -08:00
id="trade-step-one"
>
2023-04-19 18:12:45 -07:00
<Popover.Button className="-ml-4 flex h-12 items-center justify-between px-4 focus-visible:bg-th-bkg-3 md:hover:bg-th-bkg-2">
2022-12-06 21:25:37 -08:00
<div className="flex items-center">
2022-11-30 07:46:20 -08:00
{selectedMarket ? <MarketLogos market={selectedMarket} /> : null}
2022-12-06 21:25:37 -08:00
<div className="whitespace-nowrap text-xl font-bold text-th-fgd-1 md:text-base">
{selectedMarket?.name || DEFAULT_MARKET_NAME}
</div>
2022-11-30 07:46:20 -08:00
</div>
<ChevronDownIcon
className={`${
open ? 'rotate-180' : 'rotate-360'
2022-12-06 21:25:37 -08:00
} mt-0.5 ml-2 h-6 w-6 flex-shrink-0 text-th-fgd-2`}
2022-11-30 07:46:20 -08:00
/>
</Popover.Button>
2023-04-03 19:48:31 -07:00
<Popover.Panel className="absolute -left-4 top-12 z-40 mr-4 w-screen rounded-none bg-th-bkg-2 pb-4 pt-2 md:-left-6 md:w-96 md:rounded-br-md">
2023-03-05 19:33:13 -08:00
<p className="my-2 ml-4 text-xs md:ml-6">{t('perp')}</p>
2023-02-22 11:04:18 -08:00
{perpMarkets?.length
? perpMarkets.map((m) => {
2023-04-03 19:48:31 -07:00
const changeData = getOneDayPerpStats(perpStats, m.name)
const change = changeData.length
? ((m.uiPrice - changeData[0].price) /
changeData[0].price) *
100
: 0
2023-02-22 11:04:18 -08:00
return (
<div
2023-03-05 19:33:13 -08:00
className="flex items-center justify-between py-2 px-4 md:px-6"
2023-02-22 11:04:18 -08:00
key={m.publicKey.toString()}
onClick={() => {
close()
}}
>
<Link
2023-04-19 18:12:45 -07:00
className="flex items-center hover:cursor-pointer focus:outline-none focus-visible:text-th-active md:hover:text-th-fgd-3"
2023-02-22 11:04:18 -08:00
href={{
pathname: '/trade',
query: { name: m.name },
}}
shallow={true}
>
<MarketLogos market={m} />
<span>{m.name}</span>
2023-02-22 11:04:18 -08:00
</Link>
2023-04-03 19:48:31 -07:00
<div className="flex items-center space-x-3">
{!loadingPerpStats ? (
<Change change={change} suffix="%" />
) : (
<SheenLoader className="mt-0.5">
<div className="h-3.5 w-12 bg-th-bkg-2" />
</SheenLoader>
)}
<FavoriteMarketButton market={m} />
</div>
2023-02-22 11:04:18 -08:00
</div>
)
})
: null}
2023-03-05 19:33:13 -08:00
<p className="my-2 ml-4 text-xs md:ml-6">{t('spot')}</p>
2023-02-22 11:04:18 -08:00
{serumMarkets?.length ? (
<>
{serumMarkets
.map((x) => x)
.sort((a, b) => a.name.localeCompare(b.name))
.map((m) => {
2023-04-03 19:48:31 -07:00
const birdeyeData = birdeyePrices?.length
? birdeyePrices.find(
(market) =>
market.mint === m.serumMarketExternal.toString()
)
: null
const bank = group?.getFirstBankByTokenIndex(
m.baseTokenIndex
)
const change =
birdeyeData && bank
? ((bank.uiPrice - birdeyeData.data[0].value) /
birdeyeData.data[0].value) *
100
: 0
return (
<div
2023-03-05 19:33:13 -08:00
className="flex items-center justify-between py-2 px-4 md:px-6"
key={m.publicKey.toString()}
2023-03-04 12:59:42 -08:00
onClick={() => {
close()
}}
>
<Link
2023-04-19 18:12:45 -07:00
className="flex items-center hover:cursor-pointer focus:outline-none focus-visible:text-th-active md:hover:text-th-fgd-3"
href={{
pathname: '/trade',
query: { name: m.name },
}}
shallow={true}
2022-11-30 07:46:20 -08:00
>
<MarketLogos market={m} />
<span>{m.name}</span>
</Link>
2023-04-03 19:48:31 -07:00
<div className="flex items-center space-x-3">
{!loadingPrices ? (
<Change change={change} suffix="%" />
) : (
<SheenLoader className="mt-0.5">
<div className="h-3.5 w-12 bg-th-bkg-2" />
</SheenLoader>
)}
<FavoriteMarketButton market={m} />
</div>
</div>
)
2023-02-22 11:04:18 -08:00
})}
</>
) : null}
2022-11-30 07:46:20 -08:00
</Popover.Panel>
</div>
)}
</Popover>
)
}
export default MarketSelectDropdown