Merge pull request #187 from vegaprotocol/task/componentize-stats

Task/componentize stats
This commit is contained in:
Edd 2022-04-04 10:20:36 +01:00 committed by GitHub
commit c7bc44f74a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 149 additions and 59 deletions

View File

@ -46,7 +46,7 @@ const transactionStatus = 'default';
function generateJsx() {
return (
<VegaWalletContext.Provider value={{} as any}>
<VegaWalletContext.Provider value={{} as never}>
<DealTicket
defaultOrder={order}
market={market}

View File

@ -1,21 +0,0 @@
import type { value, goodThreshold } from '../../config/types';
interface GoodThresholdIndicatorProps {
goodThreshold: goodThreshold | undefined;
value: value;
}
export const GoodThresholdIndicator = ({
goodThreshold,
value,
}: GoodThresholdIndicatorProps) => {
return (
<div
className={`inline-block w-8 h-8 mb-[0.15rem] mr-8 rounded ${
(goodThreshold &&
(goodThreshold(value) ? 'bg-intent-success' : 'bg-intent-danger')) ||
'bg-current'
}`}
/>
);
};

View File

@ -1 +0,0 @@
export { GoodThresholdIndicator } from './good-threshold-indicator';

View File

@ -1,7 +1,8 @@
import { Tooltip } from '@vegaprotocol/ui-toolkit';
import type { StatFields } from '../../config/types';
import { defaultFieldFormatter } from '../table-row';
import { GoodThresholdIndicator } from '../good-threshold-indicator';
import { Card, Indicator, TailwindIntents } from '@vegaprotocol/ui-toolkit';
import { useMemo } from 'react';
export const PromotedStatsItem = ({
title,
@ -10,17 +11,26 @@ export const PromotedStatsItem = ({
value,
description,
}: StatFields) => {
const variant = useMemo(
() =>
goodThreshold
? goodThreshold(value)
? TailwindIntents.Success
: TailwindIntents.Danger
: TailwindIntents.Highlight,
[goodThreshold, value]
);
return (
<Tooltip description={description} align="start">
<div className="px-24 py-16 pr-64 border items-center">
<Card>
<div className="uppercase text-[0.9375rem]">
<GoodThresholdIndicator goodThreshold={goodThreshold} value={value} />
<Indicator variant={variant} />
<span>{title}</span>
</div>
<div className="mt-4 text-h4 leading-none">
{formatter ? formatter(value) : defaultFieldFormatter(value)}
</div>
</div>
</Card>
</Tooltip>
);
};

View File

@ -1,6 +1,7 @@
import { Tooltip } from '@vegaprotocol/ui-toolkit';
import type { StatFields } from '../../config/types';
import { GoodThresholdIndicator } from '../good-threshold-indicator';
import { useMemo } from 'react';
import { Indicator, TailwindIntents } from '@vegaprotocol/ui-toolkit';
export const defaultFieldFormatter = (field: unknown) =>
field === undefined ? 'no data' : field;
@ -12,6 +13,15 @@ export const TableRow = ({
value,
description,
}: StatFields) => {
const variant = useMemo(
() =>
goodThreshold
? goodThreshold(value)
? TailwindIntents.Success
: TailwindIntents.Danger
: TailwindIntents.Highlight,
[goodThreshold, value]
);
return (
<Tooltip description={description} align="start">
<tr className="border">
@ -20,7 +30,7 @@ export const TableRow = ({
{formatter ? formatter(value) : defaultFieldFormatter(value)}
</td>
<td className="py-4 px-8">
<GoodThresholdIndicator goodThreshold={goodThreshold} value={value} />
<Indicator variant={variant} />
</td>
</tr>
</Tooltip>

View File

@ -1,4 +1,4 @@
import { forwardRef, useMemo } from 'react';
import { forwardRef } from 'react';
import type { ValueFormatterParams } from 'ag-grid-community';
import {
PriceCell,

View File

@ -0,0 +1,16 @@
import React from 'react';
import type { ComponentStory, ComponentMeta } from '@storybook/react';
import { Card } from './card';
export default {
title: 'Card',
component: Card,
} as ComponentMeta<typeof Card>;
const Template: ComponentStory<typeof Card> = (args) => {
return <Card>Test</Card>;
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,11 @@
import type { ReactNode } from 'react';
interface CardProps {
children: ReactNode;
}
export function Card({ children }: CardProps) {
return (
<div className="px-24 py-16 pr-64 border items-center">{children}</div>
);
}

View File

@ -0,0 +1 @@
export * from './card';

View File

@ -0,0 +1 @@
export * from './indicator';

View File

@ -0,0 +1,31 @@
import type { Story, Meta } from '@storybook/react';
import { Indicator } from './indicator';
export default {
component: Indicator,
title: 'Indicator',
} as Meta;
const Template: Story = (args) => <Indicator {...args} />;
export const Default = Template.bind({});
export const Highlight = Template.bind({});
Highlight.args = {
variant: 'highlight',
};
export const Success = Template.bind({});
Success.args = {
variant: 'success',
};
export const Warning = Template.bind({});
Warning.args = {
variant: 'warning',
};
export const Danger = Template.bind({});
Danger.args = {
variant: 'danger',
};

View File

@ -0,0 +1,11 @@
import classNames from 'classnames';
import type { TailwindIntents } from '../../utils/intent';
import { getVariantBackground } from '../../utils/intent';
export const Indicator = ({ variant }: { variant?: TailwindIntents }) => {
const names = classNames(
'inline-block w-8 h-8 mb-2 mr-8 rounded',
getVariantBackground(variant)
);
return <div className={names} />;
};

View File

@ -1,9 +1,11 @@
import type { ReactNode } from 'react';
import classNames from 'classnames';
import { getVariantBackground } from '../../utils/intent';
import type { TailwindIntents } from '../../utils/intent';
interface LozengeProps {
children: ReactNode;
variant?: 'success' | 'warning' | 'danger' | 'highlight';
variant?: TailwindIntents;
className?: string;
details?: string;
}
@ -13,13 +15,10 @@ const getWrapperClasses = (className: LozengeProps['className']) => {
};
const getLozengeClasses = (variant: LozengeProps['variant']) => {
return classNames(['rounded-md', 'font-mono', 'leading-none', 'p-4'], {
'bg-intent-success text-black': variant === 'success',
'bg-intent-danger text-white': variant === 'danger',
'bg-intent-warning text-black': variant === 'warning',
'bg-intent-highlight text-black': variant === 'highlight',
'bg-intent-help text-white': !variant,
});
return classNames(
['rounded-md', 'font-mono', 'leading-none', 'p-4'],
getVariantBackground(variant)
);
};
export const Lozenge = ({

View File

@ -21,6 +21,8 @@ export { ThemeSwitcher } from './components/theme-switcher';
export { Dialog } from './components/dialog/dialog';
export { VegaLogo } from './components/vega-logo';
export { Tooltip } from './components/tooltip';
export { Indicator } from './components/indicator';
export { Card } from './components/card';
// Utils
export * from './utils/intent';

View File

@ -1,21 +0,0 @@
import classNames from 'classnames';
export enum Intent {
Danger = 'danger',
Warning = 'warning',
Prompt = 'prompt',
Progress = 'progress',
Success = 'success',
Help = 'help',
}
export const getIntentShadow = (intent?: Intent) => {
return classNames('shadow-callout', {
'shadow-intent-danger': intent === Intent.Danger,
'shadow-intent-warning': intent === Intent.Warning,
'shadow-intent-prompt': intent === Intent.Prompt,
'shadow-black dark:shadow-white': intent === Intent.Progress,
'shadow-intent-success': intent === Intent.Success,
'shadow-intent-help': intent === Intent.Help,
});
};

View File

@ -0,0 +1,41 @@
import classNames from 'classnames';
export enum Intent {
Danger = 'danger',
Warning = 'warning',
Prompt = 'prompt',
Progress = 'progress',
Success = 'success',
Help = 'help',
}
export enum TailwindIntents {
Danger = 'danger',
Warning = 'warning',
Prompt = 'prompt',
Success = 'success',
Help = 'help',
Highlight = 'highlight',
}
export const getIntentShadow = (intent?: Intent) => {
return classNames('shadow-callout', {
'shadow-intent-danger': intent === Intent.Danger,
'shadow-intent-warning': intent === Intent.Warning,
'shadow-intent-prompt': intent === Intent.Prompt,
'shadow-black dark:shadow-white': intent === Intent.Progress,
'shadow-intent-success': intent === Intent.Success,
'shadow-intent-help': intent === Intent.Help,
});
};
export const getVariantBackground = (variant?: TailwindIntents) => {
return {
'bg-intent-danger text-white': variant === TailwindIntents.Danger,
'bg-intent-warning text-black': variant === TailwindIntents.Warning,
'bg-intent-prompt text-black': variant === TailwindIntents.Prompt,
'bg-intent-success text-black': variant === TailwindIntents.Success,
'bg-intent-help text-white': variant === TailwindIntents.Help,
'bg-intent-highlight text-black': variant === TailwindIntents.Highlight,
};
};