Breaking Change: Update to latest XO-Engine #2
@@ -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,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user