import { map, sortBy } from 'common/collections';
import { flow } from 'common/fp';
import { toFixed } from 'common/math';
import { pureComponentHooks } from 'common/react';
import { Fragment } from 'inferno';
import { useBackend, useLocalState } from '../backend';
import { Box, Button, Chart, ColorBox, Flex, Icon, LabeledList, ProgressBar, Section, Table } from '../components';
import { Window } from '../layouts';
const PEAK_DRAW = 500000;
export const powerRank = (str) => {
const unit = String(str.split(' ')[1]).toLowerCase();
return ['w', 'kw', 'mw', 'gw'].indexOf(unit);
};
export const PowerMonitor = () => {
return (
);
};
export const PowerMonitorContent = (props, context) => {
const { act, data } = useBackend(context);
const { map_levels, all_sensors, focus } = data;
if (focus) {
return ;
}
let body = No sensors detected;
if (all_sensors) {
body = (
{all_sensors.map((sensor) => (
))}
);
}
return (
act('refresh')}
/>
}>
{body}
);
};
export const PowerMonitorFocus = (props, context) => {
const { act, data } = useBackend(context);
const { focus } = props;
const { history } = focus;
const [sortByField, setSortByField] = useLocalState(
context,
'sortByField',
null
);
const supply = history.supply[history.supply.length - 1] || 0;
const demand = history.demand[history.demand.length - 1] || 0;
const supplyData = history.supply.map((value, i) => [i, value]);
const demandData = history.demand.map((value, i) => [i, value]);
const maxValue = Math.max(PEAK_DRAW, ...history.supply, ...history.demand);
// Process area data
const areas = flow([
map((area, i) => ({
...area,
// Generate a unique id
id: area.name + i,
})),
sortByField === 'name' && sortBy((area) => area.name),
sortByField === 'charge' && sortBy((area) => -area.charge),
sortByField === 'draw' &&
sortBy(
(area) => -powerRank(area.load),
(area) => -parseFloat(area.load)
),
sortByField === 'problems' &&
sortBy(
(area) => area.eqp,
(area) => area.lgt,
(area) => area.env,
(area) => area.charge,
(area) => area.name
),
])(focus.areas);
return (
act('clear')}
/>
}
/>
{toFixed(supply / 1000) + ' kW'}
{toFixed(demand / 1000) + ' kW'}
Sort by:
setSortByField(sortByField !== 'name' && 'name')}
/>
setSortByField(sortByField !== 'charge' && 'charge')}
/>
setSortByField(sortByField !== 'draw' && 'draw')}
/>
setSortByField(sortByField !== 'problems' && 'problems')
}
/>
Area
Charge
Draw
Eqp
Lgt
Env
{areas.map((area, i) => (
| {area.name} |
|
{area.load}
|
|
|
|
))}
);
};
export const AreaCharge = (props) => {
const { charging, charge } = props;
return (
50 ? 'battery-half' : 'battery-quarter')) ||
(charging === 1 && 'bolt') ||
(charging === 2 && 'battery-full')
}
color={
(charging === 0 && (charge > 50 ? 'yellow' : 'red')) ||
(charging === 1 && 'yellow') ||
(charging === 2 && 'green')
}
/>
{toFixed(charge) + '%'}
);
};
AreaCharge.defaultHooks = pureComponentHooks;
const AreaStatusColorBox = (props) => {
const { status } = props;
const power = Boolean(status & 2);
const mode = Boolean(status & 1);
const tooltipText = (power ? 'On' : 'Off') + ` [${mode ? 'auto' : 'manual'}]`;
return (
);
};
AreaStatusColorBox.defaultHooks = pureComponentHooks;