import React from 'react' import {View} from 'react-native' import {ComAtprotoLabelDefs, ComAtprotoModerationDefs} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useLabelInfo} from '#/lib/moderation/useLabelInfo' import {makeProfileLink} from '#/lib/routes/links' import {sanitizeHandle} from '#/lib/strings/handles' import {getAgent} from '#/state/session' import * as Toast from '#/view/com/util/Toast' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' import {Divider} from '../Divider' export {useDialogControl as useLabelsOnMeDialogControl} from '#/components/Dialog' type Subject = | { uri: string cid: string } | { did: string } export interface LabelsOnMeDialogProps { control: Dialog.DialogOuterProps['control'] subject: Subject labels: ComAtprotoLabelDefs.Label[] } export function LabelsOnMeDialogInner(props: LabelsOnMeDialogProps) { const {_} = useLingui() const [appealingLabel, setAppealingLabel] = React.useState< ComAtprotoLabelDefs.Label | undefined >(undefined) const {subject, labels} = props const isAccount = 'did' in subject return ( {appealingLabel ? ( setAppealingLabel(undefined)} /> ) : ( <> {isAccount ? ( Labels on your account ) : ( Labels on your content )} You may appeal these labels if you feel they were placed in error. {labels.map(label => ( )} ) } export function LabelsOnMeDialog(props: LabelsOnMeDialogProps) { return ( ) } function Label({ label, control, onPressAppeal, }: { label: ComAtprotoLabelDefs.Label control: Dialog.DialogOuterProps['control'] onPressAppeal: (label: ComAtprotoLabelDefs.Label) => void }) { const t = useTheme() const {_} = useLingui() const {labeler, strings} = useLabelInfo(label) return ( {strings.name} {strings.description} Source:{' '} control.close()}> {labeler ? sanitizeHandle(labeler.creator.handle, '@') : label.src} ) } function AppealForm({ label, subject, control, onPressBack, }: { label: ComAtprotoLabelDefs.Label subject: Subject control: Dialog.DialogOuterProps['control'] onPressBack: () => void }) { const {_} = useLingui() const {labeler, strings} = useLabelInfo(label) const {gtMobile} = useBreakpoints() const [details, setDetails] = React.useState('') const isAccountReport = 'did' in subject const onSubmit = async () => { try { const $type = !isAccountReport ? 'com.atproto.repo.strongRef' : 'com.atproto.admin.defs#repoRef' await getAgent() .withProxy('atproto_labeler', label.src) .createModerationReport({ reasonType: ComAtprotoModerationDefs.REASONAPPEAL, subject: { $type, ...subject, }, reason: details, }) Toast.show(_(msg`Appeal submitted.`)) } finally { control.close() } } return ( <> Appeal "{strings.name}" label This appeal will be sent to{' '} control.close()} style={[a.text_md, a.leading_snug]}> {labeler ? sanitizeHandle(labeler.creator.handle, '@') : label.src} . ) }