import React, {useState, useMemo} from 'react' import {Linking, StyleSheet, TouchableOpacity, View} from 'react-native' import {ScrollView} from 'react-native-gesture-handler' import {ComAtprotoModerationDefs} from '@atproto/api' import {useStores} from 'state/index' import {s} from 'lib/styles' import {RadioGroup, RadioGroupItem} from '../../util/forms/RadioGroup' import {Text} from '../../util/text/Text' import * as Toast from '../../util/Toast' import {ErrorMessage} from '../../util/error/ErrorMessage' import {cleanError} from 'lib/strings/errors' import {usePalette} from 'lib/hooks/usePalette' import {SendReportButton} from './SendReportButton' import {InputIssueDetails} from './InputIssueDetails' const DMCA_LINK = 'https://bsky.app/support/copyright' export const snapPoints = [575] export function Component({ postUri, postCid, }: { postUri: string postCid: string }) { const store = useStores() const pal = usePalette('default') const [isProcessing, setIsProcessing] = useState(false) const [showTextInput, setShowTextInput] = useState(false) const [error, setError] = useState() const [issue, setIssue] = useState() const [details, setDetails] = useState() const submitReport = async () => { setError('') if (!issue) { return } setIsProcessing(true) try { if (issue === '__copyright__') { Linking.openURL(DMCA_LINK) return } await store.agent.createModerationReport({ reasonType: issue, subject: { $type: 'com.atproto.repo.strongRef', uri: postUri, cid: postCid, }, reason: details, }) Toast.show("Thank you for your report! We'll look into it promptly.") store.shell.closeModal() return } catch (e: any) { setError(cleanError(e)) setIsProcessing(false) } } const goBack = () => { setShowTextInput(false) } return ( {showTextInput ? ( ) : ( )} ) } const SelectIssue = ({ error, setShowTextInput, issue, setIssue, submitReport, isProcessing, }: { error: string | undefined setShowTextInput: (v: boolean) => void issue: string | undefined setIssue: (v: string) => void submitReport: () => void isProcessing: boolean }) => { const pal = usePalette('default') const ITEMS: RadioGroupItem[] = useMemo( () => [ { key: ComAtprotoModerationDefs.REASONSPAM, label: ( Spam Excessive mentions or replies ), }, { key: ComAtprotoModerationDefs.REASONSEXUAL, label: ( Unwanted Sexual Content Nudity or pornography not labeled as such ), }, { key: '__copyright__', label: ( Copyright Violation Contains copyrighted material ), }, { key: ComAtprotoModerationDefs.REASONRUDE, label: ( Anti-Social Behavior Harassment, trolling, or intolerance ), }, { key: ComAtprotoModerationDefs.REASONVIOLATION, label: ( Illegal and Urgent Glaring violations of law or terms of service ), }, { key: ComAtprotoModerationDefs.REASONOTHER, label: ( Other An issue not included in these options ), }, ], [pal], ) const onSelectIssue = (v: string) => setIssue(v) const goToDetails = () => { if (issue === '__copyright__') { Linking.openURL(DMCA_LINK) return } setShowTextInput(true) } return ( <> Report post What is the issue with this post? {error ? ( ) : undefined} {issue ? ( <> Add details to report ) : undefined} ) } const styles = StyleSheet.create({ container: { paddingHorizontal: 10, paddingBottom: 40, }, title: { textAlign: 'center', fontWeight: 'bold', fontSize: 24, marginBottom: 12, }, description: { textAlign: 'center', fontSize: 17, paddingHorizontal: 22, marginBottom: 10, }, addDetailsBtn: { padding: 14, alignSelf: 'center', }, })