utils#getPriceColor TypeScript Examples
The following examples show how to use
utils#getPriceColor.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: TokensTable.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
TokensTable: React.FC<TokensTableProps> = ({ data }) => {
const tokenHeadCells = headCells();
const classes = useStyles();
const { palette } = useTheme();
const {
bookmarkTokens,
addBookmarkToken,
removeBookmarkToken,
} = useBookmarkTokens();
const mobileHTML = (token: any, index: number) => {
const tokenCurrency = new Token(
ChainId.MATIC,
getAddress(token.id),
Number(token.decimals),
token.symbol,
token.name,
);
const priceColor = getPriceColor(Number(token.priceChangeUSD), palette);
return (
<Box mt={index === 0 ? 0 : 3}>
<Box display='flex' alignItems='center' mb={1}>
<Box
display='flex'
mr={1}
onClick={() => {
const tokenIndex = bookmarkTokens.indexOf(token.id);
if (tokenIndex === -1) {
addBookmarkToken(token.id);
} else {
removeBookmarkToken(token.id);
}
}}
>
{bookmarkTokens.indexOf(token.id) > -1 ? (
<StarChecked />
) : (
<StarUnchecked />
)}
</Box>
<Link
to={`/analytics/token/${tokenCurrency.address}`}
style={{ textDecoration: 'none' }}
>
<Box display='flex' alignItems='center'>
<CurrencyLogo currency={tokenCurrency} size='28px' />
<Box ml={1}>
<Typography
variant='body1'
style={{ color: palette.text.primary }}
>
{token.name}{' '}
<span style={{ color: palette.text.hint }}>
({token.symbol})
</span>
</Typography>
</Box>
</Box>
</Link>
</Box>
<Divider />
<Box className={classes.mobileRow}>
<Typography variant='body1'>Price</Typography>
<Typography variant='body1'>
${formatNumber(token.priceUSD)}
</Typography>
</Box>
<Box className={classes.mobileRow}>
<Typography variant='body1'>24H %</Typography>
<Box
className={classes.priceChangeWrapper}
bgcolor={priceColor.bgColor}
color={priceColor.textColor}
>
<Typography variant='body2'>
{getFormattedPrice(Number(token.priceChangeUSD))}%
</Typography>
</Box>
</Box>
<Box className={classes.mobileRow}>
<Typography variant='body1'>24H Volume</Typography>
<Typography variant='body1'>
${Number(token.oneDayVolumeUSD).toLocaleString()}
</Typography>
</Box>
<Box className={classes.mobileRow}>
<Typography variant='body1'>Liquidity</Typography>
<Typography variant='body1'>
${Number(token.totalLiquidityUSD).toLocaleString()}
</Typography>
</Box>
</Box>
);
};
const desktopHTML = (token: any) => {
const tokenCurrency = new Token(
ChainId.MATIC,
getAddress(token.id),
Number(token.decimals),
token.symbol,
token.name,
);
const priceColor = getPriceColor(Number(token.priceChangeUSD), palette);
return [
{
html: (
<Box display='flex' alignItems='center'>
<Box
display='flex'
mr={1}
onClick={() => {
const tokenIndex = bookmarkTokens.indexOf(token.id);
if (tokenIndex === -1) {
addBookmarkToken(token.id);
} else {
removeBookmarkToken(token.id);
}
}}
>
{bookmarkTokens.indexOf(token.id) > -1 ? (
<StarChecked />
) : (
<StarUnchecked />
)}
</Box>
<Link
to={`/analytics/token/${tokenCurrency.address}`}
style={{ textDecoration: 'none' }}
>
<Box display='flex' alignItems='center'>
<CurrencyLogo currency={tokenCurrency} size='28px' />
<Box ml={1}>
<Typography
variant='body1'
style={{ color: palette.text.primary }}
>
{token.name}{' '}
<span style={{ color: palette.text.hint }}>
({token.symbol})
</span>
</Typography>
</Box>
</Box>
</Link>
</Box>
),
},
{
html: (
<Box>
<Typography>${Number(token.priceUSD).toLocaleString()}</Typography>
</Box>
),
},
{
html: (
<Box
className={classes.priceChangeWrapper}
mr={2}
bgcolor={priceColor.bgColor}
color={priceColor.textColor}
>
<Typography variant='body2'>
{getFormattedPrice(Number(token.priceChangeUSD))}%
</Typography>
</Box>
),
},
{
html: (
<Box>
<Typography>
${Number(token.oneDayVolumeUSD).toLocaleString()}
</Typography>
</Box>
),
},
{
html: (
<Box>
<Typography>
${Number(token.totalLiquidityUSD).toLocaleString()}
</Typography>
</Box>
),
},
];
};
return (
<CustomTable
defaultOrderBy={tokenHeadCells[liquidityHeadCellIndex]}
defaultOrder='desc'
showPagination={data.length > GlobalConst.utils.ROWSPERPAGE}
headCells={tokenHeadCells}
rowsPerPage={GlobalConst.utils.ROWSPERPAGE}
data={data}
mobileHTML={mobileHTML}
desktopHTML={desktopHTML}
/>
);
}
Example #2
Source File: TopMovers.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
TopMovers: React.FC<TopMoversProps> = ({
background,
hideArrow = false,
}) => {
const classes = useStyles();
const { palette, breakpoints } = useTheme();
const [topTokens, updateTopTokens] = useState<any[] | null>(null);
const smallWindowSize = useMediaQuery(breakpoints.down('xs'));
const topMoverTokens = useMemo(
() => (topTokens && topTokens.length >= 5 ? topTokens.slice(0, 5) : null),
[topTokens],
);
useEffect(() => {
async function fetchTopTokens() {
const [newPrice, oneDayPrice] = await getEthPrice();
const topTokensData = await getTopTokens(newPrice, oneDayPrice, 5);
if (topTokensData) {
updateTopTokens(topTokensData);
}
}
fetchTopTokens();
}, [updateTopTokens]);
return (
<Box
width='100%'
display='flex'
flexWrap='wrap'
flexDirection='column'
justifyContent='center'
alignItems={smallWindowSize ? 'center' : 'flex-start'}
bgcolor={background}
border={`1px solid ${
background === 'transparent' ? palette.background.paper : 'transparent'
}`}
borderRadius={10}
px={2.5}
pt={2.5}
pb={0.5}
>
<Typography variant='h6' style={{ color: palette.text.secondary }}>
24h TOP MOVERS
</Typography>
<Box width={1} pb={2} style={{ overflowX: 'auto' }}>
{topMoverTokens ? (
<Box className={classes.content}>
{topMoverTokens.map((token: any, index: number) => {
const currency = new Token(
ChainId.MATIC,
getAddress(token.id),
token.decimals,
);
const priceColor = getPriceColor(
Number(token.priceChangeUSD),
palette,
);
const priceUp = Number(token.priceChangeUSD) > 0;
const priceDown = Number(token.priceChangeUSD) < 0;
const priceUpPercent = Number(token.priceChangeUSD).toFixed(2);
return (
<Box
mr={index < topMoverTokens.length ? 2 : 0}
width={smallWindowSize ? 180 : 'unset'}
mt={2}
key={token.id}
display='flex'
flexDirection='row'
justifyContent={smallWindowSize ? 'flex-start' : 'center'}
alignItems='center'
>
<CurrencyLogo currency={currency} size='28px' />
<Box ml={1}>
<Typography variant='body2' style={{ fontWeight: 'bold' }}>
{token.symbol}
</Typography>
<Box
display='flex'
flexDirection='row'
justifyContent='center'
alignItems='center'
>
<Typography variant='body2'>
${formatNumber(token.priceUSD)}
</Typography>
<Box
ml={hideArrow ? 1 : 0}
display='flex'
flexDirection='row'
justifyContent='center'
alignItems='center'
px={0.75}
py={0.25}
borderRadius={12}
bgcolor={
!hideArrow ? 'transparent' : priceColor.bgColor
}
color={priceColor.textColor}
>
{!hideArrow && priceUp && <ArrowDropUp />}
{!hideArrow && priceDown && <ArrowDropDown />}
<Typography variant='caption'>
{hideArrow && priceUp ? '+' : ''}
{priceUpPercent}%
</Typography>
</Box>
</Box>
</Box>
</Box>
);
})}
</Box>
) : (
<Skeleton variant='rect' width='100%' height={100} />
)}
</Box>
</Box>
);
}
Example #3
Source File: AnalyticsLiquidityChart.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
AnalyticsLiquidityChart: React.FC = () => {
const { palette } = useTheme();
const { globalData } = useGlobalData();
const [durationIndex, setDurationIndex] = useState(
GlobalConst.analyticChart.ONE_MONTH_CHART,
);
const [globalChartData, updateGlobalChartData] = useState<any[] | null>(null);
useEffect(() => {
const fetchChartData = async () => {
updateGlobalChartData(null);
const [newChartData] = await getChartData(
durationIndex === GlobalConst.analyticChart.ALL_CHART
? 0
: getChartStartTime(durationIndex),
);
if (newChartData) {
const chartData = getLimitedData(
newChartData,
GlobalConst.analyticChart.CHART_COUNT,
);
updateGlobalChartData(chartData);
}
};
fetchChartData();
}, [updateGlobalChartData, durationIndex]);
const liquidityPercentColor = getPriceColor(
globalData ? Number(globalData.liquidityChangeUSD) : 0,
palette,
);
const yAxisValues = useMemo(() => {
if (globalChartData) {
const dailyVolumes: number[] = globalChartData.map((value: any) =>
Number(value.totalLiquidityUSD),
);
// this is for defining the scale for the liquidity values to present in graph. Liquidity values are more than 100M so set the min and max amount with rounding after dividing into 20000000 to show all liquidity values into the graph
const minVolume =
Math.floor(Math.min(...dailyVolumes) / 20000000) * 20000000;
const maxVolume =
Math.ceil(Math.max(...dailyVolumes) / 20000000) * 20000000;
const values = [];
// show 10 values in the y axis of the graph
const step = (maxVolume - minVolume) / 10;
for (let i = maxVolume; i >= minVolume; i -= step) {
values.push(i);
}
return values;
} else {
return undefined;
}
}, [globalChartData]);
return (
<>
<Box display='flex' justifyContent='space-between'>
<Typography
variant='caption'
style={{ color: palette.text.disabled, fontWeight: 'bold' }}
>
LIQUIDITY
</Typography>
<ChartType
typeTexts={GlobalData.analytics.CHART_DURATION_TEXTS}
chartTypes={GlobalData.analytics.CHART_DURATIONS}
chartType={durationIndex}
setChartType={setDurationIndex}
/>
</Box>
{globalData ? (
<Box mt={0.5} display='flex' alignItems='center'>
<Typography variant='h5' style={{ color: palette.text.primary }}>
${formatCompact(globalData.totalLiquidityUSD)}
</Typography>
<Box
ml={1}
height={23}
px={1}
borderRadius={40}
bgcolor={liquidityPercentColor.bgColor}
color={liquidityPercentColor.textColor}
>
<Typography variant='caption'>
{`${globalData.liquidityChangeUSD > 0 ? '+' : ''}
${globalData.liquidityChangeUSD.toLocaleString()}`}
%
</Typography>
</Box>
</Box>
) : (
<Box my={0.5}>
<Skeleton variant='rect' width='100%' height={24} />
</Box>
)}
<Box>
<Typography style={{ color: palette.text.disabled }} variant='caption'>
{dayjs().format('MMM DD, YYYY')}
</Typography>
</Box>
<Box mt={2}>
{globalChartData ? (
<AreaChart
data={globalChartData.map((value: any) =>
Number(value.totalLiquidityUSD),
)}
yAxisValues={yAxisValues}
dates={globalChartData.map((value: any) =>
dayjs(value.date * 1000)
.add(1, 'day')
.unix(),
)}
width='100%'
height={250}
categories={getChartDates(globalChartData, durationIndex)}
/>
) : (
<Skeleton variant='rect' width='100%' height={223} />
)}
</Box>
</>
);
}
Example #4
Source File: AnalyticsVolumeChart.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
AnalyticsVolumeChart: React.FC = () => {
const { palette } = useTheme();
const volumeTypes = [DAY_VOLUME, WEEK_VOLUME];
const volumeTypeTexts = ['D', 'W'];
const [volumeIndex, setVolumeIndex] = useState(DAY_VOLUME);
const [durationIndex, setDurationIndex] = useState(
GlobalConst.analyticChart.ONE_MONTH_CHART,
);
const [selectedVolumeIndex, setSelectedVolumeIndex] = useState(-1);
const { globalData } = useGlobalData();
const [globalChartData, updateGlobalChartData] = useState<any>(null);
useEffect(() => {
const fetchChartData = async () => {
updateGlobalChartData(null);
const [newChartData, newWeeklyData] = await getChartData(
durationIndex === GlobalConst.analyticChart.ALL_CHART
? 0
: getChartStartTime(durationIndex),
);
if (newChartData && newWeeklyData) {
const dayItems = getLimitedData(
newChartData,
GlobalConst.analyticChart.CHART_COUNT,
);
const weekItems = getLimitedData(
newWeeklyData,
GlobalConst.analyticChart.CHART_COUNT,
);
updateGlobalChartData({ day: dayItems, week: weekItems });
}
};
fetchChartData();
}, [updateGlobalChartData, durationIndex]);
const liquidityWeeks = useMemo(() => {
if (globalChartData) {
const dates: string[] = [];
globalChartData.week.forEach((value: any, ind: number) => {
const month = formatDateFromTimeStamp(Number(value.date), 'MMM');
const monthLastDate =
ind > 0
? formatDateFromTimeStamp(
Number(globalChartData.week[ind - 1].date),
'MMM',
)
: '';
if (monthLastDate !== month) {
dates.push(month);
}
if (
durationIndex === GlobalConst.analyticChart.ONE_MONTH_CHART ||
durationIndex === GlobalConst.analyticChart.THREE_MONTH_CHART
) {
const dateStr = formatDateFromTimeStamp(Number(value.date), 'D');
if (Number(dateStr) % 2 === 0) {
//Select dates(one date per 2 weeks) for x axis values of volume chart on week mode
dates.push(dateStr);
}
}
});
return dates;
} else {
return [];
}
}, [globalChartData, durationIndex]);
const getVolumePercent = (volumeIndex: number) => {
if (globalChartData && selectedVolumeIndex > 0) {
const volumeDataArr = [globalChartData.day, globalChartData.week];
const volumeData = volumeDataArr[volumeIndex];
if (!volumeData || volumeData.length <= 1) return 0;
const currentVolumeIndex = Math.min(
selectedVolumeIndex,
volumeData.length - 1,
);
const currentVolumeData = volumeData[currentVolumeIndex];
const prevVolumeData = volumeData[currentVolumeIndex - 1];
let currentVolume = 0;
let prevVolume = 0;
switch (volumeIndex) {
case WEEK_VOLUME:
currentVolume = currentVolumeData.weeklyVolumeUSD;
prevVolume = prevVolumeData.weeklyVolumeUSD;
break;
case DAY_VOLUME:
currentVolume = currentVolumeData.dailyVolumeUSD;
prevVolume = prevVolumeData.dailyVolumeUSD;
break;
}
if (prevVolume <= 0) return 0;
return (currentVolume / prevVolume) * 100 - 100;
} else if (globalData && selectedVolumeIndex === -1) {
switch (volumeIndex) {
case WEEK_VOLUME:
return globalData.weeklyVolumeChange;
case DAY_VOLUME:
return globalData.volumeChangeUSD;
default:
return 0;
}
} else {
return 0;
}
};
const volumeDates = useMemo(() => {
if (selectedVolumeIndex > -1) {
if (volumeIndex === DAY_VOLUME) {
return formatDateFromTimeStamp(
Number(globalChartData.day[selectedVolumeIndex].date),
'MMM DD, YYYY',
);
} else {
const weekStart = formatDateFromTimeStamp(
Number(
globalChartData.week[Math.max(0, selectedVolumeIndex - 1)].date,
),
'MMM DD, YYYY',
selectedVolumeIndex > 0 ? 2 : -5,
);
const weekEnd = formatDateFromTimeStamp(
Number(globalChartData.week[selectedVolumeIndex].date),
'MMM DD, YYYY',
);
return `${weekStart} - ${weekEnd}`;
}
}
return '';
}, [globalChartData, selectedVolumeIndex, volumeIndex]);
const barChartData = useMemo(() => {
if (globalChartData) {
return volumeIndex === WEEK_VOLUME
? globalChartData.week.map((value: any) => value.weeklyVolumeUSD)
: globalChartData.day.map((value: any) => value.dailyVolumeUSD);
} else {
return [];
}
}, [globalChartData, volumeIndex]);
const volumePercentColor = getPriceColor(
Number(getVolumePercent(volumeIndex)),
palette,
);
return (
<>
<Box>
<Box display='flex' justifyContent='space-between'>
<Typography
variant='caption'
style={{ color: palette.text.disabled, fontWeight: 'bold' }}
>
VOLUME {selectedVolumeIndex === -1 ? '(24hr)' : ''}
</Typography>
<ChartType
chartTypes={volumeTypes}
typeTexts={volumeTypeTexts}
chartType={volumeIndex}
setChartType={setVolumeIndex}
/>
</Box>
<Box
mt={0.5}
display='flex'
alignItems='flex-start'
justifyContent='space-between'
>
{globalChartData && globalData ? (
<Box flex={1} mr={2}>
<Box display='flex' alignItems='center'>
<Typography
variant='h5'
style={{ color: palette.text.primary }}
>
$
{formatCompact(
selectedVolumeIndex > -1
? volumeIndex === DAY_VOLUME
? globalChartData.day[selectedVolumeIndex]
.dailyVolumeUSD
: globalChartData.week[selectedVolumeIndex]
.weeklyVolumeUSD
: volumeIndex === DAY_VOLUME
? globalData.oneDayVolumeUSD
: globalData.oneWeekVolume,
)}
</Typography>
<Box
ml={1}
height={23}
px={1}
borderRadius={40}
bgcolor={volumePercentColor.bgColor}
color={volumePercentColor.textColor}
>
<Typography variant='caption'>
{`${getVolumePercent(volumeIndex) > 0 ? '+' : ''}
${getVolumePercent(volumeIndex).toLocaleString()}`}
%
</Typography>
</Box>
</Box>
<Box height={21}>
<Typography
style={{ color: palette.text.disabled }}
variant='caption'
>
{volumeDates}
</Typography>
</Box>
</Box>
) : (
<Box mr={2} flex={1}>
<Skeleton variant='rect' width='100%' height={24} />
</Box>
)}
<ChartType
chartTypes={GlobalData.analytics.CHART_DURATIONS}
typeTexts={GlobalData.analytics.CHART_DURATION_TEXTS}
chartType={durationIndex}
setChartType={setDurationIndex}
/>
</Box>
</Box>
<Box mt={2}>
{globalChartData ? (
<BarChart
height={200}
data={barChartData}
categories={
volumeIndex === WEEK_VOLUME
? liquidityWeeks
: getChartDates(globalChartData.day, durationIndex)
}
onHover={(ind) => setSelectedVolumeIndex(ind)}
onMouseLeave={() => {
setSelectedVolumeIndex(-1);
}}
/>
) : (
<Skeleton variant='rect' width='100%' height={250} />
)}
</Box>
</>
);
}
Example #5
Source File: AnalyticsPairChart.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
AnalyticsPairChart: React.FC<{ pairData: any }> = ({ pairData }) => {
const classes = useStyles();
const { palette } = useTheme();
const match = useRouteMatch<{ id: string }>();
const pairAddress = match.params.id;
const [pairChartData, setPairChartData] = useState<any[] | null>(null);
const [durationIndex, setDurationIndex] = useState(
GlobalConst.analyticChart.ONE_MONTH_CHART,
);
const usingUtVolume =
pairData &&
pairData.oneDayVolumeUSD === 0 &&
!!pairData.oneDayVolumeUntracked;
const fees =
pairData && (pairData.oneDayVolumeUSD || pairData.oneDayVolumeUSD === 0)
? usingUtVolume
? (
Number(pairData.oneDayVolumeUntracked) *
GlobalConst.utils.FEEPERCENT
).toLocaleString()
: (
Number(pairData.oneDayVolumeUSD) * GlobalConst.utils.FEEPERCENT
).toLocaleString()
: '-';
const [chartIndex, setChartIndex] = useState(CHART_VOLUME);
const chartIndexes = [CHART_VOLUME, CHART_LIQUIDITY, CHART_FEES];
const chartIndexTexts = ['Volume', 'Liquidity', 'Fees'];
const chartData = useMemo(() => {
if (!pairChartData) return;
return pairChartData.map((item: any) => {
switch (chartIndex) {
case CHART_VOLUME:
return Number(item.dailyVolumeUSD);
case CHART_LIQUIDITY:
return Number(item.reserveUSD);
case CHART_FEES:
return Number(item.dailyVolumeUSD) * GlobalConst.utils.FEEPERCENT;
default:
return;
}
});
}, [pairChartData, chartIndex]);
const currentData = useMemo(() => {
if (!pairData) return;
switch (chartIndex) {
case CHART_VOLUME:
return pairData.oneDayVolumeUSD;
case CHART_LIQUIDITY:
return pairData.reserveUSD ?? pairData.trackedReserveUSD;
case CHART_FEES:
return fees;
default:
return;
}
}, [pairData, chartIndex, fees]);
const currentPercent = useMemo(() => {
if (!pairData) return;
switch (chartIndex) {
case CHART_VOLUME:
return pairData.volumeChangeUSD;
case CHART_LIQUIDITY:
return pairData.liquidityChangeUSD;
case CHART_FEES:
return usingUtVolume
? pairData.volumeChangeUntracked
: pairData.volumeChangeUSD;
default:
return;
}
}, [pairData, chartIndex, usingUtVolume]);
useEffect(() => {
async function fetchPairChartData() {
setPairChartData(null);
const chartData = await getPairChartData(
pairAddress,
durationIndex === GlobalConst.analyticChart.ALL_CHART
? 0
: getChartStartTime(durationIndex),
);
if (chartData && chartData.length > 0) {
const newChartData = getLimitedData(
chartData,
GlobalConst.analyticChart.CHART_COUNT,
);
setPairChartData(newChartData);
}
}
fetchPairChartData();
}, [pairAddress, durationIndex]);
const currentPercentColor = getPriceColor(Number(currentPercent), palette);
return (
<>
<Box display='flex' flexWrap='wrap' justifyContent='space-between'>
<Box mt={1.5}>
<Typography variant='caption'>
{chartIndexTexts[chartIndex]}
</Typography>
<Box mt={1}>
{currentPercent && currentData ? (
<>
<Box display='flex' alignItems='center'>
<Typography
variant='h4'
style={{ color: palette.text.primary }}
>
$
{currentData > 100000
? formatCompact(currentData)
: currentData.toLocaleString()}
</Typography>
<Box
className={classes.priceChangeWrapper}
ml={1}
bgcolor={currentPercentColor.bgColor}
color={currentPercentColor.textColor}
>
<Typography variant='body2'>
{getFormattedPrice(Number(currentPercent))}%
</Typography>
</Box>
</Box>
<Box>
<Typography variant='caption'>
{dayjs().format('MMM DD, YYYY')}
</Typography>
</Box>
</>
) : (
<Skeleton variant='rect' width='120px' height='30px' />
)}
</Box>
</Box>
<Box display='flex' flexDirection='column' alignItems='flex-end'>
<Box mt={1.5}>
<ChartType
chartTypes={chartIndexes}
typeTexts={chartIndexTexts}
chartType={chartIndex}
setChartType={setChartIndex}
/>
</Box>
<Box mt={1.5}>
<ChartType
chartTypes={GlobalData.analytics.CHART_DURATIONS}
typeTexts={GlobalData.analytics.CHART_DURATION_TEXTS}
chartType={durationIndex}
setChartType={setDurationIndex}
/>
</Box>
</Box>
</Box>
<Box mt={2} width={1}>
{chartData && pairChartData ? (
<AreaChart
data={chartData}
yAxisValues={getYAXISValuesAnalytics(chartData)}
dates={pairChartData.map((value: any) =>
dayjs(value.date * 1000)
.add(1, 'day')
.unix(),
)}
width='100%'
height={240}
categories={getChartDates(pairChartData, durationIndex)}
/>
) : (
<Skeleton variant='rect' width='100%' height={217} />
)}
</Box>
</>
);
}
Example #6
Source File: AnalyticsTokenChart.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
AnalyticsTokenChart: React.FC<{ token: any }> = ({ token }) => {
const classes = useStyles();
const { palette } = useTheme();
const match = useRouteMatch<{ id: string }>();
const tokenAddress = match.params.id;
const [tokenChartData, updateTokenChartData] = useState<any>(null);
const chartIndexes = [CHART_VOLUME, CHART_LIQUIDITY, CHART_PRICE];
const chartIndexTexts = ['Volume', 'Liquidity', 'Price'];
const [chartIndex, setChartIndex] = useState(CHART_VOLUME);
const [durationIndex, setDurationIndex] = useState(
GlobalConst.analyticChart.ONE_MONTH_CHART,
);
const chartData = useMemo(() => {
if (!tokenChartData) return;
return tokenChartData.map((item: any) => {
switch (chartIndex) {
case CHART_VOLUME:
return Number(item.dailyVolumeUSD);
case CHART_LIQUIDITY:
return Number(item.totalLiquidityUSD);
case CHART_PRICE:
return Number(item.priceUSD);
default:
return;
}
});
}, [tokenChartData, chartIndex]);
const currentData = useMemo(() => {
if (!token) return;
switch (chartIndex) {
case CHART_VOLUME:
return token.oneDayVolumeUSD;
case CHART_LIQUIDITY:
return token.totalLiquidityUSD;
case CHART_PRICE:
return token.priceUSD;
default:
return;
}
}, [token, chartIndex]);
const currentPercent = useMemo(() => {
if (!token) return;
switch (chartIndex) {
case CHART_VOLUME:
return token.volumeChangeUSD;
case CHART_LIQUIDITY:
return token.liquidityChangeUSD;
case CHART_PRICE:
return token.priceChangeUSD;
default:
return;
}
}, [token, chartIndex]);
useEffect(() => {
async function fetchTokenChartData() {
updateTokenChartData(null);
const chartData = await getTokenChartData(
tokenAddress,
durationIndex === GlobalConst.analyticChart.ALL_CHART
? 0
: getChartStartTime(durationIndex),
);
if (chartData) {
const newChartData = getLimitedData(
chartData,
GlobalConst.analyticChart.CHART_COUNT,
);
updateTokenChartData(newChartData);
}
}
fetchTokenChartData();
}, [updateTokenChartData, tokenAddress, durationIndex]);
const currentPercentColor = getPriceColor(Number(currentPercent), palette);
return (
<>
<Box display='flex' flexWrap='wrap' justifyContent='space-between'>
<Box mt={1.5}>
<Typography variant='caption'>
{chartIndexTexts[chartIndex]}
</Typography>
<Box mt={1}>
{currentData && currentPercent ? (
<>
<Box display='flex' alignItems='center'>
<Typography
variant='h4'
style={{ color: palette.text.primary }}
>
$
{currentData > 100000
? formatCompact(currentData)
: formatNumber(currentData)}
</Typography>
<Box
className={classes.priceChangeWrapper}
ml={1}
bgcolor={currentPercentColor.bgColor}
color={currentPercentColor.textColor}
>
<Typography variant='body2'>
{getFormattedPrice(Number(currentPercent))}%
</Typography>
</Box>
</Box>
<Box>
<Typography variant='caption'>
{dayjs().format('MMM DD, YYYY')}
</Typography>
</Box>
</>
) : (
<Skeleton variant='rect' width='120px' height='30px' />
)}
</Box>
</Box>
<Box display='flex' flexDirection='column' alignItems='flex-end'>
<Box mt={1.5}>
<ChartType
chartTypes={chartIndexes}
typeTexts={chartIndexTexts}
chartType={chartIndex}
setChartType={setChartIndex}
/>
</Box>
<Box mt={1.5}>
<ChartType
chartTypes={GlobalData.analytics.CHART_DURATIONS}
typeTexts={GlobalData.analytics.CHART_DURATION_TEXTS}
chartType={durationIndex}
setChartType={setDurationIndex}
/>
</Box>
</Box>
</Box>
<Box mt={2} width={1}>
{tokenChartData ? (
<AreaChart
data={chartData}
yAxisValues={getYAXISValuesAnalytics(chartData)}
dates={tokenChartData.map((value: any) =>
dayjs(value.date * 1000)
.add(1, 'day')
.unix(),
)}
width='100%'
height={240}
categories={getChartDates(tokenChartData, durationIndex)}
/>
) : (
<Skeleton variant='rect' width='100%' height={217} />
)}
</Box>
</>
);
}
Example #7
Source File: AnalyticsTokenDetails.tsx From interface-v2 with GNU General Public License v3.0 | 4 votes |
AnalyticsTokenDetails: React.FC = () => {
const classes = useStyles();
const { palette, breakpoints } = useTheme();
const isMobile = useMediaQuery(breakpoints.down('xs'));
const history = useHistory();
const match = useRouteMatch<{ id: string }>();
const tokenAddress = match.params.id;
const [token, setToken] = useState<any>(null);
const { chainId } = useActiveWeb3React();
const currency = token
? new Token(ChainId.MATIC, getAddress(token.id), token.decimals)
: undefined;
const [tokenPairs, updateTokenPairs] = useState<any>(null);
const {
bookmarkTokens,
addBookmarkToken,
removeBookmarkToken,
} = useBookmarkTokens();
useEffect(() => {
async function fetchTokenInfo() {
const [newPrice, oneDayPrice] = await getEthPrice();
const tokenInfo = await getTokenInfo(newPrice, oneDayPrice, tokenAddress);
if (tokenInfo) {
setToken(tokenInfo[0]);
}
}
fetchTokenInfo();
}, [tokenAddress]);
useEffect(() => {
async function fetchTokenPairs() {
const [newPrice] = await getEthPrice();
const tokenPairs = await getTokenPairs2(tokenAddress);
const formattedPairs = tokenPairs
? tokenPairs.map((pair: any) => {
return pair.id;
})
: [];
const pairData = await getBulkPairData(formattedPairs, newPrice);
if (pairData) {
updateTokenPairs(pairData);
}
}
fetchTokenPairs();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [updateTokenPairs, tokenAddress]);
const tokenPercentColor = getPriceColor(
token ? Number(token.priceChangeUSD) : 0,
palette,
);
return (
<>
<AnalyticsHeader type='token' data={token} />
{token ? (
<>
<Box
width={1}
display='flex'
flexWrap='wrap'
justifyContent='space-between'
>
<Box display='flex'>
<CurrencyLogo currency={currency} size='32px' />
<Box ml={1.5}>
<Box display='flex' alignItems='center'>
<Box display='flex' alignItems='flex-end' mr={0.5}>
<Typography className={classes.heading1}>
{token.name}{' '}
</Typography>
<Typography className={classes.heading2}>
({token.symbol})
</Typography>
</Box>
{bookmarkTokens.includes(token.id) ? (
<StarChecked
onClick={() => removeBookmarkToken(token.id)}
/>
) : (
<StarUnchecked onClick={() => addBookmarkToken(token.id)} />
)}
</Box>
<Box mt={1.25} display='flex' alignItems='center'>
<Typography
variant='h5'
style={{ color: palette.text.primary }}
>
${formatNumber(token.priceUSD)}
</Typography>
<Box
className={classes.priceChangeWrapper}
ml={2}
bgcolor={tokenPercentColor.bgColor}
color={tokenPercentColor.textColor}
>
<Typography variant='body2'>
{getFormattedPrice(Number(token.priceChangeUSD))}%
</Typography>
</Box>
</Box>
</Box>
</Box>
<Box my={2} display='flex'>
<Box
className={classes.button}
mr={1.5}
border={`1px solid ${palette.primary.main}`}
onClick={() => {
history.push(`/pools?currency0=${token.id}¤cy1=ETH`);
}}
>
<Typography variant='body2'>Add Liquidity</Typography>
</Box>
<Box
className={cx(classes.button, classes.filledButton)}
onClick={() => {
history.push(`/swap?currency0=${token.id}¤cy1=ETH`);
}}
>
<Typography variant='body2'>Swap</Typography>
</Box>
</Box>
</Box>
<Box width={1} className={classes.panel} mt={4}>
<Grid container>
<Grid item xs={12} sm={12} md={6}>
<AnalyticsTokenChart token={token} />
</Grid>
<Grid item xs={12} sm={12} md={6}>
<Box
my={2}
height={1}
display='flex'
flexDirection='column'
alignItems='center'
justifyContent='center'
>
<Box
width={isMobile ? 1 : 0.8}
display='flex'
justifyContent='space-between'
>
<Box width={180}>
<Typography
variant='caption'
style={{ color: palette.text.disabled }}
>
TOTAL LIQUIDITY
</Typography>
<Typography variant={isMobile ? 'body1' : 'h5'}>
${token.totalLiquidityUSD.toLocaleString()}
</Typography>
</Box>
<Box width={140}>
<Typography
variant='caption'
style={{ color: palette.text.disabled }}
>
7d Trading Vol
</Typography>
<Typography variant={isMobile ? 'body1' : 'h5'}>
${token.oneWeekVolumeUSD.toLocaleString()}
</Typography>
</Box>
</Box>
<Box
width={isMobile ? 1 : 0.8}
mt={4}
display='flex'
justifyContent='space-between'
>
<Box width={180}>
<Typography
variant='caption'
style={{ color: palette.text.disabled }}
>
24h Trading Vol
</Typography>
<Typography variant={isMobile ? 'body1' : 'h5'}>
${token.oneDayVolumeUSD.toLocaleString()}
</Typography>
</Box>
<Box width={140}>
<Typography
variant='caption'
style={{ color: palette.text.disabled }}
>
24h FEES
</Typography>
<Typography variant={isMobile ? 'body1' : 'h5'}>
$
{(
token.oneDayVolumeUSD * GlobalConst.utils.FEEPERCENT
).toLocaleString()}
</Typography>
</Box>
</Box>
<Box
width={isMobile ? 1 : 0.8}
mt={4}
display='flex'
justifyContent='space-between'
>
<Box width={180}>
<Typography
variant='caption'
style={{ color: palette.text.disabled }}
>
Contract Address
</Typography>
<Typography
variant='h5'
style={{ color: palette.primary.main }}
>
{chainId ? (
<a
href={getEtherscanLink(
chainId,
token.id,
'address',
)}
target='_blank'
rel='noopener noreferrer'
style={{
color: palette.primary.main,
textDecoration: 'none',
}}
>
{shortenAddress(token.id)}
</a>
) : (
shortenAddress(token.id)
)}
</Typography>
</Box>
</Box>
</Box>
</Grid>
</Grid>
</Box>
<Box width={1} mt={5}>
<Typography variant='body1'>{token.symbol} Pools</Typography>
</Box>
<Box width={1} className={classes.panel} mt={4}>
{tokenPairs ? (
<PairTable data={tokenPairs} />
) : (
<Skeleton variant='rect' width='100%' height={150} />
)}
</Box>
</>
) : (
<Skeleton width='100%' height={100} />
)}
</>
);
}