import { Button } from 'indigo-react'; import { Box, Row, StatelessTextInput } from '@tlon/indigo-react'; import L2BackHeader from 'components/L2/Headers/L2BackHeader'; import BodyPane from 'components/L2/Window/BodyPane'; import HeaderPane from 'components/L2/Window/HeaderPane'; import Window from 'components/L2/Window/Window'; import View from 'components/View'; import useRoller from 'lib/useRoller'; import { useLocalRouter } from 'lib/LocalRouter'; import { ddmmmYYYY } from 'lib/utils/date'; import { isExternalWallet } from 'lib/utils/wallet'; import { useCallback, useState } from 'react'; import { useRollerStore } from 'store/rollerStore'; import { GeneratingModal } from './GeneratingModal'; import { InviteGeneratingStatus, useInvites, useInviteStore, } from './useInvites'; import { DEFAULT_NUM_INVITES } from 'lib/constants'; import { useTimerStore } from 'store/timerStore'; import { useWallet } from 'store/wallet'; import { UnspawnedPoints } from '@urbit/roller-api'; import { getPendingSpawns } from 'lib/utils/roller'; export const GenerateInvites = () => { const { pop } = useLocalRouter(); const { walletType }: any = useWallet(); const { point, nextQuotaTime } = useRollerStore(); const { api, getPendingTransactions, getAndUpdatePoint } = useRoller(); const { nextRoll } = useTimerStore(); const { inviteJobs } = useInviteStore(); const { generateInviteCodes } = useInvites(); const [generatingStatus, setGeneratingStatus] = useState< InviteGeneratingStatus >('initial'); const [error, setError] = useState(''); const [numInvites, setNumInvites] = useState(DEFAULT_NUM_INVITES); const createInvites = useCallback(async () => { setGeneratingStatus('generating'); try { let planets: UnspawnedPoints = await api.getUnspawned(point.value); const pendingTxs = await api.getPendingByShip(point.value); const pendingSpawns = getPendingSpawns(pendingTxs); planets = planets .filter((point: number) => !pendingSpawns.has(point)) .slice(0, numInvites); await generateInviteCodes(point, planets); getPendingTransactions(); getAndUpdatePoint(point.value); setGeneratingStatus('finished'); } catch (error) { if (typeof error === 'object' && (error as Error)?.message) { setError((error as Error).message); } else if (typeof error === 'string') { setError(error); } else { setError('Generating invites failed'); } setGeneratingStatus('errored'); } }, [ api, point, numInvites, generateInviteCodes, getPendingTransactions, getAndUpdatePoint, setGeneratingStatus, ]); const overQuota = numInvites > point.l2Quota && numInvites > 0; const generateDisabled = overQuota; //loading? const showTxnNote = isExternalWallet(walletType); return ( }>
Generate Invite Codes
I want to generate { const target = e.target as HTMLInputElement; setNumInvites(Number(target.value.replace(/\D/g, ''))); }} /> planet invite code{numInvites > 1 ? 's' : ''} You can generate up to {` ${point.l2Quota} `} invites. You will be able to generate another {` ${point.l2Allowance}`} invites on {` ${ddmmmYYYY(nextQuotaTime)}`}. {showTxnNote && ( Note: you will have to sign 4 transactions per invite, for a total of {4 * numInvites}{' '} signatures. )} Next Roll in {nextRoll} {/* // @ts-ignore */}
{ setGeneratingStatus('initial'); if (generatingStatus !== 'errored') { pop(); } }} />
); };