diff --git a/src/components/moderation/ReportDialog/action.ts b/src/components/moderation/ReportDialog/action.ts index 2da6e48295..accdb423a3 100644 --- a/src/components/moderation/ReportDialog/action.ts +++ b/src/components/moderation/ReportDialog/action.ts @@ -9,6 +9,7 @@ import {useMutation} from '@tanstack/react-query' import {logger} from '#/logger' import {useAgent} from '#/state/session' +import {NEW_TO_OLD_REASONS_MAP} from './const' import {type ReportState} from './state' import {type ParsedReportSubject} from './types' @@ -31,6 +32,26 @@ export function useSubmitReportMutation() { throw new Error(_(msg`Please select a moderation service`)) } + const labeler = state.selectedLabeler + const labelerSupportedReasonTypes = labeler.reasonTypes || [] + + let reasonType = state.selectedOption.reason + const backwardsCompatableReasonType = NEW_TO_OLD_REASONS_MAP[reasonType] + const supportsNewReasonType = + labelerSupportedReasonTypes.includes(reasonType) + const supportsOldReasonType = labelerSupportedReasonTypes.includes( + backwardsCompatableReasonType, + ) + + /* + * Only fall back for backwards compatibility if the labeler + * does not support the new reason type. If the labeler does not declare + * supported reason types, send the new version. + */ + if (supportsOldReasonType && !supportsNewReasonType) { + reasonType = backwardsCompatableReasonType + } + let report: | ComAtprotoModerationCreateReport.InputSchema | (Omit & { @@ -40,7 +61,7 @@ export function useSubmitReportMutation() { switch (subject.type) { case 'account': { report = { - reasonType: state.selectedOption.reason, + reasonType, reason: state.details, subject: { $type: 'com.atproto.admin.defs#repoRef', @@ -54,7 +75,7 @@ export function useSubmitReportMutation() { case 'feed': case 'starterPack': { report = { - reasonType: state.selectedOption.reason, + reasonType, reason: state.details, subject: { $type: 'com.atproto.repo.strongRef', @@ -66,7 +87,7 @@ export function useSubmitReportMutation() { } case 'chatMessage': { report = { - reasonType: state.selectedOption.reason, + reasonType, reason: state.details, subject: { $type: 'chat.bsky.convo.defs#messageRef', @@ -82,7 +103,7 @@ export function useSubmitReportMutation() { if (__DEV__) { logger.info('Submitting report', { labeler: { - handle: state.selectedLabeler.creator.handle, + handle: labeler.creator.handle, }, report, }) @@ -90,7 +111,7 @@ export function useSubmitReportMutation() { await agent.createModerationReport(report, { encoding: 'application/json', headers: { - 'atproto-proxy': `${state.selectedLabeler.creator.did}#atproto_labeler`, + 'atproto-proxy': `${labeler.creator.did}#atproto_labeler`, }, }) } diff --git a/src/components/moderation/ReportDialog/const.ts b/src/components/moderation/ReportDialog/const.ts index b317f6cb25..92332b667b 100644 --- a/src/components/moderation/ReportDialog/const.ts +++ b/src/components/moderation/ReportDialog/const.ts @@ -116,10 +116,9 @@ export const OTHER_REPORT_REASONS: Set = new Set([ ]) /** - * Set of report reasons that should only be sent to moderation authorities, - * such as Bluesky. + * Set of report reasons that should only be sent Bluesky's moderation service. */ -export const MOD_AUTHORITY_ONLY_REPORT_REASONS: Set = +export const BSKY_LABELER_ONLY_REPORT_REASONS: Set = new Set([ OzoneReportDefs.REASONCHILDSAFETYCSAM, OzoneReportDefs.REASONCHILDSAFETYGROOM, diff --git a/src/components/moderation/ReportDialog/index.tsx b/src/components/moderation/ReportDialog/index.tsx index 1f8bfe4d2e..8da7342197 100644 --- a/src/components/moderation/ReportDialog/index.tsx +++ b/src/components/moderation/ReportDialog/index.tsx @@ -1,7 +1,7 @@ import React from 'react' import {Pressable, View} from 'react-native' import {type ScrollView} from 'react-native-gesture-handler' -import {type AppBskyLabelerDefs} from '@atproto/api' +import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -30,7 +30,11 @@ import {createStaticClick, InlineLinkText, Link} from '#/components/Link' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' import {useSubmitReportMutation} from './action' -import {SUPPORT_PAGE} from './const' +import { + BSKY_LABELER_ONLY_REPORT_REASONS, + NEW_TO_OLD_REASONS_MAP, + SUPPORT_PAGE, +} from './const' import {useCopyForSubject} from './copy' import {initialState, reducer} from './state' import {type ReportDialogProps, type ReportSubject} from './types' @@ -135,14 +139,25 @@ function Inner(props: ReportDialogProps) { }) .filter(l => { if (!state.selectedOption) return true + // some reasons ONLY go to Bluesky + if (BSKY_LABELER_ONLY_REPORT_REASONS.has(state.selectedOption.reason)) { + return l.creator.did === BSKY_LABELER_DID + } const reasonTypes: string[] | undefined = l.reasonTypes if (reasonTypes === undefined) return true - return reasonTypes.includes(state.selectedOption.reason) + return ( + reasonTypes.includes(state.selectedOption.reason) || + reasonTypes.includes( + NEW_TO_OLD_REASONS_MAP[state.selectedOption.reason], + ) + ) }) }, [props, allLabelers, state.selectedOption]) const hasSupportedLabelers = !!supportedLabelers.length const hasSingleSupportedLabeler = supportedLabelers.length === 1 + console.log(supportedLabelers) + const onSubmit = React.useCallback(async () => { dispatch({type: 'clearError'})