import { FC, useEffect, useState } from 'react'; import { emptyAircraft } from '../../configs/shared'; import { COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT } from '../../constants'; import { WASMDataPax } from '../../types/WASMData'; import CGSelect from '../CGSelect/CGSelect'; import ActionBar from '../actionbar/ActionBar'; interface StationEntryProps { WASMData: WASMDataPax; loadingState: 'preview' | 'accepted' | 'loaded'; setLoadingState: (newState: StationEntryProps['loadingState']) => void; loadAircraft: () => void; } const ZFWEntryPax: FC = ({ WASMData, loadingState, setLoadingState, loadAircraft }) => { const [targetZFWCG, setTargetZFWCG] = useState(WASMData.targetPayload.ZFWCG); const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [ZFW, setZFW] = useState(Math.round(Math.max(WASMData.limits.minZFW, WASMData.targetPayload.total))); const _ZFW = () => { if (loadingState !== 'loaded') return ZFW; return Math.round(WASMData.livePayload.total); }; const ZFWValid = () => { return _ZFW() <= WASMData.limits.maxZFW; }; const GW = () => { return fuel + _ZFW(); }; const GWValid = () => { return GW() <= WASMData.limits.maxTOW; }; const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => { if (!input) { setter(0); return; } const converted = parseInt(input); if (converted) { if (converted < 0) setter(0); else if (converted > maxValue) setter(maxValue); else setter(converted); } }; const handleInputZFW = (input: string) => { if (!input) return; const converted = parseInt(input); if (converted) { if (converted < 0) setZFW(Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew)); else if (converted > WASMData.limits.maxZFW) setZFW(WASMData.limits.maxZFW); else setZFW(converted); } }; const handleBlur = (input: string) => { const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew); if (!input) { setZFW(minZFW); return; } const converted = parseInt(input); if (converted) { if (converted < minZFW) setZFW(minZFW); else if (converted > WASMData.limits.maxZFW) setZFW(WASMData.limits.maxZFW); else setZFW(converted); } updateData(converted); }; useEffect( () => setFuel((prev) => { if (prev > WASMData.limits.maxFuel) return WASMData.limits.maxFuel; return prev; }), [WASMData.userData.isER] ); const updateData = (ZFWTarget?: number, CGTarget?: number) => { Coherent.call( COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT, JSON.stringify({ mode: 1, ZFWTarget: ZFWTarget ?? ZFW, CGTarget: CGTarget ?? targetZFWCG, }) ); }; return ( <>
handleInputZFW(e.target.value)} onBlur={(e) => handleBlur(e.target.value)} disabled={loadingState !== 'preview'} />
setTargetZFWCG((prev) => { const _new = prev + 0.1; updateData(undefined, _new); return _new; }) } decrease={() => setTargetZFWCG((prev) => { const _new = prev - 0.1; updateData(undefined, _new); return _new; }) } />
handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)} disabled={loadingState !== 'preview'} />
setLoadingState('accepted')} reject={() => setLoadingState('preview')} load={() => { setLoadingState('loaded'); loadAircraft(); }} unload={() => { setLoadingState('preview'); emptyAircraft(); }} /> ); }; export default ZFWEntryPax;