@@ -1,5 +1,5 @@
11import { UnspawnedPoints } from '@urbit/roller-api';
2−import { DEFAULT_CSV_NAME, POINT_DOMINIONS } from 'lib/constants';
2+import { POINT_DOMINIONS } from 'lib/constants';
33import { deriveNetworkSeedFromUrbitWallet } from 'lib/keys';
44import * as need from 'lib/need';
55import * as azimuth from 'azimuth-js';
@@ -25,7 +25,7 @@ import {
2525import { useWallet } from 'store/wallet';
2626import { usePointCache } from 'store/pointCache';
2727import create from 'zustand';
28−import { generateCsvLine, generateCsvName } from 'lib/utils/invite';
28+import { generateCsvLine } from 'lib/utils/invite';
2929
3030const inviteTemplate = (
3131 planet: number,
@@ -45,20 +45,24 @@ export type InviteGeneratingStatus =
4545 | 'finished'
4646 | 'errored';
4747
48+interface InviteJob {
49+ generatingNum: number;
50+ status: InviteGeneratingStatus;
51+}
52+
4853interface InviteStore {
4954 invites: Invites;
50− generatingStatus: InviteGeneratingStatus;
51− generatingNum: number;
52− loading: boolean;
55+ inviteJobs: {
56+ [point: number]: InviteJob;
57+ };
5358 addInvite: (point: number, invite: Invite) => void;
5459 setInvites: (points: number, invites: Invite[]) => void;
60+ updateJob: (point: number, updates: Partial<InviteJob>) => void;
5561}
5662
5763export const useInviteStore = create<InviteStore>((set, get) => ({
5864 invites: {},
59− generatingStatus: 'initial',
60− generatingNum: 0,
61− loading: false,
65+ inviteJobs: {},
6266 addInvite: (point: number, invite: Invite) => {
6367 set(state => {
6468 const newInvites: Invites = {};
@@ -76,6 +80,17 @@ export const useInviteStore = create<InviteStore>((set, get) => ({
7680 newInvites[point] = invites;
7781 return { invites: Object.assign(state.invites, newInvites) };
7882 }),
83+ updateJob: (point: number, updates: Partial<InviteJob>) => {
84+ debugger;
85+ const jobs = get().inviteJobs;
86+ const job = jobs[point] || { status: 'initial', generatingNum: 0 };
87+ const newJob = Object.assign({}, job, updates);
88+ jobs[point] = newJob;
89+
90+ //console.log({ point, oldJob: job, updates, newJob });
91+
92+ set({ inviteJobs: jobs });
93+ },
7994}));
8095
8196export function useInvites() {
@@ -87,8 +102,13 @@ export function useInvites() {
87102 const getDetails = allPoints?.getDetails;
88103 const { api, ls } = useRoller();
89104 const { point, pointList, setPendingTransactions } = useRollerStore();
90− const { addInvite, setInvites } = useInviteStore();
91− const updatingInvites = useRef<number[]>([]);
105+ const {
106+ invites,
107+ inviteJobs,
108+ addInvite,
109+ setInvites,
110+ updateJob,
111+ } = useInviteStore();
92112
93113 const generateInviteInfo = async (planet: number, _authToken: string) => {
94114 const { ticket, inviteWallet } = await generateInviteWallet(
@@ -100,13 +120,14 @@ export function useInvites() {
100120 };
101121
102122 const getInvites = useCallback(async () => {
103− if (updatingInvites.current.includes(point.value)) {
123+ const inviteJob = inviteJobs[point.value];
124+ if (inviteJob?.status === 'generating') {
104125 return;
105126 }
106127
107− updatingInvites.current.push(point.value);
108128 try {
109− useInviteStore.setState({ loading: true });
129+ updateJob(point.value, { status: 'generating' });
130+
110131 const curPoint: number = Number(need.point(pointCursor));
111132 const _authToken = authToken.getOrElse(null);
112133 const _contracts = contracts.getOrElse(null);
@@ -145,7 +166,7 @@ export function useInvites() {
145166 const storedInvites = getStoredInvites(ls);
146167
147168 for (let i = 0; i < invitePlanets.length; i++) {
148− useInviteStore.setState({ generatingNum: i + 1 });
169+ updateJob(point.value, { generatingNum: i + 1 });
149170 const planet = invitePlanets[i];
150171 const storedInvite = storedInvites[planet];
151172 const invite =
@@ -169,16 +190,13 @@ export function useInvites() {
169190 }
170191 }
171192
172− useInviteStore.setState({ loading: false, generatingNum: 0 });
193+ updateJob(point.value, { status: 'finished', generatingNum: 0 });
173194 return newInvites;
174195 }
175196 } catch (error) {
176197 console.warn('ERROR GETTING INVITES', error);
177− useInviteStore.setState({ loading: false, generatingNum: 0 });
198+ updateJob(point.value, { status: 'errored', generatingNum: 0 });
178199 }
179−
180− const pointIndex = updatingInvites.current.indexOf(point.value);
181− updatingInvites.current.splice(pointIndex, 1);
182200 }, [
183201 api,
184202 authToken,
@@ -190,6 +208,7 @@ export function useInvites() {
190208 addInvite,
191209 setInvites,
192210 setPendingTransactions,
211+ updateJob,
193212 ]);
194213
195214 const generateInviteCodes = useCallback(
@@ -233,7 +252,7 @@ export function useInvites() {
233252 });
234253
235254 for (let i = 0; i < numInvites && planets[i]; i++) {
236− useInviteStore.setState({ generatingNum: i + 1 });
255+ updateJob(point.value, { generatingNum: i + 1 });
237256 const planet = planets[i];
238257 const nonceInc = i + nonce;
239258
@@ -327,38 +346,23 @@ export function useInvites() {
327346 getDetails,
328347 ls,
329348 getInvites,
349+ updateJob,
330350 ]
331351 );
332352
333− const generateCsv = useCallback(async () => {
334− const invites = await getInvites();
353+ const generateCsv = useCallback(() => {
354+ const pointInvites = invites[point.value];
335355
336− if (!invites) {
356+ if (!pointInvites) {
337357 throw new Error('There was an error creating the CSV');
338358 }
339359
340− const csv = invites.reduce(
360+ return pointInvites.reduce(
341361 (csvData, { ticket, planet }, ind) =>
342362 (csvData += generateCsvLine(ind, ticket, planet)),
343363 'Number,Planet,Invite URL,Point,Ticket\n'
344364 );
345−
346− document.getElementById('csv')?.remove();
347− const hiddenElement = document.createElement('a');
348− hiddenElement.href = `data:text/csv;charset=utf-8,${encodeURIComponent(
349− csv
350− )}`;
351− hiddenElement.target = '_blank';
352− hiddenElement.id = 'csv';
353−
354− //provide the name for the CSV file to be downloaded
355− hiddenElement.download = generateCsvName(
356− DEFAULT_CSV_NAME,
357− point.patp?.slice(1) || 'bridge'
358− );
359−
360− return hiddenElement;
361− }, [getInvites, point]);
365+ }, [invites, point]);
362366
363367 return {
364368 getInvites,