Conversation-level reporting by reporting most recent message available (#7423)

* report latest message via convo menu

* check all messages we have

* fix types

* rm convo warning
This commit is contained in:
Samuel Newman
2025-01-10 23:35:21 +00:00
committed by GitHub
parent 42a4468265
commit d7f5ee8415
4 changed files with 84 additions and 50 deletions
@@ -25,9 +25,7 @@ import {SquareArrowTopRight_Stroke2_Corner0_Rounded as SquareArrowTopRight} from
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {ReportDialogProps} from './types' import {ReportDialogProps} from './types'
export function SelectReportOptionView({ export function SelectReportOptionView(props: {
...props
}: {
params: ReportDialogProps['params'] params: ReportDialogProps['params']
labelers: AppBskyLabelerDefs.LabelerViewDetailed[] labelers: AppBskyLabelerDefs.LabelerViewDetailed[]
onSelectReportOption: (reportOption: ReportOption) => void onSelectReportOption: (reportOption: ReportOption) => void
+15
View File
@@ -35,6 +35,7 @@ import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/
import * as Menu from '#/components/Menu' import * as Menu from '#/components/Menu'
import * as Prompt from '#/components/Prompt' import * as Prompt from '#/components/Prompt'
import {Bubble_Stroke2_Corner2_Rounded as Bubble} from '../icons/Bubble' import {Bubble_Stroke2_Corner2_Rounded as Bubble} from '../icons/Bubble'
import {ReportDialog} from './ReportDialog'
let ConvoMenu = ({ let ConvoMenu = ({
convo: initialConvo, convo: initialConvo,
@@ -44,6 +45,7 @@ let ConvoMenu = ({
showMarkAsRead, showMarkAsRead,
hideTrigger, hideTrigger,
blockInfo, blockInfo,
latestReportableMessage,
style, style,
}: { }: {
convo: ChatBskyConvoDefs.ConvoView convo: ChatBskyConvoDefs.ConvoView
@@ -56,6 +58,7 @@ let ConvoMenu = ({
listBlocks: ModerationCause[] listBlocks: ModerationCause[]
userBlock?: ModerationCause userBlock?: ModerationCause
} }
latestReportableMessage?: ChatBskyConvoDefs.MessageView
style?: ViewStyleProp['style'] style?: ViewStyleProp['style']
}): React.ReactNode => { }): React.ReactNode => {
const navigation = useNavigation<NavigationProp>() const navigation = useNavigation<NavigationProp>()
@@ -222,7 +225,19 @@ let ConvoMenu = ({
convoId={convo.id} convoId={convo.id}
currentScreen={currentScreen} currentScreen={currentScreen}
/> />
{latestReportableMessage ? (
<ReportDialog
params={{
type: 'convoMessage',
convoId: convo.id,
message: latestReportableMessage,
}}
control={reportControl}
/>
) : (
<ReportConversationPrompt control={reportControl} /> <ReportConversationPrompt control={reportControl} />
)}
<BlockedByListDialog <BlockedByListDialog
control={blockedByListControl} control={blockedByListControl}
listBlocks={listBlocks} listBlocks={listBlocks}
+10
View File
@@ -151,6 +151,15 @@ function HeaderReady({
moderation.ui('displayName'), moderation.ui('displayName'),
) )
const latestMessageFromOther = convoState.items.findLast(
item => item.type === 'message' && item.message.sender.did === profile.did,
)
const latestReportableMessage =
latestMessageFromOther?.type === 'message'
? latestMessageFromOther.message
: undefined
return ( return (
<View style={[a.flex_1]}> <View style={[a.flex_1]}>
<View style={[a.w_full, a.flex_row, a.align_center, a.justify_between]}> <View style={[a.w_full, a.flex_row, a.align_center, a.justify_between]}>
@@ -208,6 +217,7 @@ function HeaderReady({
profile={profile} profile={profile}
currentScreen="conversation" currentScreen="conversation"
blockInfo={blockInfo} blockInfo={blockInfo}
latestReportableMessage={latestReportableMessage}
/> />
)} )}
</View> </View>
@@ -112,13 +112,22 @@ function ChatListItemReady({
const isDimStyle = convo.muted || moderation.blocked || isDeletedAccount const isDimStyle = convo.muted || moderation.blocked || isDeletedAccount
const {lastMessage, lastMessageSentAt} = useMemo(() => { const {lastMessage, lastMessageSentAt, latestReportableMessage} =
useMemo(() => {
// eslint-disable-next-line @typescript-eslint/no-shadow
let lastMessage = _(msg`No messages yet`) let lastMessage = _(msg`No messages yet`)
// eslint-disable-next-line @typescript-eslint/no-shadow
let lastMessageSentAt: string | null = null let lastMessageSentAt: string | null = null
// eslint-disable-next-line @typescript-eslint/no-shadow
let latestReportableMessage: ChatBskyConvoDefs.MessageView | undefined
if (ChatBskyConvoDefs.isMessageView(convo.lastMessage)) { if (ChatBskyConvoDefs.isMessageView(convo.lastMessage)) {
const isFromMe = convo.lastMessage.sender?.did === currentAccount?.did const isFromMe = convo.lastMessage.sender?.did === currentAccount?.did
if (!isFromMe) {
latestReportableMessage = convo.lastMessage
}
if (convo.lastMessage.text) { if (convo.lastMessage.text) {
if (isFromMe) { if (isFromMe) {
lastMessage = _(msg`You: ${convo.lastMessage.text}`) lastMessage = _(msg`You: ${convo.lastMessage.text}`)
@@ -168,6 +177,7 @@ function ChatListItemReady({
return { return {
lastMessage, lastMessage,
lastMessageSentAt, lastMessageSentAt,
latestReportableMessage,
} }
}, [_, convo.lastMessage, currentAccount?.did, isDeletedAccount]) }, [_, convo.lastMessage, currentAccount?.did, isDeletedAccount])
@@ -412,6 +422,7 @@ function ChatListItemReady({
opacity: !gtMobile || showActions || menuControl.isOpen ? 1 : 0, opacity: !gtMobile || showActions || menuControl.isOpen ? 1 : 0,
}, },
]} ]}
latestReportableMessage={latestReportableMessage}
/> />
<LeaveConvoPrompt <LeaveConvoPrompt
control={leaveConvoControl} control={leaveConvoControl}