[SDK] Swap moderation to @bsky.app/sdk and move labeler config to Client statics (#11383)

This commit is contained in:
Samuel Newman
2026-08-13 22:26:21 +03:00
committed by GitHub
parent dc31e7fd12
commit 59d2bf09d7
138 changed files with 601 additions and 416 deletions
@@ -1,6 +1,7 @@
import {forwardRef, useEffect, useImperativeHandle, useState} from 'react'
import {Pressable, View} from 'react-native'
import {type AppBskyActorDefs, type ModerationOpts} from '@atproto/api'
import {type AppBskyActorDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans} from '@lingui/react/macro'
import {ReactRenderer} from '@tiptap/react'
import {
@@ -90,14 +90,12 @@ export function ThreadgateBtn({
* Preferences are still typed against the legacy client, so the stored
* rules arrive unbranded. Wave B migrates `getPreferences`.
*/
allow: preferences?.postInteractionSettings
.threadgateAllowRules as app.bsky.feed.threadgate.Main['allow'],
allow: preferences?.postInteractionSettings.threadgateAllowRules,
})
const prefPostgate = createPostgateRecord({
post: '',
embeddingRules: (preferences?.postInteractionSettings
?.postgateEmbeddingRules ||
[]) as app.bsky.feed.postgate.Main['embeddingRules'],
embeddingRules:
preferences?.postInteractionSettings?.postgateEmbeddingRules || [],
})
const isDirty = useMemo(() => {
@@ -16,12 +16,13 @@ import {
AppBskyGraphFollow,
AppBskyGraphStarterpack,
AtUri,
moderateProfile,
type ModerationDecision,
type ModerationOpts,
} from '@atproto/api'
import {TID} from '@atproto/common-web'
import {type DidString} from '@atproto/syntax'
import {
type ModerationDecision,
type ModerationOpts,
} from '@bsky.app/sdk/moderation'
import {plural} from '@lingui/core/macro'
import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
@@ -29,6 +30,7 @@ import {useQueryClient} from '@tanstack/react-query'
import {MAX_POST_LINES} from '#/lib/constants'
import {useAnimatedValue} from '#/lib/hooks/useAnimatedValue'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links'
import {type NavigationProp} from '#/lib/routes/types'
import {forceLTR} from '#/lib/strings/bidi'
+3 -6
View File
@@ -1,15 +1,12 @@
import {useCallback, useState} from 'react'
import {
type AppBskyFeedDefs,
AppBskyFeedPost,
moderatePost,
type ModerationDecision,
} from '@atproto/api'
import {type AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {usePostViewTracking} from '#/lib/hooks/usePostViewTracking'
import {moderatePost} from '#/lib/moderation/subjects'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
+3 -7
View File
@@ -1,17 +1,13 @@
import {useCallback, useMemo, useState} from 'react'
import {type StyleProp, StyleSheet, View, type ViewStyle} from 'react-native'
import {
type AppBskyFeedDefs,
AppBskyFeedPost,
AtUri,
moderatePost,
type ModerationDecision,
} from '@atproto/api'
import {type AppBskyFeedDefs, AppBskyFeedPost, AtUri} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {useQueryClient} from '@tanstack/react-query'
import {MAX_POST_LINES} from '#/lib/constants'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {moderatePost} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links'
import {countLines} from '#/lib/strings/helpers'
import {asSdkFacets} from '#/lib/strings/rich-text-helpers'
+1 -1
View File
@@ -6,8 +6,8 @@ import {
AppBskyFeedPost,
AppBskyFeedThreadgate,
AtUri,
type ModerationDecision,
} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {useQueryClient} from '@tanstack/react-query'
+2 -1
View File
@@ -1,5 +1,6 @@
import {StyleSheet, View} from 'react-native'
import {AppBskyFeedDefs, type ModerationDecision} from '@atproto/api'
import {AppBskyFeedDefs} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
+2 -1
View File
@@ -1,6 +1,7 @@
import {memo, useCallback} from 'react'
import {type StyleProp, View, type ViewStyle} from 'react-native'
import {type AppBskyActorDefs, type ModerationDecision} from '@atproto/api'
import {type AppBskyActorDefs} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query'
+1 -1
View File
@@ -11,7 +11,7 @@ import {
} from 'react-native'
import Svg, {Circle, Path, Rect} from 'react-native-svg'
import {Image as ExpoImage} from 'expo-image'
import {type ModerationUI} from '@atproto/api'
import {type ModerationUI} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
+1 -1
View File
@@ -1,7 +1,7 @@
import {useCallback, useState} from 'react'
import {Pressable, StyleSheet, View} from 'react-native'
import {Image} from 'expo-image'
import {type ModerationUI} from '@atproto/api'
import {type ModerationUI} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
+11 -6
View File
@@ -6,20 +6,21 @@ import {
type AppBskyFeedDefs,
type AppBskyFeedPost,
type ComAtprotoLabelDefs,
mock,
} from '@atproto/api'
import {
interpretLabelValueDefinition,
type LabelPreference,
LABELS,
mock,
moderatePost,
moderateProfile,
type ModerationBehavior,
type ModerationDecision,
type ModerationOpts,
} from '@atproto/api'
} from '@bsky.app/sdk/moderation'
import {RichText} from '@bsky.app/sdk/richtext'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {moderatePost, moderateProfile} from '#/lib/moderation/subjects'
import {useGlobalLabelStrings} from '#/lib/moderation/useGlobalLabelStrings'
import {
type CommonNavigatorParams,
@@ -242,9 +243,13 @@ export const DebugModScreen = ({}: NativeStackScreenProps<
return item
}, [profile, currentAccount])
const modOpts = useMemo(() => {
const modOpts = useMemo<ModerationOpts>(() => {
return {
userDid: isLoggedOut ? '' : isTargetMe ? did : 'did:web:alice.test',
userDid: (isLoggedOut
? ''
: isTargetMe
? did
: 'did:web:alice.test') as ModerationOpts['userDid'],
prefs: {
adultContentEnabled: !noAdult,
labels: {
+3 -5
View File
@@ -2,11 +2,8 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react'
import {StyleSheet} from 'react-native'
import {SafeAreaView} from 'react-native-safe-area-context'
import {ScrollForwarderView} from 'react-native-scroll-forwarder'
import {
type AppBskyActorDefs,
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {type AppBskyActorDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
@@ -17,6 +14,7 @@ import {useQueryClient} from '@tanstack/react-query'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {useRequireEmailVerification} from '#/lib/hooks/useRequireEmailVerification'
import {useSetTitle} from '#/lib/hooks/useSetTitle'
import {moderateProfile} from '#/lib/moderation/subjects'
import {
type CommonNavigatorParams,
type NativeStackScreenProps,