import moment from 'moment' import { useState, useEffect, memo, ReactNode } from 'react' import {CaretUpOutlined, CaretDownOutlined, CaretRightOutlined} from '@ant-design/icons' import '@styles/display.css' export const formatNumber = (value?: unknown, format?: number) => Number.isInteger(format) && Number.isFinite(value) ? Number(value).toFixed(format) : Number(value).toPrecision(4) const iconStyle = { color:'#0008' } const displayValueStyle = { display: 'flex', flexGrow: 1 } export type ValueDisplayProps = { prefix?: ReactNode suffix?: ReactNode format?: number | string isArrowVisible?: boolean enumeration?: Record value: string } export type DisplayProps = ValueDisplayProps & { className?: string label?: ReactNode } export const ValueDisplay = memo(({ prefix, value, suffix, isArrowVisible, format, enumeration }) => { const [val, setVal] = useState('---') const [arrowState, setArrowState] = useState({ preVal: NaN, preTimestamp: Date.now(), direction: 0, }) useEffect(() => { setVal((preVal) => { if ((value ?? '-') === '-' || value === '--') return '---' if (enumeration?.[value]) return enumeration[value] if (Number.isFinite(+value)) { if (isArrowVisible && (arrowState.preTimestamp + 1000 < Date.now())) { let direction = 0 if (+value > arrowState.preVal) direction = 1 if (+value < arrowState.preVal) direction = -1 setArrowState({ preVal: +value, preTimestamp: Date.now(), direction: direction, }) } return formatNumber(value, Number(format)) } if (value.length > 4) { const valueDate = moment(value) if (valueDate.isValid()) return valueDate.format(String(format)) } return value }) },[value, isArrowVisible, arrowState, format, enumeration]) let arrow = null if(isArrowVisible) switch (arrowState.direction){ case 0: arrow = break case 1: arrow = break case -1: arrow = break default: break } return( {prefix} {val} {suffix}{arrow} ) }) export const Display = memo(({ className, label, ...other })=> (
{label}
))