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 && ( - +