* feat(#500): mute price decimal places * feat(colors): remove alpha chanel from shades of gray * feat(colors): simplify intent colors * feat(colors): fix intent mapping * feat(colors): fix lint issues * feat(colors): fix lint issues
111 lines
2.4 KiB
TypeScript
111 lines
2.4 KiB
TypeScript
import React from 'react';
|
|
|
|
import { formatNumber } from '../../lib/format-number';
|
|
import type { BigNumber } from '../../lib/bignumber';
|
|
import { theme } from '@vegaprotocol/tailwindcss-config';
|
|
|
|
const Colors = theme.colors;
|
|
|
|
const ProgressContents = ({
|
|
light,
|
|
children,
|
|
}: {
|
|
light: boolean;
|
|
children: React.ReactNode;
|
|
}) => (
|
|
<div
|
|
className={`flex justify-between py-2 font-mono ${
|
|
light ? 'gap-0 px-0 text-black' : 'gap-y-0 gap-x-4 px-4'
|
|
}`}
|
|
>
|
|
{children}
|
|
</div>
|
|
);
|
|
|
|
const ProgressIndicator = ({
|
|
bgColor,
|
|
side,
|
|
}: {
|
|
bgColor: string;
|
|
side: 'left' | 'right';
|
|
}) => (
|
|
<span
|
|
style={{
|
|
backgroundColor: bgColor,
|
|
}}
|
|
className={`inline-block w-12 h-12 border border-black ${
|
|
side === 'left' ? 'mr-8' : 'ml-8'
|
|
}`}
|
|
/>
|
|
);
|
|
|
|
const ProgressBar = ({
|
|
percentage,
|
|
bgColor,
|
|
}: {
|
|
percentage: BigNumber;
|
|
bgColor: string;
|
|
}) => (
|
|
<div
|
|
className="h-16"
|
|
style={{
|
|
flex: isNaN(percentage.toNumber()) ? 0 : percentage.toNumber(),
|
|
backgroundColor: bgColor,
|
|
}}
|
|
/>
|
|
);
|
|
|
|
export interface LockedProgressProps {
|
|
total: BigNumber;
|
|
locked: BigNumber;
|
|
unlocked: BigNumber;
|
|
leftLabel: string;
|
|
rightLabel: string;
|
|
leftColor?: string;
|
|
rightColor?: string;
|
|
light?: boolean;
|
|
}
|
|
|
|
export const LockedProgress = ({
|
|
total,
|
|
locked,
|
|
unlocked,
|
|
leftLabel,
|
|
rightLabel,
|
|
leftColor = Colors.vega.pink,
|
|
rightColor = Colors.green.DEFAULT,
|
|
light = false,
|
|
}: LockedProgressProps) => {
|
|
const lockedPercentage = React.useMemo(() => {
|
|
return locked.div(total).times(100);
|
|
}, [total, locked]);
|
|
|
|
const unlockedPercentage = React.useMemo(() => {
|
|
return unlocked.div(total).times(100);
|
|
}, [total, unlocked]);
|
|
|
|
return (
|
|
<div className="border-x border-x-white">
|
|
<div className={`flex ${light && 'border border-black'}`}>
|
|
<ProgressBar percentage={lockedPercentage} bgColor={leftColor} />
|
|
<ProgressBar percentage={unlockedPercentage} bgColor={rightColor} />
|
|
</div>
|
|
<ProgressContents light={light}>
|
|
<span>
|
|
<ProgressIndicator bgColor={leftColor} side={'left'} />
|
|
{leftLabel}
|
|
</span>
|
|
<span>
|
|
{rightLabel}
|
|
<ProgressIndicator bgColor={rightColor} side={'right'} />
|
|
</span>
|
|
</ProgressContents>
|
|
|
|
<ProgressContents light={light}>
|
|
<span>{formatNumber(locked, 2)}</span>
|
|
<span>{formatNumber(unlocked, 2)}</span>
|
|
</ProgressContents>
|
|
</div>
|
|
);
|
|
};
|