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();
}
}}
/>
);
};