import React, {useState} from 'react'; import {NumberInput, TextInput} from './Input'; import OTPOutput, {HashAlgorithm} from './OTPOutput'; import Select from './Select'; import Collapsible from './Collapsible'; import ActionLink from './ActionLink.tsx'; function App() { const [advanced, setAdvanced] = useState(false); const [secret, setSecret] = React.useState(''); const [step, setStep] = React.useState(30); const [offset, setOffset] = React.useState(0); const [digits, setDigits] = React.useState(6); const [algorithm, setAlgorithm] = React.useState('sha1'); const validStep = step > 0; const validDigits = digits > 0 && digits <= 10; const valid = validStep && validDigits; React.useEffect(() => { if (!validStep) return; const now = Date.now(); setOffset(Math.floor(now / (1000 * step))); }, [validStep, step]); React.useEffect(() => { if (!validStep) return; const now = Date.now(); const nextOffset = Math.floor(now / (1000 * step)) + 1; const nextUpdate = nextOffset * step * 1000; const timer = setTimeout(() => setOffset(nextOffset), nextUpdate - now); return () => clearTimeout(timer); }, [validStep, offset, step]); const showAdvanced = React.useCallback(() => { setAdvanced(true); }, []); const hideAdvanced = React.useCallback(() => { setAdvanced(false); }, []); const onReset = React.useCallback(() => { setStep(30); setDigits(6); setAlgorithm('sha1'); }, []); return (
{advanced ? Hide advanced options : Show advanced options}