1import { Button } from 'indigo-react';
2import { Box, Row, StatelessTextInput } from '@tlon/indigo-react';
3import L2BackHeader from 'components/L2/Headers/L2BackHeader';
4import BodyPane from 'components/L2/Window/BodyPane';
5import HeaderPane from 'components/L2/Window/HeaderPane';
6import Window from 'components/L2/Window/Window';
7import View from 'components/View';
8import useRoller from 'lib/useRoller';
9import { useLocalRouter } from 'lib/LocalRouter';
10import { ddmmmYYYY } from 'lib/utils/date';
11import { isExternalWallet } from 'lib/utils/wallet';
12import { useCallback, useState } from 'react';
13import { useRollerStore } from 'store/rollerStore';
14import { GeneratingModal } from './GeneratingModal';
16 InviteGeneratingStatus,
20import { DEFAULT_NUM_INVITES } from 'lib/constants';
21import { useTimerStore } from 'store/timerStore';
22import { useWallet } from 'store/wallet';
23import { UnspawnedPoints } from '@urbit/roller-api';
24import { getPendingSpawns } from 'lib/utils/roller';
26export const GenerateInvites = () => {
27 const { pop } = useLocalRouter();
28 const { walletType }: any = useWallet();
29 const { point, nextQuotaTime } = useRollerStore();
30 const { api, getPendingTransactions, getAndUpdatePoint } = useRoller();
31 const { nextRoll } = useTimerStore();
32 const { inviteJobs } = useInviteStore();
33 const { generateInviteCodes } = useInvites();
34 const [generatingStatus, setGeneratingStatus] = useState<
35 InviteGeneratingStatus
37 const [error, setError] = useState('');
38 const [numInvites, setNumInvites] = useState(DEFAULT_NUM_INVITES);
40 const createInvites = useCallback(async () => {
41 setGeneratingStatus('generating');
43 let planets: UnspawnedPoints = await api.getUnspawned(point.value);
44 const pendingTxs = await api.getPendingByShip(point.value);
45 const pendingSpawns = getPendingSpawns(pendingTxs);
47 .filter((point: number) => !pendingSpawns.has(point))
48 .slice(0, numInvites);
50 await generateInviteCodes(point, planets);
51 getPendingTransactions();
52 getAndUpdatePoint(point.value);
53 setGeneratingStatus('finished');
55 if (typeof error === 'object' && (error as Error)?.message) {
56 setError((error as Error).message);
57 } else if (typeof error === 'string') {
60 setError('Generating invites failed');
62 setGeneratingStatus('errored');
69 getPendingTransactions,
74 const overQuota = numInvites > point.l2Quota && numInvites > 0;
75 const generateDisabled = overQuota; //loading?
76 const showTxnNote = isExternalWallet(walletType);
81 className="cohort show-invite-form"
83 header={<L2BackHeader back={pop} />}>
86 <h5>Generate Invite Codes</h5>
89 <Box className="upper">
90 <Row className="points-input">
93 className={`input-box ${overQuota ? 'over-quota' : ''}`}
97 const target = e.target as HTMLInputElement;
98 setNumInvites(Number(target.value.replace(/\D/g, '')));
101 planet invite code{numInvites > 1 ? 's' : ''}
103 <Box className="mb4" lineHeight="1.4em">
104 You can generate up to
105 <strong>{` ${point.l2Quota} `}</strong>
106 invites. You will be able to generate another
107 <strong>{` ${point.l2Allowance}`}</strong> invites on
108 <strong>{` ${ddmmmYYYY(nextQuotaTime)}`}</strong>.
111 <Box className="mb6" lineHeight="1.4em">
112 Note: you will have to sign <strong>4</strong> transactions per
113 invite, for a total of <strong>{4 * numInvites}</strong>{' '}
118 <Box className="lower">
119 <Row className="next-roll">
120 <span>Next Roll in</span>
121 <span className="timer">{nextRoll}</span>
127 className={`generate-codes ${generateDisabled ? 'disabled' : ''}`}
128 disabled={generateDisabled}
130 onClick={createInvites}>
132 ? `You can only generate ${point.l2Quota} codes`
133 : `Generate Invite Codes (${numInvites})`}
139 status={generatingStatus}
140 current={inviteJobs[point.value]?.generatingNum || 0}
144 setGeneratingStatus('initial');
145 if (generatingStatus !== 'errored') {
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list