import { FC, useEffect, useRef, 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 { LoadingState } from '../../types/general'; import { ImportFlightPlan } from '../../utils/TFDISBImport'; import CGSelect from '../CGSelect/CGSelect'; import ActionBar from '../actionbar/ActionBar'; interface SBEntryProps { WASMData: WASMDataPax; loadingState: LoadingState; username: string; setLoadingState: (newState: LoadingState) => void; loadAircraft: () => void; } const SBEntryPax: FC = ({ WASMData, loadingState, username, setLoadingState, loadAircraft }) => { const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuelEnabled, setFuelEnabled] = useState(true); const [SBPlan, setSBPlan] = useState(); const [SBInFlight, setSBInFlight] = useState(false); const numPax = useRef(0); const cargo = useRef(0); const ZFW = () => { if (loadingState !== 'loaded') return Math.round(WASMData.targetPayload.total); 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 handleSB = async () => { setSBInFlight(true); const SBResponse = await ImportFlightPlan( username, WASMData.limits.maxZFW, WASMData.limits.maxTOW, WASMData.limits.maxFuel, WASMData.userData.isImperial ); if (SBResponse.type === 'error') { console.error('TODO: ERROR', SBResponse.message); setSBInFlight(false); return; } cargo.current = parseFloat(SBResponse.message.cargo) ?? 0; numPax.current = parseInt(SBResponse.message.pax) ?? 0; updateData(); setSBPlan(SBResponse.message); setFuel(parseFloat(SBResponse.message.fuel) ?? 0); setSBInFlight(false); }; useEffect( () => setFuel((prev) => { if (prev > WASMData.limits.maxFuel) return WASMData.limits.maxFuel; return prev; }), [WASMData.userData.isER] ); useEffect(() => { setFuelEnabled(Math.round(WASMData.livePayload.fuel) === fuel); }, [WASMData.livePayload.fuel]); const updateData = (_CGTarget?: number) => { Coherent.call( COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT, JSON.stringify({ mode: 0, cargo: cargo.current ?? 0, numPax: numPax.current ?? 0, CGTarget: _CGTarget ?? CGTarget, }) ); }; return ( <>
handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)} disabled={loadingState !== 'preview'} />
setCGTarget((prev) => { const _new = prev + 0.1; updateData(_new); return _new; }) } decrease={() => setCGTarget((prev) => { const _new = prev - 0.1; updateData(_new); return _new; }) } />
setLoadingState('loaded')} reject={() => setLoadingState('preview')} importSB={handleSB} load={() => { setLoadingState('loaded'); loadAircraft(); }} unload={() => { setLoadingState('preview'); emptyAircraft(); }} /> ); }; export default SBEntryPax;