import React, { useContext, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import {
Alert,
Box,
Button,
ButtonGroup,
Collapse,
Grid,
LinearProgress,
Link,
Typography,
Stepper,
Step,
StepLabel,
StepConnector,
styled,
stepConnectorClasses,
Paper,
useTheme,
useMediaQuery,
IconButton,
} from '@mui/material';
import {
Check,
Casino,
SmartToy,
Storefront,
AddBox,
School,
ContentCopy,
} from '@mui/icons-material';
import RobotAvatar from '../../components/RobotAvatar';
import TokenInput from './TokenInput';
import { genBase62Token } from '../../utils';
import { AppContext, type UseAppStoreType } from '../../contexts/AppContext';
import { GarageContext, type UseGarageStoreType } from '../../contexts/GarageContext';
const StyledPaper = styled(Paper)(({ theme }) => ({
backgroundColor: theme.palette.background.paper,
boxShadow: '8px 8px 0px 0px rgba(0, 0, 0, 0.2)',
borderRadius: '16px',
border: '2px solid #000',
padding: theme.spacing(2),
color: theme.palette.text.primary,
width: '100%',
maxWidth: '500px',
margin: '0 auto',
}));
const StyledButton = styled(Button)(({ theme }) => ({
justifyContent: 'center',
textAlign: 'center',
padding: theme.spacing(1),
borderRadius: '8px',
border: '2px solid #000',
boxShadow: '4px 4px 0px 0px rgba(0, 0, 0, 0.2)',
textTransform: 'none',
fontWeight: 'bold',
width: '100%',
'&:hover': {
boxShadow: '6px 6px 0px 0px rgba(0, 0, 0, 0.3)',
},
}));
const StyledStepConnector = styled(StepConnector)(({ theme }) => ({
[`&.${stepConnectorClasses.alternativeLabel}`]: {
top: 22,
left: 'calc(-50% + 20px)',
right: 'calc(50% + 20px)',
},
[`&.${stepConnectorClasses.active}`]: {
[`& .${stepConnectorClasses.line}`]: {
borderColor: theme.palette.primary.main,
},
},
[`&.${stepConnectorClasses.completed}`]: {
[`& .${stepConnectorClasses.line}`]: {
borderColor: theme.palette.primary.main,
},
},
[`& .${stepConnectorClasses.line}`]: {
borderColor: theme.palette.mode === 'dark' ? theme.palette.grey[800] : '#eaeaf0',
borderTopWidth: 3,
borderRadius: 1,
},
}));
const StyledStepIconRoot = styled('div')<{ ownerState: { active?: boolean; completed?: boolean } }>(
({ theme, ownerState }) => ({
backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[700] : '#ccc',
zIndex: 1,
color: '#fff',
width: 44,
height: 44,
display: 'flex',
borderRadius: '50%',
justifyContent: 'center',
alignItems: 'center',
...(ownerState.active && {
backgroundColor: theme.palette.primary.main,
boxShadow: '0 4px 10px 0 rgba(0,0,0,.25)',
}),
...(ownerState.completed && {
backgroundColor: theme.palette.primary.main,
}),
}),
);
function StyledStepIcon(props: StepIconProps) {
const { active, completed, className } = props;
const icons: { [index: string]: React.ReactElement } = {
1: ,
2: ,
3: ,
};
return (
{icons[String(props.icon)]}
);
}
const Onboarding = ({
setView,
inputToken,
setInputToken,
badToken,
getGenerateRobot,
}: OnboardingProps): JSX.Element => {
const { t } = useTranslation();
const navigate = useNavigate();
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
const { setPage } = useContext(AppContext);
const { garage } = useContext(GarageContext);
const [step, setStep] = useState<'1' | '2' | '3'>('1');
const [generatedToken, setGeneratedToken] = useState(false);
const [loading, setLoading] = useState(false);
const generateToken = (): void => {
setGeneratedToken(true);
setInputToken(genBase62Token(36));
setLoading(true);
setTimeout(() => {
setLoading(false);
}, 1000);
};
const slot = garage.getSlot();
const steps = [
t('1. Generate a token'),
t('2. Meet your robot identity'),
t('3. Browse or create an order'),
];
return (
}
sx={{ width: '100%', mb: 3 }}
>
{steps.map((label) => (
{isMobile ? null : label}
))}
{step === '1' && (
<>
{t('1. Generate a token')}
{t(
'This temporary key gives you access to a unique and private robot identity for your trade.',
)}
{!generatedToken ? (
{t('Generate Token')}
) : (
{t('Store it somewhere safe!')}
{t(
'This token is the one and only key to your robot and trade. You will need it later to recover your order or check its status.',
)}
null}
sx={{ flexGrow: 1 }}
/>
navigator.clipboard.writeText(inputToken)}
size='small'
>
{
setStep('2');
getGenerateRobot(inputToken);
}}
variant='contained'
size='large'
startIcon={}
fullWidth={false}
>
{t('Continue')}
)}
>
)}
{step === '2' && (
<>
{t('2. Meet your robot identity')}
{slot?.hashId ? t('This is your trading avatar') : t('Building your robot!')}
{!slot?.hashId && }
{slot?.nickname && (
<>
{t('Hi! My name is')}
{slot.nickname}
>
)}
setStep('3')}
variant='contained'
size='large'
startIcon={}
disabled={!slot?.hashId}
fullWidth={false}
>
{t('Continue')}
>
)}
{step === '3' && (
<>
{t('3. Browse or create an order')}
{t(
'RoboSats is a peer-to-peer marketplace. You can browse the public offers or create a new one.',
)}
{
navigate('/offers');
setPage('offers');
}}
startIcon={}
>
{t('Offers')}
{
navigate('/create');
setPage('create');
}}
startIcon={}
color='secondary'
>
{t('Create')}
{t('If you need help on your RoboSats journey join our public support')}{' '}
{t('Telegram group')}
, {t('or visit the robot school for documentation.')}
}
fullWidth={isMobile}
>
{t('Learn RoboSats')}
>
)}
);
};
export default Onboarding;