fix(post): preserve content when signing fails or is rejected

Critical bug fix: Separate signing from publishing to handle failures correctly.

**The Problem:**
- When user rejected signing (or signing failed), we treated it as a publishing failure
- Set all relay states to "error" even though we never tried to publish
- Destroyed the user's post content

**The Solution:**
- Split signing and publishing into separate try-catch blocks
- If signing fails: show toast, reset isPublishing, and RETURN EARLY
- User keeps their content and can try again
- Only update relay states if we actually attempted to publish

**User Experience:**
- User rejects signing → toast appears, post is preserved, can edit or try again
- Publishing fails → relay states show errors, can retry individual relays
- No more losing your carefully crafted post to a rejected signature!
This commit is contained in:
Claude
2026-01-21 11:20:13 +00:00
parent 2dfa58d10e
commit 2ca3238577

View File

@@ -365,6 +365,8 @@ export function PostViewer({ windowId }: PostViewerProps = {}) {
setIsPublishing(true);
// Create and sign event first
let event;
try {
// Create event factory with signer
const factory = new EventFactory();
@@ -419,8 +421,19 @@ export function PostViewer({ windowId }: PostViewerProps = {}) {
content: content.trim(),
tags,
});
const event = await factory.sign(draft);
event = await factory.sign(draft);
} catch (error) {
// Signing failed - user might have rejected it
console.error("Failed to sign event:", error);
toast.error(
error instanceof Error ? error.message : "Failed to sign note",
);
setIsPublishing(false);
return; // Don't destroy the post, let user try again
}
// Signing succeeded, now publish to relays
try {
// Store the signed event for potential retries
setLastPublishedEvent(event);
@@ -493,9 +506,13 @@ export function PostViewer({ windowId }: PostViewerProps = {}) {
error instanceof Error ? error.message : "Failed to publish note",
);
// Reset relay states to pending on error
// Reset relay states to pending on publishing error
setRelayStates((prev) =>
prev.map((r) => ({ ...r, status: "error" as RelayStatus })),
prev.map((r) => ({
...r,
status: "error" as RelayStatus,
error: error instanceof Error ? error.message : "Unknown error",
})),
);
} finally {
setIsPublishing(false);