diff --git a/src/view/com/composer/drafts/DraftItem.tsx b/src/view/com/composer/drafts/DraftItem.tsx
index 95c30281f6..474e572b06 100644
--- a/src/view/com/composer/drafts/DraftItem.tsx
+++ b/src/view/com/composer/drafts/DraftItem.tsx
@@ -1,4 +1,4 @@
-import {useEffect, useState} from 'react'
+import {useCallback, useEffect, useState} from 'react'
import {Image, Pressable, View} from 'react-native'
import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
@@ -12,7 +12,7 @@ import {UserAvatar} from '#/view/com/util/UserAvatar'
import {atoms as a, useTheme} from '#/alf'
import {Button, ButtonIcon} from '#/components/Button'
import {DotGrid_Stroke2_Corner0_Rounded as DotsIcon} from '#/components/icons/DotGrid'
-import {Trash_Stroke2_Corner0_Rounded as TrashIcon} from '#/components/icons/Trash'
+import * as Prompt from '#/components/Prompt'
import {Text} from '#/components/Typography'
// Platform-specific storage import
@@ -24,53 +24,68 @@ export function DraftItem({
draft,
onSelect,
onDelete,
- isDeleting,
}: {
draft: DraftSummary
onSelect: (draft: DraftSummary) => void
onDelete: (draftId: string) => void
- isDeleting: boolean
}) {
const {_} = useLingui()
const t = useTheme()
+ const discardPromptControl = Prompt.usePromptControl()
+
+ const handleDelete = useCallback(() => {
+ onDelete(draft.id)
+ }, [onDelete, draft.id])
return (
- onSelect(draft)}
- style={({pressed, hovered}) => [
- a.rounded_md,
- a.overflow_hidden,
- t.atoms.bg,
- (pressed || hovered) && t.atoms.bg_contrast_25,
- ]}>
-
- {/* Reply indicator */}
- {draft.isReply && draft.replyToHandle && (
-
- Replying to @{draft.replyToHandle}
-
- )}
+ <>
+ onSelect(draft)}
+ style={({pressed, hovered}) => [
+ a.rounded_md,
+ a.overflow_hidden,
+ a.border,
+ t.atoms.bg,
+ t.atoms.border_contrast_low,
+ t.atoms.shadow_sm,
+ (pressed || hovered) && t.atoms.bg_contrast_25,
+ ]}>
+
+ {/* Reply indicator */}
+ {draft.isReply && draft.replyToHandle && (
+
+ Replying to @{draft.replyToHandle}
+
+ )}
- {/* Posts */}
- {draft.posts.map((post, index) => (
-
- ))}
-
-
+ {/* Posts */}
+ {draft.posts.map((post, index) => (
+
+ ))}
+
+
+
+
+ >
)
}
@@ -79,17 +94,13 @@ function DraftPostRow({
isFirst,
isLast,
timestamp,
- draftId,
- onDelete,
- isDeleting,
+ discardPromptControl,
}: {
post: DraftPostDisplay
isFirst: boolean
isLast: boolean
timestamp: string
- draftId: string
- onDelete: (draftId: string) => void
- isDeleting: boolean
+ discardPromptControl: Prompt.PromptControlProps
}) {
const {_} = useLingui()
const t = useTheme()
@@ -101,15 +112,11 @@ function DraftPostRow({
const handle = profile?.handle || currentAccount?.handle || ''
const avatarUrl = profile?.avatar
- // Nested posts (not first) have smaller styling
- const avatarSize = isFirst ? 42 : 32
- const textStyle = isFirst ? a.text_md : a.text_sm
-
return (
-
+
{/* Avatar column with thread line */}
-
+
{/* Thread line connecting posts */}
{!isLast && (
{displayName && (
{displayName}
)}
@{handle}
-
+
·
{({timeElapsed}) => (
{timeElapsed}
@@ -167,7 +174,7 @@ function DraftPostRow({
size="tiny"
onPress={e => {
e.stopPropagation()
- // TODO: Show menu with options
+ discardPromptControl.open()
}}>
@@ -176,34 +183,15 @@ function DraftPostRow({
{/* Post text - full, not truncated */}
{post.text ? (
- {post.text}
+ {post.text}
) : (
-
+
(No text)
)}
{/* Media preview */}
-
- {/* Delete button (only on last post) */}
- {isLast && (
-
-
-
- )}
)
diff --git a/src/view/com/composer/drafts/DraftsListDialog.tsx b/src/view/com/composer/drafts/DraftsListDialog.tsx
index f4e401d2bd..7bacc1205e 100644
--- a/src/view/com/composer/drafts/DraftsListDialog.tsx
+++ b/src/view/com/composer/drafts/DraftsListDialog.tsx
@@ -29,7 +29,7 @@ export function DraftsListDialog({
const t = useTheme()
const {data: drafts, isLoading} = useDrafts()
const loadDraft = useLoadDraft()
- const {mutate: deleteDraft, isPending: isDeleting} = useDeleteDraft()
+ const {mutate: deleteDraft} = useDeleteDraft()
const handleSelectDraft = useCallback(
async (summary: DraftSummary) => {
@@ -68,11 +68,15 @@ export function DraftsListDialog({
const listHeader = useMemo(() => {
return (
-
-
- Drafts
-
-
+
+
+
+ Drafts
+
+
+ {/* Spacer between header and first item */}
+
+
)
}, [backButton])
@@ -84,12 +88,11 @@ export function DraftsListDialog({
draft={item}
onSelect={handleSelectDraft}
onDelete={handleDeleteDraft}
- isDeleting={isDeleting}
/>
)
},
- [handleSelectDraft, handleDeleteDraft, isDeleting],
+ [handleSelectDraft, handleDeleteDraft],
)
const itemSeparator = useCallback(() => , [])
@@ -102,7 +105,13 @@ export function DraftsListDialog({
)
}
- return
+ return (
+
+ )
}, [isLoading, _])
return (
@@ -115,8 +124,8 @@ export function DraftsListDialog({
ListEmptyComponent={emptyComponent}
ItemSeparatorComponent={itemSeparator}
stickyHeaderIndices={[0]}
- style={t.atoms.bg_contrast_25}
- contentContainerStyle={[a.pb_lg]}
+ style={[t.atoms.bg_contrast_50, a.px_0]}
+ webInnerContentContainerStyle={[a.py_0]}
/>
)
diff --git a/src/view/com/util/EmptyState.tsx b/src/view/com/util/EmptyState.tsx
index b14f426ec9..5300767b45 100644
--- a/src/view/com/util/EmptyState.tsx
+++ b/src/view/com/util/EmptyState.tsx
@@ -95,12 +95,13 @@ export function EmptyState({
a.leading_snug,
a.text_center,
a.self_center,
+ !button && a.mb_5xl,
textStyle,
]}>
{message}
{button && (
-
+