owncast/web/components/statistic.tsx

93 lines
2.1 KiB
TypeScript
Raw Normal View History

2021-02-15 11:36:06 +03:00
/* eslint-disable react/no-unused-prop-types */
2022-08-16 03:49:15 +03:00
/* eslint-disable react/no-unstable-nested-components */
2021-02-15 11:36:06 +03:00
// TODO: This component should be cleaned up and usage should be re-examined. The types should be reconsidered as well.
2021-02-04 20:19:16 +03:00
import { Typography, Statistic, Card, Progress } from 'antd';
2020-11-29 06:45:52 +03:00
2020-11-08 22:38:20 +03:00
const { Text } = Typography;
interface StatisticItemProps {
2021-02-04 20:19:16 +03:00
title?: string;
value?: any;
2021-02-15 11:36:06 +03:00
prefix?: any;
suffix?: string;
2021-02-04 20:19:16 +03:00
color?: string;
progress?: boolean;
centered?: boolean;
formatter?: any;
}
const defaultProps = {
2021-02-04 20:19:16 +03:00
title: '',
value: 0,
prefix: null,
suffix: null,
2020-11-17 01:32:37 +03:00
color: '',
progress: false,
centered: false,
2020-11-29 06:26:52 +03:00
formatter: null,
};
2022-08-16 03:49:15 +03:00
interface ContentProps {
prefix: string;
value: any;
suffix: string;
title: string;
}
function Content({ prefix, value, suffix, title }: ContentProps) {
return (
<div>
2021-02-04 20:19:16 +03:00
{prefix}
<div>
<Text type="secondary">{title}</Text>
</div>
<div>
<Text type="secondary">
{value}
{suffix || '%'}
</Text>
2021-02-04 20:19:16 +03:00
</div>
</div>
2021-02-04 20:19:16 +03:00
);
2022-08-16 03:49:15 +03:00
}
function ProgressView({ title, value, prefix, suffix, color }: StatisticItemProps) {
const endColor = value > 90 ? 'red' : color;
const content = <Content prefix={prefix} value={value} suffix={suffix} title={title} />;
return (
<Progress
type="dashboard"
percent={value}
width={120}
strokeColor={{
'0%': color,
'90%': endColor,
}}
2021-02-15 11:36:06 +03:00
format={() => content}
/>
2021-02-04 20:19:16 +03:00
);
}
ProgressView.defaultProps = defaultProps;
2020-11-29 06:26:52 +03:00
function StatisticView({ title, value, prefix, formatter }: StatisticItemProps) {
2021-02-04 20:19:16 +03:00
return <Statistic title={title} value={value} prefix={prefix} formatter={formatter} />;
}
StatisticView.defaultProps = defaultProps;
export default function StatisticItem(props: StatisticItemProps) {
const { progress, centered } = props;
const View = progress ? ProgressView : StatisticView;
2021-02-04 20:19:16 +03:00
const style = centered ? { display: 'flex', alignItems: 'center', justifyContent: 'center' } : {};
return (
2021-02-04 20:19:16 +03:00
<Card type="inner">
<div style={style}>
<View {...props} />
</div>
</Card>
);
}
StatisticItem.defaultProps = defaultProps;