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,
+ },
+ }
+ }
}
}