import {memo, useState} from 'react' import {View} from 'react-native' import {type AppBskyActorDefs, type ChatBskyConvoDefs} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {StackActions, useNavigation} from '@react-navigation/native' import type React from 'react' import {type NavigationProp} from '#/lib/routes/types' import {isNative} from '#/platform/detection' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useLeaveConvo} from '#/state/queries/messages/leave-conversation' import { useProfileBlockMutationQueue, useProfileQuery, } from '#/state/queries/profile' import * as Toast from '#/view/com/util/Toast' import {atoms as a, platform, useBreakpoints, useTheme, web} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as Toggle from '#/components/forms/Toggle' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' type ReportDialogParams = { convoId: string message: ChatBskyConvoDefs.MessageView } /** * Dialog shown after a report is submitted, allowing the user to block the * reporter and/or leave the conversation. */ export const AfterReportDialog = memo(function BlockOrDeleteDialogInner({ control, params, currentScreen, }: { control: Dialog.DialogControlProps params: ReportDialogParams currentScreen: 'list' | 'conversation' }): React.ReactNode { const {_} = useLingui() return ( ) }) function DialogInner({ params, currentScreen, }: { params: ReportDialogParams currentScreen: 'list' | 'conversation' }) { const t = useTheme() const {_} = useLingui() const control = Dialog.useDialogContext() const { data: profile, isLoading, isError, } = useProfileQuery({ did: params.message.sender.did, }) return isLoading ? ( ) : isError || !profile ? ( Report submitted Our moderation team has received your report. ) : ( ) } function DoneStep({ convoId, currentScreen, profile, }: { convoId: string currentScreen: 'list' | 'conversation' profile: AppBskyActorDefs.ProfileViewDetailed }) { const {_} = useLingui() const navigation = useNavigation() const control = Dialog.useDialogContext() const {gtMobile} = useBreakpoints() const t = useTheme() const [actions, setActions] = useState(['block', 'leave']) const shadow = useProfileShadow(profile) const [queueBlock] = useProfileBlockMutationQueue(shadow) const {mutate: leaveConvo} = useLeaveConvo(convoId, { onMutate: () => { if (currentScreen === 'conversation') { navigation.dispatch( StackActions.replace('Messages', isNative ? {animation: 'pop'} : {}), ) } }, onError: () => { Toast.show(_(msg`Could not leave chat`), 'xmark') }, }) let btnText = _(msg`Done`) let toastMsg: string | undefined if (actions.includes('leave') && actions.includes('block')) { btnText = _(msg`Block and Delete`) toastMsg = _(msg({message: 'Conversation deleted', context: 'toast'})) } else if (actions.includes('leave')) { btnText = _(msg`Delete Conversation`) toastMsg = _(msg({message: 'Conversation deleted', context: 'toast'})) } else if (actions.includes('block')) { btnText = _(msg`Block User`) toastMsg = _(msg({message: 'User blocked', context: 'toast'})) } const onPressPrimaryAction = () => { control.close(() => { if (actions.includes('block')) { queueBlock() } if (actions.includes('leave')) { leaveConvo() } if (toastMsg) { Toast.show(toastMsg, 'check') } }) } return ( Report submitted Our moderation team has received your report. Block user Delete conversation ) }