Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lib/miden/activity/transactions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ describe('transactions utilities', () => {

describe('MAX_WAIT_BEFORE_CANCEL', () => {
it('is 30 minutes in milliseconds', () => {
expect(MAX_WAIT_BEFORE_CANCEL).toBe(30 * 60_000);
expect(MAX_WAIT_BEFORE_CANCEL).toBe(5 * 60_000);
});
});

Expand Down
2 changes: 1 addition & 1 deletion src/lib/miden/activity/transactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { ConsumableNote, NoteTypeEnum, NoteType as NoteTypeString } from '../typ
import { interpretTransactionResult } from './helpers';
import { importAllNotes, queueNoteImport, registerOutputNote } from './notes';

export const MAX_WAIT_BEFORE_CANCEL = 30 * 60_000; // 30 minutes
export const MAX_WAIT_BEFORE_CANCEL = 5 * 60_000; // 5 minutes

export const requestCustomTransaction = async (
accountId: string,
Expand Down
34 changes: 20 additions & 14 deletions src/screens/generating-transaction/GeneratingTransaction.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const GeneratingTransactionPage: FC<GeneratingTransactionPageProps> = ({
const [outputNotes, downloadAll] = useExportNotes();
const [error, setError] = useState(false);
const intervalIdRef = useRef<ReturnType<typeof setInterval> | null>(null);

const timeOutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const { data: txs, mutate: mutateTx } = useRetryableSWR(
[`all-latest-generating-transactions`],
async () => getAllUncompletedTransactions(),
Expand All @@ -39,7 +39,6 @@ export const GeneratingTransactionPage: FC<GeneratingTransactionPageProps> = ({
dedupingInterval: 3_000
}
);

const onClose = useCallback(() => {
const { hash } = window.location;
if (!hash.includes('generating-transaction')) {
Expand Down Expand Up @@ -68,41 +67,48 @@ export const GeneratingTransactionPage: FC<GeneratingTransactionPageProps> = ({
prevTransactionsLength.current > 0 &&
transactions.length === 0
) {
new Promise(res => setTimeout(res, 10_000)).then(async () => {
new Promise(res => (timeOutRef.current = setTimeout(res, 10_000))).then(async () => {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also check for error state?

await trackEvent('GeneratingTransaction Page Closed Automatically');
isAutoCloseEnabled() && onClose();
});
} else if (timeOutRef.current) {
clearTimeout(timeOutRef.current);
timeOutRef.current = null;
}

prevTransactionsLength.current = transactions.length;
}, [transactions, trackEvent, outputNotes, onClose]);

const generateTransaction = useCallback(async () => {
try {
const success = await dbTransactionsLoop(signTransaction);
if (success === false) {
setError(true);
if (intervalIdRef.current) clearInterval(intervalIdRef.current);
}

mutateTx();
await mutateTx();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this intentional? It now blocks until the cache is updated before potentially retrying.

} catch {
setError(true);
if (intervalIdRef.current) clearInterval(intervalIdRef.current);
}
}, [mutateTx, signTransaction]);

useEffect(() => {
if (error) return;
if (error && transactions.length === 0) {
if (intervalIdRef.current) {
clearInterval(intervalIdRef.current);
intervalIdRef.current = null;
}
return;
}
// Continue processing transactions even if there was an error,
// as long as there are transactions in the queue
generateTransaction();
intervalIdRef.current = setInterval(() => {
generateTransaction();
}, 10_000);
}, 5_000);
return () => {
if (intervalIdRef.current) clearInterval(intervalIdRef.current);
intervalIdRef.current = null;
};
}, [generateTransaction, error]);
}, [generateTransaction, error, transactions.length]);

useBeforeUnload(!error && transactions.length !== 0, downloadAll);
const progress = transactions.length > 0 ? (1 / transactions.length) * 80 : 0;
Expand Down Expand Up @@ -153,7 +159,7 @@ export const GeneratingTransaction: React.FC<GeneratingTransactionProps> = ({
if (transactionComplete && !error) {
return <Icon name={IconName.Success} size="3xl" />;
}
if (error) {
if (transactionComplete && error) {
return <Icon name={IconName.Failed} size="3xl" />;
}

Expand All @@ -169,7 +175,7 @@ export const GeneratingTransaction: React.FC<GeneratingTransactionProps> = ({
if (transactionComplete && !error) {
return t('transactionCompleted');
}
if (error) {
if (transactionComplete && error) {
return t('transactionFailed');
}
return t('generatingTransaction');
Expand All @@ -193,7 +199,7 @@ export const GeneratingTransaction: React.FC<GeneratingTransactionProps> = ({
<h1 className="font-semibold text-2xl lh-title">{headerText()}</h1>
<p className="text-base text-center lh-title">
{!error && transactionComplete && t('transactionSuccessDescription')}
{error && t('transactionErrorDescription')}
{error && transactionComplete && t('transactionErrorDescription')}
</p>
</div>
</div>
Expand Down
Loading