From 4cccaf5d8edec1ba45203a18e2542116f6c3c0f0 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 13 Jan 2026 17:54:28 +0200 Subject: [PATCH] Mark composer as clean after saving draft Add mark_saved action that resets isDirty to false and updates the draftId. This is dispatched after successfully saving a draft, allowing the user to close the composer without a discard prompt since their changes have been saved. Co-Authored-By: Claude Opus 4.5 --- src/view/com/composer/Composer.tsx | 10 ++++++---- src/view/com/composer/state/composer.ts | 11 +++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index ac3033dd34..69f923cc58 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -349,26 +349,28 @@ export const ComposePost = ({ const handleSaveDraft = React.useCallback(async () => { try { - await saveDraft({ + const savedDraft = await saveDraft({ composerState, replyTo, existingDraftId: composerState.draftId, }) + composerDispatch({type: 'mark_saved', draftId: savedDraft.id}) onClose() } catch (e) { logger.error('Failed to save draft', {error: e}) setError(_(msg`Failed to save draft`)) } - }, [saveDraft, composerState, replyTo, onClose, _]) + }, [saveDraft, composerState, replyTo, composerDispatch, onClose, _]) // Save without closing - for use by DraftsButton const saveCurrentDraft = React.useCallback(async () => { - await saveDraft({ + const savedDraft = await saveDraft({ composerState, replyTo, existingDraftId: composerState.draftId, }) - }, [saveDraft, composerState, replyTo]) + composerDispatch({type: 'mark_saved', draftId: savedDraft.id}) + }, [saveDraft, composerState, replyTo, composerDispatch]) // Check if composer is empty (no content to save) const isComposerEmpty = React.useMemo(() => { diff --git a/src/view/com/composer/state/composer.ts b/src/view/com/composer/state/composer.ts index 8ac26d1feb..7fcb462196 100644 --- a/src/view/com/composer/state/composer.ts +++ b/src/view/com/composer/state/composer.ts @@ -136,6 +136,10 @@ export type ComposerAction = | { type: 'clear' } + | { + type: 'mark_saved' + draftId: string + } export const MAX_IMAGES = 4 @@ -346,6 +350,13 @@ export function composerReducer( }, } } + case 'mark_saved': { + return { + ...state, + isDirty: false, + draftId: action.draftId, + } + } } }