Add removeInvitation to the invitation screen

This commit is contained in:
2026-06-08 13:22:13 +02:00
parent 69adee180a
commit bca736dab4
3 changed files with 57 additions and 0 deletions

View File

@@ -67,6 +67,7 @@ export class AppService extends EventEmitter<AppEventMap> {
{
onUpdated: (invitation: XOInvitation) => void;
onStatusChanged: (status: string) => void;
onRemoved: () => void;
}
>();
@@ -241,13 +242,25 @@ export class AppService extends EventEmitter<AppEventMap> {
invitationIdentifier,
});
};
const onRemoved = () => {
this.detachInvitationListeners(invitationIdentifier);
this.invitations.splice(this.invitations.indexOf(invitation), 1);
this.bumpInvitationRevision(invitationIdentifier);
this.emit("invitation-removed", invitation);
this.emit("wallet-state-changed", {
reason: "invitation-removed",
invitationIdentifier: invitationIdentifier,
});
};
invitation.on("invitation-updated", onUpdated);
invitation.on("invitation-status-changed", onStatusChanged);
invitation.on("invitation-removed", onRemoved);
this.invitationEventCleanup.set(invitationIdentifier, {
onUpdated,
onStatusChanged,
onRemoved,
});
}

View File

@@ -46,6 +46,7 @@ export type { ResolvedInvitationData } from "../utils/resolve-invitation-data.js
export type InvitationEventMap = {
"invitation-updated": XOInvitation;
"invitation-status-changed": string;
"invitation-removed": void;
error: Error;
};
@@ -889,4 +890,21 @@ export class Invitation extends EventEmitter<InvitationEventMap> {
return totalSats;
}
/**
* Removes the invitation from the Local SQLite db as well as the Engine's internal DB
* NOTE: This uses methods that are marked "DANGEROUSLY" inside the engine and behaviour may change
*/
public async delete() {
// Remove the invitation from our local db
this.storage.remove(this.data.invitationIdentifier);
// Remove the invitation from the engine's internal db
await this.engine.DANGEROUS_deleteStoredInvitation(this.data.invitationIdentifier);
this.emit("invitation-removed", this.data.invitationIdentifier);
// Update the status of the invitation
await this.updateStatus();
}
}

View File

@@ -63,6 +63,7 @@ const actionItems: ListItemData<string>[] = [
{ key: 'sign', label: 'Sign Transaction', value: 'sign' },
{ key: 'broadcast', label: 'Broadcast Transaction', value: 'broadcast' },
{ key: 'copy', label: 'Copy Invitation ID', value: 'copy' },
{ key: 'delete', label: 'Delete Invitation', value: 'delete' },
];
/**
@@ -354,6 +355,28 @@ export function InvitationScreen(): React.ReactElement {
}
}, [selectedInvitation, showInfo, showError, setStatus]);
/**
* Delete the selected invitation from both our SQLite db and the engine's db
* NOTE: This uses methods marked "DANGEROUSLY" internally, and may change in the future.
*/
const deleteInvitation = useCallback(async () => {
if (!selectedInvitation) return;
setIsLoading(true)
setStatus('Removing invitation...')
try {
await selectedInvitation.delete();
showInfo('Invitation successfully deleted')
setStatus('Ready')
} catch (error) {
showError(`Failed to delete invitation: ${error instanceof Error ? error.message : String(error)}`)
} finally {
setIsLoading(false)
setStatus('Ready')
}
})
const copyId = useCallback(async () => {
if (!selectedInvitation) {
showError('No invitation selected');
@@ -509,6 +532,9 @@ export function InvitationScreen(): React.ReactElement {
case 'broadcast':
broadcastTransaction();
break;
case 'delete':
deleteInvitation();
break;
}
}, [selectedInvitation, copyId, acceptInvitation, fillRequirements, signInvitation, broadcastTransaction, navigate]);