import React, {memo, useMemo, useState} from 'react' import {View} from 'react-native' import { ChatBskyConvoDefs, ComAtprotoModerationCreateReport, RichText as RichTextAPI, } from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useMutation} from '@tanstack/react-query' import {ReportOption} from '#/lib/moderation/useReportOptions' import {useAgent} from '#/state/session' import {CharProgress} from '#/view/com/composer/char-progress/CharProgress' import * as Toast from '#/view/com/util/Toast' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import * as Dialog from '#/components/Dialog' import {Button, ButtonIcon, ButtonText} from '../Button' import {Divider} from '../Divider' import {ChevronLeft_Stroke2_Corner0_Rounded as Chevron} from '../icons/Chevron' import {Loader} from '../Loader' import {SelectReportOptionView} from '../ReportDialog/SelectReportOptionView' import {RichText} from '../RichText' import {Text} from '../Typography' import {MessageItemMetadata} from './MessageItem' type ReportDialogParams = { type: 'convoMessage' convoId: string message: ChatBskyConvoDefs.MessageView } let ReportDialog = ({ control, params, }: { control: Dialog.DialogControlProps params: ReportDialogParams }): React.ReactNode => { const {_} = useLingui() return ( ) } ReportDialog = memo(ReportDialog) export {ReportDialog} function DialogInner({params}: {params: ReportDialogParams}) { const [reportOption, setReportOption] = useState(null) return reportOption ? ( setReportOption(null)} /> ) : ( ) } function ReasonStep({ setReportOption, }: { setReportOption: (reportOption: ReportOption) => void params: ReportDialogParams }) { const control = Dialog.useDialogContext() return ( ) } function SubmitStep({ params, reportOption, goBack, }: { params: ReportDialogParams reportOption: ReportOption goBack: () => void }) { const {_} = useLingui() const {gtMobile} = useBreakpoints() const t = useTheme() const [details, setDetails] = useState('') const control = Dialog.useDialogContext() const agent = useAgent() const { mutate: submit, error, isPending: submitting, } = useMutation({ mutationFn: async () => { if (params.type === 'convoMessage') { const {convoId, message} = params const report = { reasonType: reportOption.reason, subject: { $type: 'chat.bsky.convo.defs#messageRef', messageId: message.id, convoId, did: message.sender.did, } satisfies ChatBskyConvoDefs.MessageRef, reason: details, } satisfies ComAtprotoModerationCreateReport.InputSchema await agent.createModerationReport(report) } }, onSuccess: () => { control.close(() => { Toast.show(_(msg`Thank you. Your report has been sent.`)) }) }, }) const copy = useMemo(() => { return { convoMessage: { title: _(msg`Report this message`), }, }[params.type] }, [_, params]) return ( {copy.title} Your report will be sent to the Bluesky Moderation Service {params.type === 'convoMessage' && ( )} Reason: {' '} {reportOption.title} Optionally provide additional information below: {error && ( There was an issue sending your report. Please check your internet connection. )} ) } function PreviewMessage({message}: {message: ChatBskyConvoDefs.MessageView}) { const t = useTheme() const rt = useMemo(() => { return new RichTextAPI({text: message.text, facets: message.facets}) }, [message.text, message.facets]) return ( ) }