import React, { useContext, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate } from 'react-router-dom'; import { Tabs, Tab, Paper, useTheme } from '@mui/material'; import MoreTooltip from './MoreTooltip'; import { type Page, isPage } from '.'; import { SettingsApplications, SmartToy, Storefront, AddBox, Assignment, MoreHoriz, } from '@mui/icons-material'; import RobotAvatar from '../../components/RobotAvatar'; import { AppContext, type UseAppStoreType, closeAll } from '../../contexts/AppContext'; import { GarageContext, type UseGarageStoreType } from '../../contexts/GarageContext'; import { FederationContext, type UseFederationStoreType } from '../../contexts/FederationContext'; const NavBar = (): JSX.Element => { const theme = useTheme(); const { t } = useTranslation(); const { page, setPage, settings, setSlideDirection, open, setOpen, windowSize, navbarHeight } = useContext(AppContext); const { garage, robotUpdatedAt } = useContext(GarageContext); const { setCurrentOrderId } = useContext(FederationContext); const navigate = useNavigate(); const location = useLocation(); const smallBar = windowSize?.width < 50; const color = settings.network === 'mainnet' ? 'primary' : 'secondary'; const tabSx = smallBar ? { position: 'relative', bottom: garage.getSlot()?.hashId ? '0.9em' : '0.13em', minWidth: '1em', } : { position: 'relative', bottom: '1em', minWidth: '2em' }; const pagesPosition = { robot: 1, offers: 2, create: 3, order: 4, settings: 5, }; useEffect(() => { // re-render on orde rand robot updated at for latest orderId in tab }, [robotUpdatedAt]); useEffect(() => { // change tab (page) into the current route const pathPage: Page | string = location.pathname.split('/')[1]; if (pathPage === 'index.html') { navigate('/robot'); setPage('robot'); } if (isPage(pathPage)) { setPage(pathPage); } }, [location]); const handleSlideDirection = function (oldPage: Page, newPage: Page): void { const oldPos: number = pagesPosition[oldPage]; const newPos: number = pagesPosition[newPage]; setSlideDirection( newPos > oldPos ? { in: 'left', out: 'right' } : { in: 'right', out: 'left' }, ); }; const changePage = function (mouseEvent: any, newPage: Page): void { if (newPage !== 'none') { const slot = garage.getSlot(); handleSlideDirection(page, newPage); setPage(newPage); const shortAlias = String(slot?.activeShortAlias); const activeOrderId = slot?.getRobot(slot?.activeShortAlias ?? '')?.activeOrderId; const lastOrderId = slot?.getRobot(slot?.lastShortAlias ?? '')?.lastOrderId; const param = newPage === 'order' ? `${shortAlias}/${String(activeOrderId ?? lastOrderId)}` : ''; if (newPage === 'order') { setCurrentOrderId({ id: activeOrderId ?? lastOrderId, shortAlias }); } setTimeout(() => { navigate(`/${newPage}/${param}`); }, theme.transitions.duration.leavingScreen * 3); } }; useEffect(() => { setOpen(closeAll); }, [page, setOpen]); const slot = garage.getSlot(); return ( { setOpen({ ...closeAll, profile: !open.profile }); }} icon={ slot?.hashId ? ( ) : ( <> ) } /> } iconPosition='start' /> } iconPosition='start' /> } iconPosition='start' /> } iconPosition='start' /> } iconPosition='start' /> { setOpen((open) => { return { ...open, more: !open.more }; }); }} icon={ } iconPosition='start' /> ); }; export default NavBar;