mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-01-03 05:52:43 +00:00
188 lines
5.7 KiB
JavaScript
188 lines
5.7 KiB
JavaScript
import { useBackend } from '../backend';
|
|
import { Window } from '../layouts';
|
|
import { Fragment } from 'inferno';
|
|
import { Button, Box, Section, LabeledList, NumberInput, Icon } from '../components';
|
|
import { round } from 'common/math';
|
|
import { formatSiUnit, formatPower } from '../format';
|
|
import { FullscreenNotice } from './common/FullscreenNotice';
|
|
|
|
export const ShieldGenerator = (props, context) => {
|
|
const { act, data } = useBackend(context);
|
|
|
|
const { locked } = data;
|
|
|
|
return (
|
|
<Window width={500} height={400} resizable>
|
|
<Window.Content>
|
|
{locked ? <ShieldGeneratorLocked /> : <ShieldGeneratorContent />}
|
|
</Window.Content>
|
|
</Window>
|
|
);
|
|
};
|
|
|
|
const ShieldGeneratorLocked = (props, context) => (
|
|
<FullscreenNotice title="Locked">
|
|
<Box fontSize="1.5rem" bold>
|
|
<Icon
|
|
name="exclamation-triangle"
|
|
verticalAlign="middle"
|
|
size={3}
|
|
mr="1rem"
|
|
/>
|
|
</Box>
|
|
<Box color="label" my="1rem">
|
|
Swipe your ID to begin.
|
|
</Box>
|
|
</FullscreenNotice>
|
|
);
|
|
|
|
const ShieldGeneratorContent = (props, context) => {
|
|
const { act, data } = useBackend(context);
|
|
|
|
const {
|
|
capacitors,
|
|
active,
|
|
failing,
|
|
radius,
|
|
max_radius,
|
|
z_range,
|
|
max_z_range,
|
|
average_field_strength,
|
|
target_field_strength,
|
|
max_field_strength,
|
|
shields,
|
|
upkeep,
|
|
strengthen_rate,
|
|
max_strengthen_rate,
|
|
gen_power,
|
|
} = data.lockedData;
|
|
|
|
const capacitorLen = (capacitors || []).length;
|
|
return (
|
|
<Fragment>
|
|
<Section title="Status">
|
|
<LabeledList>
|
|
<LabeledList.Item label="Field Status">
|
|
{failing ? (
|
|
<Box color="bad">Unstable</Box>
|
|
) : (
|
|
<Box color="good">Stable</Box>
|
|
)}
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Overall Field Strength">
|
|
{round(average_field_strength, 2)} Renwick (
|
|
{(target_field_strength &&
|
|
round(
|
|
(100 * average_field_strength) / target_field_strength,
|
|
1
|
|
)) ||
|
|
'NA'}
|
|
%)
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Upkeep Power">
|
|
{formatPower(upkeep)}
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Shield Generation Power">
|
|
{formatPower(gen_power)}
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Currently Shielded">
|
|
{shields} m²
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Capacitors">
|
|
<LabeledList>
|
|
{capacitorLen ? (
|
|
capacitors.map((cap, i) => (
|
|
<LabeledList.Item key={i} label={'Capacitor #' + i}>
|
|
{cap.active ? (
|
|
<Box color="good">Online</Box>
|
|
) : (
|
|
<Box color="bad">Offline</Box>
|
|
)}
|
|
<LabeledList>
|
|
<LabeledList.Item label="Charge">
|
|
{formatSiUnit(cap.stored_charge, 0, 'J')} (
|
|
{100 * round(cap.stored_charge / cap.max_charge, 2)}
|
|
%)
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Status">
|
|
{cap.failing ? (
|
|
<Box color="bad">Discharging</Box>
|
|
) : (
|
|
<Box color="good">OK.</Box>
|
|
)}
|
|
</LabeledList.Item>
|
|
</LabeledList>
|
|
</LabeledList.Item>
|
|
))
|
|
) : (
|
|
<LabeledList.Item color="bad">
|
|
No Capacitors Connected
|
|
</LabeledList.Item>
|
|
)}
|
|
</LabeledList>
|
|
</LabeledList.Item>
|
|
</LabeledList>
|
|
</Section>
|
|
<Section
|
|
title="Controls"
|
|
buttons={
|
|
<Button
|
|
icon="power-off"
|
|
content={active ? 'Online' : 'Offline'}
|
|
selected={active}
|
|
onClick={() => act('toggle')}
|
|
/>
|
|
}>
|
|
<LabeledList>
|
|
<LabeledList.Item label="Coverage Radius">
|
|
<NumberInput
|
|
fluid
|
|
stepPixelSize={6}
|
|
minValue={0}
|
|
maxValue={max_radius}
|
|
value={radius}
|
|
unit="m"
|
|
onDrag={(e, val) => act('change_radius', { val: val })}
|
|
/>
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Vertical Shielding">
|
|
<NumberInput
|
|
fluid
|
|
stepPixelSize={12}
|
|
minValue={0}
|
|
maxValue={max_z_range}
|
|
value={z_range}
|
|
unit="vertical range"
|
|
onDrag={(e, val) => act('z_range', { val: val })}
|
|
/>
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Charge Rate">
|
|
<NumberInput
|
|
fluid
|
|
stepPixelSize={12}
|
|
minValue={0}
|
|
step={0.1}
|
|
maxValue={max_strengthen_rate}
|
|
value={strengthen_rate}
|
|
format={(val) => round(val, 1)}
|
|
unit="Renwick/s"
|
|
onDrag={(e, val) => act('strengthen_rate', { val: val })}
|
|
/>
|
|
</LabeledList.Item>
|
|
<LabeledList.Item label="Maximum Field Strength">
|
|
<NumberInput
|
|
fluid
|
|
stepPixelSize={12}
|
|
minValue={1}
|
|
maxValue={max_field_strength}
|
|
value={target_field_strength}
|
|
unit="Renwick"
|
|
onDrag={(e, val) => act('target_field_strength', { val: val })}
|
|
/>
|
|
</LabeledList.Item>
|
|
</LabeledList>
|
|
</Section>
|
|
</Fragment>
|
|
);
|
|
};
|