import apiInstance from '@api/instance' import ComponentAccount from '@components/Account' import { HeaderLeft, HeaderRight } from '@components/Header' import Selections from '@components/Selections' import CustomText from '@components/Text' import { TabSharedStackScreenProps } from '@utils/navigation/navigators' import { useRulesQuery } from '@utils/queryHooks/reports' import { getInstanceUri } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Platform, ScrollView, TextInput, View } from 'react-native' import { Switch } from 'react-native-gesture-handler' import { useSelector } from 'react-redux' const TabSharedReport: React.FC> = ({ navigation, route: { params: { account, status } } }) => { const { colors } = useTheme() const { t } = useTranslation(['common', 'screenTabs']) const [categories, setCategories] = useState< { selected: boolean; content: string; type: 'spam' | 'other' | 'violation' }[] >([ { selected: true, content: t('screenTabs:shared.report.reasons.spam'), type: 'spam' }, { selected: false, content: t('screenTabs:shared.report.reasons.other'), type: 'other' }, { selected: false, content: t('screenTabs:shared.report.reasons.violation'), type: 'violation' } ]) const [rules, setRules] = useState<{ selected: boolean; content: string; id: string }[]>([]) const [forward, setForward] = useState(true) const [comment, setComment] = useState('') const [isReporting, setIsReporting] = useState(false) useEffect(() => { navigation.setOptions({ title: t('screenTabs:shared.report.name', { acct: `@${account.acct}` }), headerLeft: () => ( navigation.goBack()} /> ), headerRight: () => ( { const body = new FormData() body.append('account_id', account.id) status && body.append('status_ids[]', status.id) comment.length && body.append('comment', comment) body.append('forward', forward.toString()) body.append('category', categories.find(category => category.selected)?.type || 'other') rules.filter(rule => rule.selected).forEach(rule => body.append('rule_ids[]', rule.id)) apiInstance({ method: 'post', url: 'reports', body }) .then(() => { setIsReporting(false) navigation.pop(1) }) .catch(() => { setIsReporting(false) }) }} loading={isReporting} /> ) }) }, [isReporting, comment, forward, categories, rules]) const instanceUri = useSelector(getInstanceUri) const localInstance = account?.acct.includes('@') ? account?.acct.includes(`@${instanceUri}`) : true const rulesQuery = useRulesQuery() useEffect(() => { if (rulesQuery.data) { setRules(rulesQuery.data.map(rule => ({ ...rule, selected: false, content: rule.text }))) } }, [rulesQuery.data]) return ( {!localInstance ? ( {t('screenTabs:shared.report.forward.heading', { instance: account.acct.match(/@(.*)/)?.[1] })} ) : null} {t('screenTabs:shared.report.reasons.heading')} {categories[1].selected || comment.length ? ( <> {t('screenTabs:shared.report.comment.heading')} {comment.length} / 1000 ) : null} {rules.length ? ( <> {t('screenTabs:shared.report.violatedRules.heading')} ) : null} ) } export default TabSharedReport