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; onUpdated: (invitation: XOInvitation) => void;
onStatusChanged: (status: string) => void; onStatusChanged: (status: string) => void;
onRemoved: () => void;
} }
>(); >();
@@ -241,13 +242,25 @@ export class AppService extends EventEmitter<AppEventMap> {
invitationIdentifier, 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-updated", onUpdated);
invitation.on("invitation-status-changed", onStatusChanged); invitation.on("invitation-status-changed", onStatusChanged);
invitation.on("invitation-removed", onRemoved);
this.invitationEventCleanup.set(invitationIdentifier, { this.invitationEventCleanup.set(invitationIdentifier, {
onUpdated, onUpdated,
onStatusChanged, onStatusChanged,
onRemoved,
}); });
} }

View File

@@ -46,6 +46,7 @@ export type { ResolvedInvitationData } from "../utils/resolve-invitation-data.js
export type InvitationEventMap = { export type InvitationEventMap = {
"invitation-updated": XOInvitation; "invitation-updated": XOInvitation;
"invitation-status-changed": string; "invitation-status-changed": string;
"invitation-removed": void;
error: Error; error: Error;
}; };
@@ -889,4 +890,21 @@ export class Invitation extends EventEmitter<InvitationEventMap> {
return totalSats; 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: 'sign', label: 'Sign Transaction', value: 'sign' },
{ key: 'broadcast', label: 'Broadcast Transaction', value: 'broadcast' }, { key: 'broadcast', label: 'Broadcast Transaction', value: 'broadcast' },
{ key: 'copy', label: 'Copy Invitation ID', value: 'copy' }, { 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]); }, [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 () => { const copyId = useCallback(async () => {
if (!selectedInvitation) { if (!selectedInvitation) {
showError('No invitation selected'); showError('No invitation selected');
@@ -509,6 +532,9 @@ export function InvitationScreen(): React.ReactElement {
case 'broadcast': case 'broadcast':
broadcastTransaction(); broadcastTransaction();
break; break;
case 'delete':
deleteInvitation();
break;
} }
}, [selectedInvitation, copyId, acceptInvitation, fillRequirements, signInvitation, broadcastTransaction, navigate]); }, [selectedInvitation, copyId, acceptInvitation, fillRequirements, signInvitation, broadcastTransaction, navigate]);