import React, { useState, useContext, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { Button, Grid, LinearProgress, Typography, Select, MenuItem, Box, useTheme, type SelectChangeEvent, IconButton, Tooltip, } from '@mui/material'; import { Key, Bolt, Add, DeleteSweep, Download, Settings } from '@mui/icons-material'; import RobotAvatar from '../../components/RobotAvatar'; import TokenInput from './TokenInput'; import { type Slot, type Robot } from '../../models'; import { AppContext, closeAll, type UseAppStoreType } from '../../contexts/AppContext'; import { genBase62Token } from '../../utils'; import { LoadingButton } from '@mui/lab'; import { GarageContext, type UseGarageStoreType } from '../../contexts/GarageContext'; import { type UseFederationStoreType, FederationContext } from '../../contexts/FederationContext'; import { DeleteRobotConfirmationDialog } from '../../components/Dialogs'; interface RobotProfileProps { robot: Robot; setRobot: (state: Robot) => void; setView: (state: 'welcome' | 'onboarding' | 'recovery' | 'profile') => void; inputToken: string; setInputToken: (state: string) => void; width: number; baseUrl: string; } const RobotProfile = ({ inputToken, setInputToken, setView, width, }: RobotProfileProps): React.JSX.Element => { const { windowSize, setOpen, open, navigateToPage, client } = useContext(AppContext); const { garage, slotUpdatedAt } = useContext(GarageContext); const { federation } = useContext(FederationContext); const { t } = useTranslation(); const theme = useTheme(); const navigate = useNavigate(); const mobileView = windowSize?.width < 50; const [loading, setLoading] = useState(true); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); useEffect(() => { const slot = garage.getSlot(); if (slot?.hashId) { setLoading(false); } }, [slotUpdatedAt, loading]); const handleAddRobot = (): void => { const token = genBase62Token(36); void garage.createRobot(federation, token); setInputToken(token); setLoading(true); }; const handleChangeSlot = (e: SelectChangeEvent): void => { if (e?.target?.value) { garage.setCurrentSlot(e.target.value as string); setInputToken(garage.getSlot()?.token ?? ''); setLoading(true); } }; const handleDeleteRobot = (): void => { setDeleteDialogOpen(true); }; const handleConfirmDelete = (): void => { garage.deleteSlot(); setDeleteDialogOpen(false); if (Object.keys(garage.slots).length < 1) setView('welcome'); }; const handleCancelDelete = (): void => { setDeleteDialogOpen(false); }; const slot = garage.getSlot(); const robot = slot?.getRobot(); return ( { setOpen({ ...closeAll, profile: !open.profile }); }} style={{}} > {slot?.nickname ? (
{width < 19 ? null : ( )} {slot?.nickname} {width < 19 ? null : ( )}
) : ( <> {t('Building your robot!')} )}
{federation.loading && !slot?.activeOrder && !slot?.lastOrder ? ( {t('Looking for orders!')} ) : null} {slot?.activeOrder ? ( ) : null} {!slot?.activeOrder && slot?.lastOrder ? ( ) : null} {!slot?.activeOrder && !slot?.lastOrder && !federation.loading ? ( {t('No existing orders found')} ) : null} null} />
{t('Robot Garage')} {client !== 'mobile' && ( )} {!mobileView && t('Add Robot')}
); }; export default RobotProfile;