/** * @file * @copyright 2020 bobbahbrown (https://github.com/bobbahbrown) * @license MIT */ import { clamp01, keyOfMatchingRange, scale } from 'common/math'; import { classes } from 'common/react'; import { AnimatedNumber } from './AnimatedNumber'; import { Box, computeBoxClassName, computeBoxProps } from './Box'; export const RoundGauge = (props) => { // Support for IE8 is for losers sorry B) if (Byond.IS_LTE_IE8) { return ; } const { value, minValue = 1, maxValue = 1, ranges, alertAfter, alertBefore, format, size = 1, className, style, ...rest } = props; const scaledValue = scale(value, minValue, maxValue); const clampedValue = clamp01(scaledValue); const scaledRanges = ranges ? {} : { 'primary': [0, 1] }; if (ranges) { Object.keys(ranges).forEach((x) => { const range = ranges[x]; scaledRanges[x] = [ scale(range[0], minValue, maxValue), scale(range[1], minValue, maxValue), ]; }); } const shouldShowAlert = () => { // If both after and before alert props are set, attempt to interpret both // in a helpful way. if (alertAfter && alertBefore && alertAfter < alertBefore) { // If alertAfter is before alertBefore, only display an alert if // we're between them. if (alertAfter < value && alertBefore > value) { return true; } } else if (alertAfter < value || alertBefore > value) { // Otherwise, we have distint ranges, or only one or neither are set. // Either way, being on the active side of either is sufficient. return true; } return false; }; // prettier-ignore const alertColor = shouldShowAlert() && keyOfMatchingRange(clampedValue, scaledRanges); return (
{(alertAfter || alertBefore) && ( )} {Object.keys(scaledRanges).map((x, i) => { const col_ranges = scaledRanges[x]; return ( ); })}
); };