filter by spot market base

This commit is contained in:
saml33 2022-11-30 16:30:18 +11:00
parent 443858dc36
commit 02495833e5
7 changed files with 90 additions and 55 deletions

View File

@ -1,7 +1,7 @@
export const fetchChartData = async ( export const fetchChartData = async (
baseTokenId: string | undefined, baseTokenId: string | undefined,
quoteTokenId: string | undefined, quoteTokenId: string | undefined,
daysToShow: number daysToShow: string
) => { ) => {
console.log('fetching chart:', baseTokenId, quoteTokenId) console.log('fetching chart:', baseTokenId, quoteTokenId)

View File

@ -26,13 +26,13 @@ const AccountChart = ({
}) => { }) => {
const { t } = useTranslation('common') const { t } = useTranslation('common')
const actions = mangoStore((s) => s.actions) const actions = mangoStore((s) => s.actions)
const [daysToShow, setDaysToShow] = useState<number>(1) const [daysToShow, setDaysToShow] = useState<string>('1')
const loading = mangoStore((s) => s.mangoAccount.stats.performance.loading) const loading = mangoStore((s) => s.mangoAccount.stats.performance.loading)
const handleDaysToShow = async (days: number) => { const handleDaysToShow = async (days: string) => {
await actions.fetchAccountPerformance( await actions.fetchAccountPerformance(
mangoAccount.publicKey.toString(), mangoAccount.publicKey.toString(),
days parseInt(days)
) )
setDaysToShow(days) setDaysToShow(days)
} }

View File

@ -1,10 +1,10 @@
import { FunctionComponent } from 'react' import { FunctionComponent } from 'react'
interface ChartRangeButtonsProps { interface ChartRangeButtonsProps {
activeValue: number activeValue: string
className?: string className?: string
onChange: (x: number) => void onChange: (x: string) => void
values: Array<number> values: Array<string>
names?: Array<string> names?: Array<string>
} }
@ -20,7 +20,7 @@ const ChartRangeButtons: FunctionComponent<ChartRangeButtonsProps> = ({
<div className="relative flex"> <div className="relative flex">
{activeValue && values.includes(activeValue) ? ( {activeValue && values.includes(activeValue) ? (
<div <div
className={`default-transition absolute left-0 top-0 h-full transform rounded-md bg-th-bkg-2`} className={`default-transition absolute left-0 top-0 h-full transform rounded-md bg-th-bkg-3`}
style={{ style={{
transform: `translateX(${ transform: `translateX(${
values.findIndex((v) => v === activeValue) * 100 values.findIndex((v) => v === activeValue) * 100

View File

@ -30,11 +30,11 @@ dayjs.extend(relativeTime)
interface DetailedAreaChartProps { interface DetailedAreaChartProps {
data: any[] data: any[]
daysToShow: number daysToShow: string
hideChange?: boolean hideChange?: boolean
hideChart?: () => void hideChart?: () => void
loading?: boolean loading?: boolean
setDaysToShow: (x: number) => void setDaysToShow: (x: string) => void
tickFormat?: (x: any) => string tickFormat?: (x: any) => string
title?: string title?: string
xKey: string xKey: string
@ -51,7 +51,7 @@ export const formatDateAxis = (date: string, days: number) => {
const DetailedAreaChart: FunctionComponent<DetailedAreaChartProps> = ({ const DetailedAreaChart: FunctionComponent<DetailedAreaChartProps> = ({
data, data,
daysToShow = 1, daysToShow = '1',
hideChange, hideChange,
hideChart, hideChart,
loading, loading,
@ -183,7 +183,7 @@ const DetailedAreaChart: FunctionComponent<DetailedAreaChartProps> = ({
<ChartRangeButtons <ChartRangeButtons
activeValue={daysToShow} activeValue={daysToShow}
names={['24H', '7D', '30D']} names={['24H', '7D', '30D']}
values={[1, 7, 30]} values={['1', '7', '30']}
onChange={(v) => setDaysToShow(v)} onChange={(v) => setDaysToShow(v)}
/> />
</div> </div>
@ -252,7 +252,9 @@ const DetailedAreaChart: FunctionComponent<DetailedAreaChartProps> = ({
fontSize: 10, fontSize: 10,
}} }}
tickLine={false} tickLine={false}
tickFormatter={(d) => formatDateAxis(d, daysToShow)} tickFormatter={(d) =>
formatDateAxis(d, parseInt(daysToShow))
}
/> />
<YAxis <YAxis
axisLine={false} axisLine={false}

View File

@ -76,7 +76,7 @@ const SwapTokenChart = () => {
const [baseTokenId, setBaseTokenId] = useState(inputCoingeckoId) const [baseTokenId, setBaseTokenId] = useState(inputCoingeckoId)
const [quoteTokenId, setQuoteTokenId] = useState(outputCoingeckoId) const [quoteTokenId, setQuoteTokenId] = useState(outputCoingeckoId)
const [mouseData, setMouseData] = useState<any>(null) const [mouseData, setMouseData] = useState<any>(null)
const [daysToShow, setDaysToShow] = useState(1) const [daysToShow, setDaysToShow] = useState('1')
const { theme } = useTheme() const { theme } = useTheme()
const [animationSettings] = useLocalStorageState( const [animationSettings] = useLocalStorageState(
ANIMATION_SETTINGS_KEY, ANIMATION_SETTINGS_KEY,
@ -245,7 +245,7 @@ const SwapTokenChart = () => {
<ChartRangeButtons <ChartRangeButtons
activeValue={daysToShow} activeValue={daysToShow}
names={['24H', '7D', '30D']} names={['24H', '7D', '30D']}
values={[1, 7, 30]} values={['1', '7', '30']}
onChange={(v) => setDaysToShow(v)} onChange={(v) => setDaysToShow(v)}
/> />
</div> </div>

View File

@ -1,4 +1,5 @@
import Change from '@components/shared/Change' import Change from '@components/shared/Change'
import ChartRangeButtons from '@components/shared/ChartRangeButtons'
import FavoriteMarketButton from '@components/shared/FavoriteMarketButton' import FavoriteMarketButton from '@components/shared/FavoriteMarketButton'
import TabUnderline from '@components/shared/TabUnderline' import TabUnderline from '@components/shared/TabUnderline'
import { Popover } from '@headlessui/react' import { Popover } from '@headlessui/react'
@ -19,6 +20,21 @@ const MarketSelectDropdown = () => {
const serumMarkets = mangoStore((s) => s.serumMarkets) const serumMarkets = mangoStore((s) => s.serumMarkets)
const perpMarkets = mangoStore((s) => s.perpMarkets) const perpMarkets = mangoStore((s) => s.perpMarkets)
const [activeTab, setActiveTab] = useState('perp') const [activeTab, setActiveTab] = useState('perp')
const [spotBaseFilter, setSpotBaseFilter] = useState('All')
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])
return ( return (
<Popover> <Popover>
@ -47,40 +63,57 @@ const MarketSelectDropdown = () => {
small small
values={['perp', 'spot']} values={['perp', 'spot']}
/> />
{activeTab === 'spot' {activeTab === 'spot' ? (
? serumMarkets?.length serumMarkets?.length ? (
? serumMarkets.map((m) => { <>
return ( <div className="mb-2 w-56 px-4">
<div <ChartRangeButtons
className="flex items-center justify-between py-2 px-4" activeValue={spotBaseFilter}
key={m.publicKey.toString()} values={['All', ...spotBaseTokens]}
> onChange={(v) => setSpotBaseFilter(v)}
<Link />
href={{ </div>
pathname: '/trade', {serumMarkets
query: { name: m.name }, .filter((mkt) => {
}} if (spotBaseFilter === 'All') {
shallow={true} return mkt
} else {
return mkt.name.split('/')[1] === spotBaseFilter
}
})
.map((m) => {
return (
<div
className="flex items-center justify-between py-2 px-4"
key={m.publicKey.toString()}
> >
<div className="default-transition flex items-center hover:cursor-pointer hover:text-th-primary"> <Link
<MarketLogos market={m} /> href={{
<span pathname: '/trade',
className={ query: { name: m.name },
m.name === selectedMarket?.name }}
? 'text-th-primary' shallow={true}
: '' >
} <div className="default-transition flex items-center hover:cursor-pointer hover:text-th-primary">
> <MarketLogos market={m} />
{m.name} <span
</span> className={
</div> m.name === selectedMarket?.name
</Link> ? 'text-th-primary'
<FavoriteMarketButton market={m} /> : ''
</div> }
) >
}) {m.name}
: null </span>
: null} </div>
</Link>
<FavoriteMarketButton market={m} />
</div>
)
})}
</>
) : null
) : null}
{activeTab === 'perp' {activeTab === 'perp'
? perpMarkets?.length ? perpMarkets?.length
? perpMarkets.map((m) => { ? perpMarkets.map((m) => {

View File

@ -86,7 +86,7 @@ const Token: NextPage = () => {
const { isLoading: loadingPrices, data: coingeckoPrices } = useCoingecko() const { isLoading: loadingPrices, data: coingeckoPrices } = useCoingecko()
const [chartData, setChartData] = useState<{ prices: any[] } | null>(null) const [chartData, setChartData] = useState<{ prices: any[] } | null>(null)
const [loadChartData, setLoadChartData] = useState(true) const [loadChartData, setLoadChartData] = useState(true)
const [daysToShow, setDaysToShow] = useState<number>(1) const [daysToShow, setDaysToShow] = useState<string>('1')
const [animationSettings] = useLocalStorageState( const [animationSettings] = useLocalStorageState(
ANIMATION_SETTINGS_KEY, ANIMATION_SETTINGS_KEY,
INITIAL_ANIMATION_SETTINGS INITIAL_ANIMATION_SETTINGS
@ -177,11 +177,11 @@ const Token: NextPage = () => {
} = coingeckoData ? coingeckoData.market_data : DEFAULT_COINGECKO_VALUES } = coingeckoData ? coingeckoData.market_data : DEFAULT_COINGECKO_VALUES
const loadingChart = useMemo(() => { const loadingChart = useMemo(() => {
return daysToShow == 1 ? loadingPrices : loadChartData return daysToShow == '1' ? loadingPrices : loadChartData
}, [loadChartData, loadingPrices]) }, [loadChartData, loadingPrices])
const coingeckoTokenPrices = useMemo(() => { const coingeckoTokenPrices = useMemo(() => {
if (daysToShow === 1 && coingeckoPrices.length && bank) { if (daysToShow === '1' && coingeckoPrices.length && bank) {
const tokenPriceData = coingeckoPrices.find( const tokenPriceData = coingeckoPrices.find(
(asset) => asset.symbol === bank.name (asset) => asset.symbol === bank.name
) )
@ -197,8 +197,8 @@ const Token: NextPage = () => {
return [] return []
}, [coingeckoPrices, bank, daysToShow, chartData, loadingChart]) }, [coingeckoPrices, bank, daysToShow, chartData, loadingChart])
const handleDaysToShow = async (days: number) => { const handleDaysToShow = async (days: string) => {
if (days !== 1) { if (days !== '1') {
try { try {
const response = await fetch( const response = await fetch(
`https://api.coingecko.com/api/v3/coins/${coingeckoId}/market_chart?vs_currency=usd&days=${days}` `https://api.coingecko.com/api/v3/coins/${coingeckoId}/market_chart?vs_currency=usd&days=${days}`
@ -406,12 +406,12 @@ const Token: NextPage = () => {
<ChartRangeButtons <ChartRangeButtons
activeValue={daysToShow} activeValue={daysToShow}
names={['24H', '7D', '30D']} names={['24H', '7D', '30D']}
values={[1, 7, 30]} values={['1', '7', '30']}
onChange={(v) => handleDaysToShow(v)} onChange={(v) => handleDaysToShow(v)}
/> />
</div> </div>
<PriceChart <PriceChart
daysToShow={daysToShow} daysToShow={parseInt(daysToShow)}
prices={coingeckoTokenPrices} prices={coingeckoTokenPrices}
/> />
</> </>