diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index cc21a2688a..f4e7863679 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -42,11 +42,14 @@ import {Trash_Stroke2_Corner0_Rounded} from '#/components/icons/Trash' import {Link} from '#/components/Link' import {useMenuControl} from '#/components/Menu' import {PostAlerts} from '#/components/moderation/PostAlerts' +import {createPortalGroup} from '#/components/Portal' import {Text} from '#/components/Typography' import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' import type * as bsky from '#/types/bsky' +export const ChatListItemPortal = createPortalGroup() + export let ChatListItem = ({ convo, showMenu = true, @@ -331,200 +334,215 @@ function ChatListItemReady({ const hasUnread = convo.unreadCount > 0 && !isDeletedAccount return ( - - + + - - - - - {({hovered, pressed, focused}) => ( - - {/* Avatar goes here */} - + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} + // @ts-expect-error web only + onFocus={onFocus} + onBlur={onMouseLeave} + style={[a.relative, t.atoms.bg]}> + + + + + {({hovered, pressed, focused}) => ( - - + style={[ + a.flex_row, + isDeletedAccount ? a.align_center : a.align_start, + a.flex_1, + a.px_lg, + a.py_md, + a.gap_md, + (hovered || pressed || focused) && t.atoms.bg_contrast_25, + ]}> + {/* Avatar goes here */} + + + + + + + {displayName} + + + {verification.showBadge && ( + + + + )} + {lastMessageSentAt && ( + + + {({timeElapsed}) => ( + + · {timeElapsed} + + )} + + + )} + {(convo.muted || moderation.blocked) && ( + + {' '} + ·{' '} + + + )} + + + {!isDeletedAccount && ( - {displayName} - - - {verification.showBadge && ( - - - - )} - {lastMessageSentAt && ( - - - {({timeElapsed}) => ( - - · {timeElapsed} - - )} - - - )} - {(convo.muted || moderation.blocked) && ( - - {' '} - ·{' '} - + @{profile.handle} )} + + + {lastMessage} + + + + + {children} - {!isDeletedAccount && ( - - @{profile.handle} - + {hasUnread && ( + )} - - - {lastMessage} - - - - - {children} + )} + - {hasUnread && ( - - )} - + + + {showMenu && ( + 0} + hideTrigger={isNative} + blockInfo={blockInfo} + style={[ + a.absolute, + a.h_full, + a.self_end, + a.justify_center, + { + right: tokens.space.lg, + opacity: + !gtMobile || showActions || menuControl.isOpen ? 1 : 0, + }, + ]} + latestReportableMessage={latestReportableMessage} + /> )} - - - {showMenu && ( - 0} - hideTrigger={isNative} - blockInfo={blockInfo} - style={[ - a.absolute, - a.h_full, - a.self_end, - a.justify_center, - { - right: tokens.space.lg, - opacity: !gtMobile || showActions || menuControl.isOpen ? 1 : 0, - }, - ]} - latestReportableMessage={latestReportableMessage} /> - )} - - - + + + ) } diff --git a/src/screens/Messages/components/RequestListItem.tsx b/src/screens/Messages/components/RequestListItem.tsx index 4b1f4d0140..1f23b88823 100644 --- a/src/screens/Messages/components/RequestListItem.tsx +++ b/src/screens/Messages/components/RequestListItem.tsx @@ -7,7 +7,7 @@ import {useSession} from '#/state/session' import {atoms as a, tokens} from '#/alf' import {KnownFollowers} from '#/components/KnownFollowers' import {Text} from '#/components/Typography' -import {ChatListItem} from './ChatListItem' +import {ChatListItem, ChatListItemPortal} from './ChatListItem' import {AcceptChatButton, DeleteChatButton, RejectMenu} from './RequestButtons' export function RequestListItem({convo}: {convo: ChatBskyConvoDefs.ConvoView}) { @@ -42,37 +42,40 @@ export function RequestListItem({convo}: {convo: ChatBskyConvoDefs.ConvoView}) { Accept Request + {/* then, this gets absolutely positioned on top of the spacer */} + + + {!isDeletedAccount ? ( + <> + + + + ) : ( + <> + + + + )} + + - - {!isDeletedAccount ? ( - <> - - - - ) : ( - <> - - - - )} - ) }