diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 795ba9c9bf..c91a4eeab5 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -388,6 +388,11 @@ export const ComposePost = ({ return true }, [thread.posts]) + // Clear the composer (discard current content) + const handleClearComposer = React.useCallback(() => { + composerDispatch({type: 'clear'}) + }, [composerDispatch]) + const insets = useSafeAreaInsets() const viewStyles = useMemo( () => ({ @@ -814,6 +819,7 @@ export const ComposePost = ({ onPublish={onPressPublish} onSelectDraft={handleSelectDraft} onSaveDraft={saveCurrentDraft} + onDiscard={handleClearComposer} isEmpty={isComposerEmpty}> {missingAltError && } void onSelectDraft: (draft: StoredDraft) => void onSaveDraft: () => Promise + onDiscard: () => void isEmpty: boolean topBarAnimatedStyle: StyleProp children?: React.ReactNode @@ -1148,6 +1156,7 @@ function ComposerTopBar({ {isPublishing ? ( diff --git a/src/view/com/composer/drafts/DraftsButton.tsx b/src/view/com/composer/drafts/DraftsButton.tsx index 894831edb6..863e70f975 100644 --- a/src/view/com/composer/drafts/DraftsButton.tsx +++ b/src/view/com/composer/drafts/DraftsButton.tsx @@ -11,10 +11,12 @@ import {DraftsListDialog} from './DraftsListDialog' export function DraftsButton({ onSelectDraft, onSaveDraft, + onDiscard, isEmpty, }: { onSelectDraft: (draft: StoredDraft) => void onSaveDraft: () => Promise + onDiscard: () => void isEmpty: boolean }) { const {_} = useLingui() @@ -38,6 +40,7 @@ export function DraftsButton({ } const handleDiscardAndOpen = () => { + onDiscard() draftsDialogControl.open() } diff --git a/src/view/com/composer/state/composer.ts b/src/view/com/composer/state/composer.ts index aa776dab98..17d76ddd84 100644 --- a/src/view/com/composer/state/composer.ts +++ b/src/view/com/composer/state/composer.ts @@ -131,6 +131,9 @@ export type ComposerAction = /** Map of localId -> loaded media path/URL */ loadedMedia: Map } + | { + type: 'clear' + } export const MAX_IMAGES = 4 @@ -309,6 +312,31 @@ export function composerReducer( }, } } + case 'clear': { + return { + activePostIndex: 0, + mutableNeedsFocusActive: true, + draftId: undefined, + thread: { + posts: [ + { + id: nanoid(), + richtext: new RichText({text: ''}), + shortenedGraphemeLength: 0, + labels: [], + embed: { + quote: undefined, + media: undefined, + link: undefined, + }, + }, + ], + // Keep the user's default interaction settings + postgate: state.thread.postgate, + threadgate: state.thread.threadgate, + }, + } + } } }