import React, { useContext, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Paper, Grid, CircularProgress, Box, Alert, Typography, useTheme, AlertTitle, } from '@mui/material'; import { useParams } from 'react-router-dom'; import { Robot } from '../../models'; import Onboarding from './Onboarding'; import Welcome from './Welcome'; import RobotProfile from './RobotProfile'; import Recovery from './Recovery'; import { TorIcon } from '../../components/Icons'; import { genKey } from '../../pgp'; import { AppContext, type UseAppStoreType } from '../../contexts/AppContext'; import { validateTokenEntropy } from '../../utils'; const RobotPage = (): JSX.Element => { const { robot, setRobot, fetchRobot, torStatus, windowSize, baseUrl } = useContext(AppContext); const { t } = useTranslation(); const params = useParams(); const url_token = params.token; const width = Math.min(windowSize.width * 0.8, 28); const maxHeight = windowSize.height * 0.85 - 3; const theme = useTheme(); const [badToken, setBadToken] = useState(''); const [inputToken, setInputToken] = useState(''); const [view, setView] = useState<'welcome' | 'onboarding' | 'recovery' | 'profile'>( robot.token ? 'profile' : 'welcome', ); useEffect(() => { if (robot.token) { setInputToken(robot.token); } const token = url_token ?? robot.token; if (robot.nickname == null && token) { if (window.NativeRobosats === undefined || torStatus == '"Done"') { getGenerateRobot(token); setView('profile'); } } }, [torStatus]); useEffect(() => { if (inputToken.length < 20) { setBadToken(t('The token is too short')); } else if (!validateTokenEntropy(inputToken).hasEnoughEntropy) { setBadToken(t('Not enough entropy, make it more complex')); } else { setBadToken(''); } }, [inputToken]); const getGenerateRobot = (token: string, slot?: number) => { setInputToken(token); genKey(token).then(function (key) { fetchRobot({ newKeys: { pubKey: key.publicKeyArmored, encPrivKey: key.encryptedPrivateKeyArmored, }, newToken: token, slot, }); }); }; const logoutRobot = () => { setInputToken(''); setRobot(new Robot()); }; if (!(window.NativeRobosats === undefined) && !(torStatus == 'DONE' || torStatus == '"Done"')) { return ( {t('Connecting to TOR')} {t('Connection encrypted and anonymized using TOR.')} {t( 'This ensures maximum privacy, however you might feel the app behaves slow. If connection is lost, restart the app.', )} ); } else { return ( {view === 'welcome' ? ( ) : null} {view === 'onboarding' ? ( ) : null} {view === 'profile' ? ( ) : null} {view === 'recovery' ? ( ) : null} ); } }; export default RobotPage;