import React, { useContext, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Tab, Tabs, Paper, CircularProgress, Grid, Typography, Box, Stepper, Step, StepLabel, } from '@mui/material'; import { useNavigate, useParams } from 'react-router-dom'; import TradeBox from '../../components/TradeBox'; import OrderDetails from '../../components/OrderDetails'; import { AppContext, type UseAppStoreType } from '../../contexts/AppContext'; import { FederationContext, type UseFederationStoreType } from '../../contexts/FederationContext'; import { NoRobotDialog, WarningDialog } from '../../components/Dialogs'; import { Order, type Slot } from '../../models'; import { type UseGarageStoreType, GarageContext } from '../../contexts/GarageContext'; import { genBase62Token } from '../../utils'; const OrderPage = (): React.JSX.Element => { const { windowSize, setOpen, acknowledgedWarning, setAcknowledgedWarning, navbarHeight } = useContext(AppContext); const { federation } = useContext(FederationContext); const { garage } = useContext(GarageContext); const { t } = useTranslation(); const navigate = useNavigate(); const params = useParams(); const paramsRef = useRef(params); const doublePageWidth: number = 50; const maxHeight: number = (windowSize?.height - navbarHeight) * 0.85 - 3; const [tab, setTab] = useState<'order' | 'contract'>('contract'); const [currentOrder, setCurrentOrder] = useState(null); const [openNoRobot, setOpenNoRobot] = useState(false); const [orderStep, setOrderStep] = useState(0); useEffect(() => { paramsRef.current = params; const shortAlias = params.shortAlias; const orderId = Number(params.orderId); const slot = garage.getSlot(); if (slot?.token) { let order = new Order({ id: orderId, shortAlias }); if (slot.activeOrder?.id === orderId && slot.activeOrder?.shortAlias === shortAlias) { order = slot.activeOrder; } else if (slot.lastOrder?.id === orderId && slot.lastOrder?.shortAlias === shortAlias) { order = slot.lastOrder; } void order.fecth(federation, slot).then((updatedOrder) => { updateSlotFromOrder(updatedOrder, slot); }); } else { setOpenNoRobot(true); } return () => { setCurrentOrder(null); }; }, [params.orderId, openNoRobot]); useEffect(() => { if (!currentOrder) return; setOrderStep(0); if ([1].includes(currentOrder.status)) { setOrderStep(1); } else if ([6, 7, 8].includes(currentOrder.status)) { setOrderStep(currentOrder.is_taker ? 1 : 2); } else if ([9, 10, 11, 12].includes(currentOrder.status)) { setOrderStep(currentOrder.is_taker ? 2 : 3); } else if ([13, 14, 15, 16, 17, 18].includes(currentOrder.status)) { setOrderStep(5); } }, [currentOrder?.status]); const updateSlotFromOrder = (updatedOrder: Order, slot: Slot): void => { if ( Number(paramsRef.current.orderId) === updatedOrder.id && paramsRef.current.shortAlias === updatedOrder.shortAlias ) { setCurrentOrder(updatedOrder); slot.updateSlotFromOrder(updatedOrder); } }; const onClickCoordinator = function (): void { if (currentOrder?.shortAlias != null) { setOpen((open) => { return { ...open, coordinator: currentOrder?.shortAlias }; }); } }; const startAgain = (): void => { navigate('/garage'); }; const orderDetailsSpace = currentOrder ? ( ) : ( <> ); const tradeBoxSpace = currentOrder ? ( ) : ( <> ); const steps = currentOrder?.is_taker ? ['Take', 'Setup', 'Trade', 'Finished'] : ['Publish', 'Wait', 'Setup', 'Trade', 'Finished']; return ( { setAcknowledgedWarning(true); }} longAlias={federation.getCoordinator(params.shortAlias ?? '')?.longAlias} /> { setOpenNoRobot(false); }} onClickGenerateRobot={() => { const token = genBase62Token(36); garage .createRobot(federation, token) .then(() => { setOpenNoRobot(false); }) .catch((e) => { console.log(e); }); }} /> {!currentOrder?.maker && !currentOrder?.bad_request && } {currentOrder?.bad_request && currentOrder.status !== 5 ? ( <> {t(currentOrder.bad_request)} {currentOrder?.bad_request?.includes('password') && ( {orderDetailsSpace} )} ) : null} {currentOrder?.maker && (!currentOrder.bad_request || currentOrder.status === 5) ? ( currentOrder.is_participant ? ( windowSize.width > doublePageWidth ? ( // DOUBLE PAPER VIEW {steps.map((label) => ( {t(label)} ))} {orderDetailsSpace} {tradeBoxSpace} ) : ( // SINGLE PAPER VIEW { setTab(value); }} variant='fullWidth' >
{orderDetailsSpace}
{tradeBoxSpace}
) ) : ( {orderDetailsSpace} ) ) : ( <> )}
); }; export default OrderPage;