[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 -1
View File
@@ -4,8 +4,8 @@ import {
AppBskyAgeassuranceDefs, AppBskyAgeassuranceDefs,
computeAgeAssuranceRegionAccess, computeAgeAssuranceRegionAccess,
getAgeAssuranceRegionConfig, getAgeAssuranceRegionConfig,
type ModerationPrefs,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationPrefs} from '@bsky.app/sdk/moderation'
import {getAge} from '#/lib/strings/time' import {getAge} from '#/lib/strings/time'
import {regionName} from '#/locale/helpers' import {regionName} from '#/locale/helpers'
@@ -1,8 +1,9 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {keepPreviousData, useQuery} from '@tanstack/react-query' import {keepPreviousData, useQuery} from '@tanstack/react-query'
import {isJustAMute, moduiContainsHideableOffense} from '#/lib/moderation' import {isJustAMute, moduiContainsHideableOffense} from '#/lib/moderation'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {STALE} from '#/state/queries' import {STALE} from '#/state/queries'
import {DEFAULT_LOGGED_OUT_PREFERENCES} from '#/state/queries/preferences' import {DEFAULT_LOGGED_OUT_PREFERENCES} from '#/state/queries/preferences'
+1 -1
View File
@@ -8,8 +8,8 @@ import Animated, {
withDelay, withDelay,
withTiming, withTiming,
} from 'react-native-reanimated' } from 'react-native-reanimated'
import {moderateProfile} from '@atproto/api'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
+1 -1
View File
@@ -1,6 +1,6 @@
import {View} from 'react-native' import {View} from 'react-native'
import {moderateProfile} from '@atproto/api'
import {moderateProfile} from '#/lib/moderation/subjects'
import {logger} from '#/logger' import {logger} from '#/logger'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useProfilesQuery} from '#/state/queries/profile' import {useProfilesQuery} from '#/state/queries/profile'
+3 -5
View File
@@ -1,12 +1,10 @@
import {useRef} from 'react' import {useRef} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyActorDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {UserAvatar} from '#/view/com/util/UserAvatar' import {UserAvatar} from '#/view/com/util/UserAvatar'
+3 -3
View File
@@ -1,5 +1,4 @@
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyLabelerDefs} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Plural, Trans} from '@lingui/react/macro' import {Plural, Trans} from '@lingui/react/macro'
@@ -13,10 +12,11 @@ import {Flag_Stroke2_Corner0_Rounded as Flag} from '#/components/icons/Flag'
import {Link as InternalLink, type LinkProps} from '#/components/Link' import {Link as InternalLink, type LinkProps} from '#/components/Link'
import {RichText} from '#/components/RichText' import {RichText} from '#/components/RichText'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {type app} from '#/lexicons'
import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '../icons/Chevron' import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '../icons/Chevron'
type LabelingServiceProps = { type LabelingServiceProps = {
labeler: AppBskyLabelerDefs.LabelerViewDetailed labeler: app.bsky.labeler.defs.LabelerViewDetailed
} }
export function Outer({ export function Outer({
@@ -187,7 +187,7 @@ export function Loader({
loading?: React.ComponentType<{}> loading?: React.ComponentType<{}>
error?: React.ComponentType<{error: string}> error?: React.ComponentType<{error: string}>
component: React.ComponentType<{ component: React.ComponentType<{
labeler: AppBskyLabelerDefs.LabelerViewDetailed labeler: app.bsky.labeler.defs.LabelerViewDetailed
}> }>
}) { }) {
const {isLoading, data, error} = useLabelerInfoQuery({did}) const {isLoading, data, error} = useLabelerInfoQuery({did})
+3 -6
View File
@@ -1,16 +1,13 @@
import {useEffect, useMemo} from 'react' import {useEffect, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyGraphDefs, AtUri} from '@atproto/api'
type AppBskyGraphDefs, import {type ModerationUI} from '@bsky.app/sdk/moderation'
AtUri,
moderateUserList,
type ModerationUI,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {moderateUserList} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {precacheList} from '#/state/queries/feed' import {precacheList} from '#/state/queries/feed'
+2 -1
View File
@@ -1,6 +1,6 @@
import {useMemo, useState} from 'react' import {useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyActorDefs, moderateProfile} from '@atproto/api' import {type AppBskyActorDefs} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -8,6 +8,7 @@ import {differenceInSeconds} from 'date-fns'
import {HITSLOP_10} from '#/lib/constants' import {HITSLOP_10} from '#/lib/constants'
import {useGetTimeAgo} from '#/lib/hooks/useTimeAgo' import {useGetTimeAgo} from '#/lib/hooks/useTimeAgo'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
+2 -1
View File
@@ -1,6 +1,7 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {BSKY_LABELER_DID, type ModerationCause} from '@atproto/api' import {BSKY_LABELER_DID} from '@atproto/api'
import {type ModerationCause} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription' import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription'
+1 -1
View File
@@ -1,6 +1,6 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {moderateFeedGenerator} from '@atproto/api'
import {moderateFeedGenerator} from '#/lib/moderation/subjects'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import * as FeedCard from '#/components/FeedCard' import * as FeedCard from '#/components/FeedCard'
+1 -1
View File
@@ -1,6 +1,6 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {moderateUserList} from '@atproto/api'
import {moderateUserList} from '#/lib/moderation/subjects'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import * as ListCard from '#/components/ListCard' import * as ListCard from '#/components/ListCard'
+1 -1
View File
@@ -5,12 +5,12 @@ import {
type AppBskyFeedDefs, type AppBskyFeedDefs,
AppBskyFeedPost, AppBskyFeedPost,
AtUri, AtUri,
moderatePost,
} from '@atproto/api' } from '@atproto/api'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {moderatePost} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {asSdkFacets} from '#/lib/strings/rich-text-helpers' import {asSdkFacets} from '#/lib/strings/rich-text-helpers'
import {getChatInviteCodeFromUrl} from '#/lib/strings/url-helpers' import {getChatInviteCodeFromUrl} from '#/lib/strings/url-helpers'
+2 -1
View File
@@ -1,5 +1,6 @@
import {type StyleProp, type ViewStyle} from 'react-native' import {type StyleProp, type ViewStyle} from 'react-native'
import {type AppBskyFeedDefs, type ModerationDecision} from '@atproto/api' import {type AppBskyFeedDefs} from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
export enum PostEmbedViewContext { export enum PostEmbedViewContext {
ThreadHighlighted = 'ThreadHighlighted', ThreadHighlighted = 'ThreadHighlighted',
@@ -1,9 +1,6 @@
import {ScrollView, View} from 'react-native' import {ScrollView, View} from 'react-native'
import { import {type ChatBskyActorDefs} from '@atproto/api'
type ChatBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -11,6 +8,7 @@ import {useNavigation} from '@react-navigation/native'
import {isBlockedOrBlocking, isMuted} from '#/lib/moderation/blocked-and-muted' import {isBlockedOrBlocking, isMuted} from '#/lib/moderation/blocked-and-muted'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {type NavigationProp} from '#/lib/routes/types' import {type NavigationProp} from '#/lib/routes/types'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
+2 -1
View File
@@ -6,11 +6,12 @@ import {
View, View,
type ViewStyle, type ViewStyle,
} from 'react-native' } from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {RichText as RichTextApi} from '@bsky.app/sdk/richtext' import {RichText as RichTextApi} from '@bsky.app/sdk/richtext'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {getModerationCauseKey} from '#/lib/moderation' import {getModerationCauseKey} from '#/lib/moderation'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {forceLTR} from '#/lib/strings/bidi' import {forceLTR} from '#/lib/strings/bidi'
import {NON_BREAKING_SPACE} from '#/lib/strings/constants' import {NON_BREAKING_SPACE} from '#/lib/strings/constants'
@@ -1,16 +1,14 @@
import {memo, useCallback, useEffect, useMemo, useReducer, useRef} from 'react' import {memo, useCallback, useEffect, useMemo, useReducer, useRef} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyActorDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {flip, offset, shift, size, useFloating} from '@floating-ui/react-dom' import {flip, offset, shift, size, useFloating} from '@floating-ui/react-dom'
import {msg, plural} from '@lingui/core/macro' import {msg, plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {getModerationCauseKey} from '#/lib/moderation' import {getModerationCauseKey} from '#/lib/moderation'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {type NavigationProp} from '#/lib/routes/types' import {type NavigationProp} from '#/lib/routes/types'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
@@ -1,6 +1,6 @@
import {memo, useCallback, useEffect, useMemo, useRef, useState} from 'react' import {memo, useCallback, useEffect, useMemo, useRef, useState} from 'react'
import {TextInput, View, type ViewToken} from 'react-native' import {TextInput, View, type ViewToken} from 'react-native'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
@@ -4,8 +4,8 @@ import {
type AppBskyActorDefs, type AppBskyActorDefs,
type AppBskyGraphGetList, type AppBskyGraphGetList,
AtUri, AtUri,
type ModerationOpts,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import { import {
type InfiniteData, type InfiniteData,
type UseInfiniteQueryResult, type UseInfiniteQueryResult,
@@ -1,11 +1,8 @@
import {useRef} from 'react' import {useRef} from 'react'
import {type ListRenderItemInfo} from 'react-native' import {type ListRenderItemInfo} from 'react-native'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyActorDefs, type AppBskyFeedDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
type AppBskyFeedDefs,
type ModerationOpts,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -1,17 +1,12 @@
import {Keyboard, View} from 'react-native' import {Keyboard, View} from 'react-native'
import { import {type AppBskyActorDefs, type AppBskyFeedDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts, type ModerationUI} from '@bsky.app/sdk/moderation'
type AppBskyFeedDefs,
moderateFeedGenerator,
moderateProfile,
type ModerationOpts,
type ModerationUI,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {DISCOVER_FEED_URI, STARTER_PACK_MAX_SIZE} from '#/lib/constants' import {DISCOVER_FEED_URI, STARTER_PACK_MAX_SIZE} from '#/lib/constants'
import {moderateFeedGenerator, moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
+1 -1
View File
@@ -7,8 +7,8 @@ import {
AppBskyEmbedVideo, AppBskyEmbedVideo,
type AppBskyFeedDefs, type AppBskyFeedDefs,
AppBskyFeedPost, AppBskyFeedPost,
type ModerationDecision,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
@@ -1,5 +1,5 @@
import {useCallback, useEffect, useState} from 'react' import {useCallback, useEffect, useState} from 'react'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useRequireEmailVerification} from '#/lib/hooks/useRequireEmailVerification' import {useRequireEmailVerification} from '#/lib/hooks/useRequireEmailVerification'
@@ -1,11 +1,8 @@
import {useMemo, useState} from 'react' import {useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyNotificationDefs, type Un$Typed} from '@atproto/api'
type AppBskyNotificationDefs,
type ModerationOpts,
type Un$Typed,
} from '@atproto/api'
import {type DidString} from '@atproto/syntax' import {type DidString} from '@atproto/syntax'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -2,8 +2,8 @@ import {useCallback, useMemo, useRef, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import * as SMS from 'expo-sms' import * as SMS from 'expo-sms'
import {type ModerationOpts} from '@atproto/api'
import {type DidString} from '@atproto/syntax' import {type DidString} from '@atproto/syntax'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Plural, Trans} from '@lingui/react/macro' import {Plural, Trans} from '@lingui/react/macro'
+10 -8
View File
@@ -1,6 +1,7 @@
import {useCallback, useState} from 'react' import {useCallback, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyActorDefs, sanitizeMutedWordValue} from '@atproto/api' import {type DatetimeString, toDatetimeString} from '@atproto/syntax'
import {sanitizeMutedWordValue} from '@bsky.app/sdk/utils'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -35,6 +36,7 @@ import * as Menu from '#/components/Menu'
import * as Prompt from '#/components/Prompt' import * as Prompt from '#/components/Prompt'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {IS_NATIVE} from '#/env' import {IS_NATIVE} from '#/env'
import {type app} from '#/lexicons'
const ONE_DAY = 24 * 60 * 60 * 1000 const ONE_DAY = 24 * 60 * 60 * 1000
@@ -68,20 +70,20 @@ function MutedWordsInner() {
const sanitizedValue = sanitizeMutedWordValue(field) const sanitizedValue = sanitizeMutedWordValue(field)
const surfaces = ['tag', targets.includes('content') && 'content'].filter( const surfaces = ['tag', targets.includes('content') && 'content'].filter(
Boolean, Boolean,
) as AppBskyActorDefs.MutedWord['targets'] ) as app.bsky.actor.defs.MutedWord['targets']
const actorTarget = excludeFollowing ? 'exclude-following' : 'all' const actorTarget = excludeFollowing ? 'exclude-following' : 'all'
const now = Date.now() const now = Date.now()
const rawDuration = durations.at(0) const rawDuration = durations.at(0)
// undefined evaluates to 'forever' // undefined evaluates to 'forever'
let duration: string | undefined let duration: DatetimeString | undefined
if (rawDuration === '24_hours') { if (rawDuration === '24_hours') {
duration = new Date(now + ONE_DAY).toISOString() duration = toDatetimeString(new Date(now + ONE_DAY))
} else if (rawDuration === '7_days') { } else if (rawDuration === '7_days') {
duration = new Date(now + 7 * ONE_DAY).toISOString() duration = toDatetimeString(new Date(now + 7 * ONE_DAY))
} else if (rawDuration === '30_days') { } else if (rawDuration === '30_days') {
duration = new Date(now + 30 * ONE_DAY).toISOString() duration = toDatetimeString(new Date(now + 30 * ONE_DAY))
} }
if (!sanitizedValue || !surfaces.length) { if (!sanitizedValue || !surfaces.length) {
@@ -421,7 +423,7 @@ function MutedWordsInner() {
function MutedWordRow({ function MutedWordRow({
style, style,
word, word,
}: ViewStyleProp & {word: AppBskyActorDefs.MutedWord}) { }: ViewStyleProp & {word: app.bsky.actor.defs.MutedWord}) {
const t = useTheme() const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
const {isPending, mutateAsync: removeMutedWord} = useRemoveMutedWordMutation() const {isPending, mutateAsync: removeMutedWord} = useRemoveMutedWordMutation()
@@ -440,7 +442,7 @@ function MutedWordRow({
updateMutedWord({ updateMutedWord({
...word, ...word,
expiresAt: days expiresAt: days
? new Date(Date.now() + days * ONE_DAY).toISOString() ? toDatetimeString(new Date(Date.now() + days * ONE_DAY))
: undefined, : undefined,
}) })
} }
@@ -7,10 +7,11 @@ import {
useState, useState,
} from 'react' } from 'react'
import {TextInput, View} from 'react-native' import {TextInput, View} from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useActorAutocompleteQuery} from '#/state/queries/actor-autocomplete' import {useActorAutocompleteQuery} from '#/state/queries/actor-autocomplete'
@@ -1,6 +1,7 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyGraphDefs, type ModerationOpts} from '@atproto/api' import {type AppBskyGraphDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
+2 -1
View File
@@ -1,5 +1,6 @@
import {View} from 'react-native' import {View} from 'react-native'
import {type ChatBskyConvoDefs, type ModerationOpts} from '@atproto/api' import {type ChatBskyConvoDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {MessageContextMenu} from '#/components/dms/MessageContextMenu' import {MessageContextMenu} from '#/components/dms/MessageContextMenu'
+2 -1
View File
@@ -1,6 +1,7 @@
import {useCallback, useRef, useState} from 'react' import {useCallback, useRef, useState} from 'react'
import {Pressable, View} from 'react-native' import {Pressable, View} from 'react-native'
import {type ChatBskyConvoDefs, type ModerationOpts} from '@atproto/api' import {type ChatBskyConvoDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
+1 -1
View File
@@ -1,6 +1,6 @@
import {Fragment} from 'react' import {Fragment} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type ModerationCause} from '@atproto/api' import {type ModerationCause} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
+1 -1
View File
@@ -1,10 +1,10 @@
import {useCallback, useEffect} from 'react' import {useCallback, useEffect} from 'react'
import {type ScrollView, View} from 'react-native' import {type ScrollView, View} from 'react-native'
import Animated, {useAnimatedRef, useSharedValue} from 'react-native-reanimated' import Animated, {useAnimatedRef, useSharedValue} from 'react-native-reanimated'
import {moderateProfile} from '@atproto/api'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {HITSLOP_10} from '#/lib/constants' import {HITSLOP_10} from '#/lib/constants'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
+1 -1
View File
@@ -1,6 +1,6 @@
import {memo, useCallback} from 'react' import {memo, useCallback} from 'react'
import {Keyboard, View} from 'react-native' import {Keyboard, View} from 'react-native'
import {type ModerationCause} from '@atproto/api' import {type ModerationCause} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
+2 -1
View File
@@ -7,11 +7,12 @@ import {
useState, useState,
} from 'react' } from 'react'
import {LayoutAnimation, type TextInput, View} from 'react-native' import {LayoutAnimation, type TextInput, View} from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {MAX_GROUP_NAME_GRAPHEME_LENGTH} from '#/lib/constants' import {MAX_GROUP_NAME_GRAPHEME_LENGTH} from '#/lib/constants'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' import {isOverMaxGraphemeCount} from '#/lib/strings/helpers'
+2 -1
View File
@@ -2,7 +2,8 @@ import {memo, useCallback} from 'react'
import {Platform} from 'react-native' import {Platform} from 'react-native'
import {type GestureType} from 'react-native-gesture-handler' import {type GestureType} from 'react-native-gesture-handler'
import * as Clipboard from 'expo-clipboard' import * as Clipboard from 'expo-clipboard'
import {type ChatBskyConvoDefs, type ModerationOpts} from '@atproto/api' import {type ChatBskyConvoDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {RichText} from '@bsky.app/sdk/richtext' import {RichText} from '@bsky.app/sdk/richtext'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
+1 -1
View File
@@ -27,7 +27,6 @@ import {
type ChatBskyActorDefs, type ChatBskyActorDefs,
ChatBskyConvoDefs, ChatBskyConvoDefs,
ChatBskyEmbedJoinLink, ChatBskyEmbedJoinLink,
moderateProfile,
} from '@atproto/api' } from '@atproto/api'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
@@ -36,6 +35,7 @@ import {useQueryClient} from '@tanstack/react-query'
import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {asSdkFacets} from '#/lib/strings/rich-text-helpers' import {asSdkFacets} from '#/lib/strings/rich-text-helpers'
import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow'
@@ -1,6 +1,6 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type ModerationDecision} from '@atproto/api' import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
+2 -1
View File
@@ -1,9 +1,10 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
@@ -1,7 +1,8 @@
import {View} from 'react-native' import {View} from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
+3 -7
View File
@@ -1,13 +1,9 @@
import { import {type $Typed, ChatBskyActorDefs, ChatBskyConvoDefs} from '@atproto/api'
type $Typed, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
ChatBskyActorDefs,
ChatBskyConvoDefs,
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {EMOJI_REACTION_LIMIT} from '#/lib/constants' import {EMOJI_REACTION_LIMIT} from '#/lib/constants'
import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted'
import {moderateProfile} from '#/lib/moderation/subjects'
import {logger} from '#/logger' import {logger} from '#/logger'
import {type Shadow} from '#/state/cache/profile-shadow' import {type Shadow} from '#/state/cache/profile-shadow'
import {type ConvoState, ConvoStatus} from '#/state/messages/convo/types' import {type ConvoState, ConvoStatus} from '#/state/messages/convo/types'
@@ -4,9 +4,8 @@ import {
AppBskyEmbedRecordWithMedia, AppBskyEmbedRecordWithMedia,
type AppBskyFeedDefs, type AppBskyFeedDefs,
AppBskyFeedPost, AppBskyFeedPost,
type ModerationCause,
type ModerationUI,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationCause, type ModerationUI} from '@bsky.app/sdk/moderation'
import {unique} from '#/lib/moderation' import {unique} from '#/lib/moderation'
import {type AppModerationCause} from '#/components/Pills' import {type AppModerationCause} from '#/components/Pills'
@@ -1,11 +1,12 @@
import {useEffect} from 'react' import {useEffect} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {ChatBskyGroupDefs, moderateProfile} from '@atproto/api' import {ChatBskyGroupDefs} from '@atproto/api'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useCallOnce} from '#/lib/once' import {useCallOnce} from '#/lib/once'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {type NavigationProp} from '#/lib/routes/types' import {type NavigationProp} from '#/lib/routes/types'
@@ -1,8 +1,9 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {Pressable, View} from 'react-native' import {Pressable, View} from 'react-native'
import {type AppBskyUnspeccedDefs, moderateProfile} from '@atproto/api' import {type AppBskyUnspeccedDefs} from '@atproto/api'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import { import {
useTrendingSettings, useTrendingSettings,
+1 -1
View File
@@ -5,7 +5,7 @@ import {
View, View,
type ViewStyle, type ViewStyle,
} from 'react-native' } from 'react-native'
import {type ModerationUI} from '@atproto/api' import {type ModerationUI} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import { import {
+1 -1
View File
@@ -1,5 +1,5 @@
import {createContext, useContext, useState} from 'react' import {createContext, useContext, useState} from 'react'
import {type ModerationUI} from '@atproto/api' import {type ModerationUI} from '@bsky.app/sdk/moderation'
import { import {
type ModerationCauseDescription, type ModerationCauseDescription,
@@ -2,7 +2,7 @@ import {View} from 'react-native'
import { import {
type InterpretedLabelValueDefinition, type InterpretedLabelValueDefinition,
type LabelPreference, type LabelPreference,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -1,6 +1,6 @@
import {useState} from 'react' import {useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type ModerationCause} from '@atproto/api' import {type ModerationCause} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
+2 -6
View File
@@ -1,10 +1,6 @@
import {type StyleProp, View, type ViewStyle} from 'react-native' import {type StyleProp, View, type ViewStyle} from 'react-native'
import { import {type AppBskyFeedDefs, type ComAtprotoLabelDefs} from '@atproto/api'
type AppBskyFeedDefs, import {type ModerationCause, type ModerationUI} from '@bsky.app/sdk/moderation'
type ComAtprotoLabelDefs,
type ModerationCause,
type ModerationUI,
} from '@atproto/api'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
+2 -5
View File
@@ -7,11 +7,8 @@ import {
View, View,
type ViewStyle, type ViewStyle,
} from 'react-native' } from 'react-native'
import { import {type AppBskyActorDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationCause, type ModerationUI} from '@bsky.app/sdk/moderation'
type ModerationCause,
type ModerationUI,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -1,5 +1,5 @@
import {type StyleProp, type ViewStyle} from 'react-native' import {type StyleProp, type ViewStyle} from 'react-native'
import {type ModerationDecision} from '@atproto/api' import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {getModerationCauseKey, unique} from '#/lib/moderation' import {getModerationCauseKey, unique} from '#/lib/moderation'
import * as Pills from '#/components/Pills' import * as Pills from '#/components/Pills'
@@ -145,7 +145,7 @@ export function useSubmitReportMutation() {
* the proxy target is built per call from that labeler's creator did. * the proxy target is built per call from that labeler's creator did.
*/ */
await client.call(com.atproto.moderation.createReport, report, { await client.call(com.atproto.moderation.createReport, report, {
service: `${labeler.creator.did as DidString}#atproto_labeler`, service: `${labeler.creator.did}#atproto_labeler`,
}) })
} }
}, },
@@ -7,7 +7,7 @@ import {
useState, useState,
} from 'react' } from 'react'
import {Pressable, type ScrollView, View} from 'react-native' import {Pressable, type ScrollView, View} from 'react-native'
import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api' import {BSKY_LABELER_DID} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {wait} from '#/lib/async/wait' import {wait} from '#/lib/async/wait'
@@ -38,6 +38,7 @@ import {Loader} from '#/components/Loader'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {useAnalytics} from '#/analytics' import {useAnalytics} from '#/analytics'
import {IS_NATIVE} from '#/env' import {IS_NATIVE} from '#/env'
import {type app} from '#/lexicons'
import {useSubmitReportMutation} from './action' import {useSubmitReportMutation} from './action'
import { import {
BSKY_LABELER_ONLY_REPORT_REASONS, BSKY_LABELER_ONLY_REPORT_REASONS,
@@ -1045,8 +1046,8 @@ function LabelerCard({
labeler, labeler,
onSelect, onSelect,
}: { }: {
labeler: AppBskyLabelerDefs.LabelerViewDetailed labeler: app.bsky.labeler.defs.LabelerViewDetailed
onSelect?: (option: AppBskyLabelerDefs.LabelerViewDetailed) => void onSelect?: (option: app.bsky.labeler.defs.LabelerViewDetailed) => void
}) { }) {
const t = useTheme() const t = useTheme()
const {t: l} = useLingui() const {t: l} = useLingui()
@@ -1,8 +1,6 @@
import { import {ToolsOzoneReportDefs as OzoneReportDefs} from '@atproto/api'
type AppBskyLabelerDefs,
ToolsOzoneReportDefs as OzoneReportDefs,
} from '@atproto/api'
import {type app} from '#/lexicons'
import { import {
getNciiQualificationOutcome, getNciiQualificationOutcome,
initialState, initialState,
@@ -83,7 +81,7 @@ describe('reducer NCII qualification', () => {
let state = selectNciiOption() let state = selectNciiOption()
state = reducer(state, { state = reducer(state, {
type: 'selectLabeler', type: 'selectLabeler',
labeler: {} as AppBskyLabelerDefs.LabelerViewDetailed, labeler: {} as app.bsky.labeler.defs.LabelerViewDetailed,
}) })
expect(state.activeStepIndex1).toBe(2) expect(state.activeStepIndex1).toBe(2)
}) })
@@ -92,7 +90,7 @@ describe('reducer NCII qualification', () => {
let state = selectNciiOption() let state = selectNciiOption()
state = reducer(state, { state = reducer(state, {
type: 'selectLabeler', type: 'selectLabeler',
labeler: {} as AppBskyLabelerDefs.LabelerViewDetailed, labeler: {} as app.bsky.labeler.defs.LabelerViewDetailed,
}) })
state = reducer(state, { state = reducer(state, {
type: 'answerNciiQuestion', type: 'answerNciiQuestion',
@@ -110,7 +108,7 @@ describe('reducer NCII qualification', () => {
}) })
describe('reducer video timestamp', () => { describe('reducer video timestamp', () => {
const labeler = {} as AppBskyLabelerDefs.LabelerViewDetailed const labeler = {} as app.bsky.labeler.defs.LabelerViewDetailed
const opted: ReportState = {...initialState, includeVideoTimestamp: true} const opted: ReportState = {...initialState, includeVideoTimestamp: true}
it('is off by default', () => { it('is off by default', () => {
@@ -1,13 +1,11 @@
import { import {ToolsOzoneReportDefs as OzoneReportDefs} from '@atproto/api'
type AppBskyLabelerDefs,
ToolsOzoneReportDefs as OzoneReportDefs,
} from '@atproto/api'
import {OTHER_REPORT_REASONS} from '#/components/moderation/ReportDialog/const' import {OTHER_REPORT_REASONS} from '#/components/moderation/ReportDialog/const'
import { import {
type ReportCategoryConfig, type ReportCategoryConfig,
type ReportOption, type ReportOption,
} from '#/components/moderation/ReportDialog/utils/useReportOptions' } from '#/components/moderation/ReportDialog/utils/useReportOptions'
import {type app} from '#/lexicons'
export type NciiQualification = { export type NciiQualification = {
isDepicted?: boolean isDepicted?: boolean
@@ -16,7 +14,7 @@ export type NciiQualification = {
export type ReportState = { export type ReportState = {
selectedCategory?: ReportCategoryConfig selectedCategory?: ReportCategoryConfig
selectedOption?: ReportOption selectedOption?: ReportOption
selectedLabeler?: AppBskyLabelerDefs.LabelerViewDetailed selectedLabeler?: app.bsky.labeler.defs.LabelerViewDetailed
details?: string details?: string
detailsOpen: boolean detailsOpen: boolean
activeStepIndex1: number activeStepIndex1: number
@@ -71,7 +69,7 @@ export type ReportAction =
} }
| { | {
type: 'selectLabeler' type: 'selectLabeler'
labeler: AppBskyLabelerDefs.LabelerViewDetailed labeler: app.bsky.labeler.defs.LabelerViewDetailed
} }
| { | {
type: 'clearLabeler' type: 'clearLabeler'
+1 -1
View File
@@ -5,7 +5,7 @@ import {
View, View,
type ViewStyle, type ViewStyle,
} from 'react-native' } from 'react-native'
import {type ModerationUI} from '@atproto/api' import {type ModerationUI} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
+1 -1
View File
@@ -1,5 +1,5 @@
import {createContext, useContext, useMemo} from 'react' import {createContext, useContext, useMemo} from 'react'
import {hasMutedWord} from '@atproto/api' import {hasMutedWord} from '@bsky.app/sdk/moderation'
import {QueryClient, useQuery} from '@tanstack/react-query' import {QueryClient, useQuery} from '@tanstack/react-query'
import {useOnAppStateChange} from '#/lib/appState' import {useOnAppStateChange} from '#/lib/appState'
@@ -1,16 +1,13 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import { import {type AppBskyActorDefs, type AppBskyEmbedExternal} from '@atproto/api'
type AppBskyActorDefs,
type AppBskyEmbedExternal,
moderateStatus,
} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {useOpenLink} from '#/lib/hooks/useOpenLink' import {useOpenLink} from '#/lib/hooks/useOpenLink'
import {moderateStatus} from '#/lib/moderation/subjects'
import {type NavigationProp} from '#/lib/routes/types' import {type NavigationProp} from '#/lib/routes/types'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {toNiceDomain} from '#/lib/strings/url-helpers' import {toNiceDomain} from '#/lib/strings/url-helpers'
+1 -1
View File
@@ -3,7 +3,6 @@ import {
type $Typed, type $Typed,
type AppBskyActorDefs, type AppBskyActorDefs,
AppBskyEmbedExternal, AppBskyEmbedExternal,
moderateStatus,
} from '@atproto/api' } from '@atproto/api'
import {retry} from '@atproto/common-web' import {retry} from '@atproto/common-web'
import {type l} from '@atproto/lex' import {type l} from '@atproto/lex'
@@ -16,6 +15,7 @@ import {isAfter, parseISO} from 'date-fns'
import {uploadBlob} from '#/lib/api' import {uploadBlob} from '#/lib/api'
import {imageToThumb} from '#/lib/api/resolve' import {imageToThumb} from '#/lib/api/resolve'
import {getLinkMeta, type LinkMeta} from '#/lib/link-meta/link-meta' import {getLinkMeta, type LinkMeta} from '#/lib/link-meta/link-meta'
import {moderateStatus} from '#/lib/moderation/subjects'
import {matchXrpcError} from '#/lib/xrpc-error' import {matchXrpcError} from '#/lib/xrpc-error'
import {useAppConfig} from '#/state/appConfig' import {useAppConfig} from '#/state/appConfig'
import { import {
+7 -8
View File
@@ -1,18 +1,17 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {AtpAgent, type ComAtprotoLabelDefs} from '@atproto/api'
import { import {
type AppBskyLabelerDefs,
AtpAgent,
type ComAtprotoLabelDefs,
type InterpretedLabelValueDefinition, type InterpretedLabelValueDefinition,
LABELS, LABELS,
type ModerationCause, type ModerationCause,
type ModerationOpts, type ModerationOpts,
type ModerationUI, type ModerationUI,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {type AppModerationCause} from '#/components/Pills' import {type AppModerationCause} from '#/components/Pills'
import {type app} from '#/lexicons'
export const ADULT_CONTENT_LABELS = ['sexual', 'nudity', 'porn'] as const export const ADULT_CONTENT_LABELS = ['sexual', 'nudity', 'porn'] as const
export const OTHER_SELF_LABELS = ['graphic-media'] as const export const OTHER_SELF_LABELS = ['graphic-media'] as const
@@ -102,8 +101,8 @@ export function lookupLabelValueDefinition(
export function isAppLabeler( export function isAppLabeler(
labeler: labeler:
| string | string
| AppBskyLabelerDefs.LabelerView | app.bsky.labeler.defs.LabelerView
| AppBskyLabelerDefs.LabelerViewDetailed, | app.bsky.labeler.defs.LabelerViewDetailed,
): boolean { ): boolean {
if (typeof labeler === 'string') { if (typeof labeler === 'string') {
return AtpAgent.appLabelers.includes(labeler) return AtpAgent.appLabelers.includes(labeler)
@@ -114,8 +113,8 @@ export function isAppLabeler(
export function isLabelerSubscribed( export function isLabelerSubscribed(
labeler: labeler:
| string | string
| AppBskyLabelerDefs.LabelerView | app.bsky.labeler.defs.LabelerView
| AppBskyLabelerDefs.LabelerViewDetailed, | app.bsky.labeler.defs.LabelerViewDetailed,
modOpts: ModerationOpts, modOpts: ModerationOpts,
) { ) {
labeler = typeof labeler === 'string' ? labeler : labeler.creator.did labeler = typeof labeler === 'string' ? labeler : labeler.creator.did
@@ -1,4 +1,4 @@
import {type ModerationUI} from '@atproto/api' import {type ModerationUI} from '@bsky.app/sdk/moderation'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
+133
View File
@@ -0,0 +1,133 @@
import {
type AppBskyActorDefs,
type AppBskyFeedDefs,
type AppBskyGraphDefs,
type AppBskyNotificationListNotifications,
type AppBskyRichtextFacet,
type ChatBskyActorDefs,
} from '@atproto/api'
import {
hasMutedWord as sdkHasMutedWord,
moderateFeedGenerator as sdkModerateFeedGenerator,
moderateNotification as sdkModerateNotification,
moderatePost as sdkModeratePost,
moderateProfile as sdkModerateProfile,
moderateStatus as sdkModerateStatus,
moderateUserList as sdkModerateUserList,
type ModerationDecision,
type ModerationOpts,
} from '@bsky.app/sdk/moderation'
import {type app, type chat} from '#/lexicons'
/*
* TRANSITIONAL. The moderation implementation now comes from
* `@bsky.app/sdk/moderation`, whose subject types are the generated
* `#/lexicons` views - so their `did`/`uri`/`cid` fields are branded
* (`DidString`, `AtUriString`). Many read paths still emit the identically
* shaped `@atproto/api` views, whose same fields are plain `string`.
*
* A plain `string` is not assignable to a branded template-literal type, so
* every `moderate*` call taking an unmigrated view fails to typecheck even
* though the value is byte-identical - the runtime only ever reads `.did`,
* `.labels` and `.viewer`, none of which the brand affects.
*
* These wrappers widen each subject parameter to accept a view from either
* world and drop the brand on the way in. Delete this module once every
* producer emits `#/lexicons` views (the `@atproto/api` removal pass) and point
* callers back at `@bsky.app/sdk/moderation` directly.
*/
type AnyProfileSubject =
| app.bsky.actor.defs.ProfileViewBasic
| app.bsky.actor.defs.ProfileView
| app.bsky.actor.defs.ProfileViewDetailed
| chat.bsky.actor.defs.ProfileViewBasic
| AppBskyActorDefs.ProfileViewBasic
| AppBskyActorDefs.ProfileView
| AppBskyActorDefs.ProfileViewDetailed
| ChatBskyActorDefs.ProfileViewBasic
type AnyPostSubject = app.bsky.feed.defs.PostView | AppBskyFeedDefs.PostView
type AnyUserListSubject =
| app.bsky.graph.defs.ListViewBasic
| app.bsky.graph.defs.ListView
| AppBskyGraphDefs.ListViewBasic
| AppBskyGraphDefs.ListView
type AnyFeedGeneratorSubject =
| app.bsky.feed.defs.GeneratorView
| AppBskyFeedDefs.GeneratorView
type AnyNotificationSubject =
| app.bsky.notification.listNotifications.Notification
| AppBskyNotificationListNotifications.Notification
export function moderateProfile(
subject: AnyProfileSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModerateProfile(subject as app.bsky.actor.defs.ProfileView, opts)
}
export function moderateStatus(
subject: AnyProfileSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModerateStatus(subject as app.bsky.actor.defs.ProfileView, opts)
}
export function moderatePost(
subject: AnyPostSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModeratePost(subject as app.bsky.feed.defs.PostView, opts)
}
export function moderateUserList(
subject: AnyUserListSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModerateUserList(subject as app.bsky.graph.defs.ListView, opts)
}
export function moderateFeedGenerator(
subject: AnyFeedGeneratorSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModerateFeedGenerator(
subject as app.bsky.feed.defs.GeneratorView,
opts,
)
}
export function moderateNotification(
subject: AnyNotificationSubject,
opts: ModerationOpts,
): ModerationDecision {
return sdkModerateNotification(
subject as app.bsky.notification.listNotifications.Notification,
opts,
)
}
/**
* Widens `facets`/`actor` for the same reason the `moderate*` wrappers widen
* their subjects: mute-word matching reads only `text`/`features`/`langs`, none
* of which the brand affects.
*/
export function hasMutedWord(params: {
mutedWords: app.bsky.actor.defs.MutedWord[]
text: string
facets?: app.bsky.richtext.facet.Main[] | AppBskyRichtextFacet.Main[]
outlineTags?: string[]
languages?: string[]
actor?: AnyProfileSubject
}): boolean {
return sdkHasMutedWord({
...params,
facets: params.facets as app.bsky.richtext.facet.Main[] | undefined,
actor: params.actor as app.bsky.actor.defs.ProfileView | undefined,
})
}
@@ -1,7 +1,7 @@
import { import {
type InterpretedLabelValueDefinition, type InterpretedLabelValueDefinition,
type LabelPreference, type LabelPreference,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
+4 -4
View File
@@ -1,10 +1,9 @@
import {type ComAtprotoLabelDefs} from '@atproto/api'
import { import {
type AppBskyLabelerDefs,
type ComAtprotoLabelDefs,
type InterpretedLabelValueDefinition, type InterpretedLabelValueDefinition,
interpretLabelValueDefinition, interpretLabelValueDefinition,
LABELS, LABELS,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import * as bcp47Match from 'bcp-47-match' import * as bcp47Match from 'bcp-47-match'
@@ -13,12 +12,13 @@ import {
useGlobalLabelStrings, useGlobalLabelStrings,
} from '#/lib/moderation/useGlobalLabelStrings' } from '#/lib/moderation/useGlobalLabelStrings'
import {useLabelDefinitions} from '#/state/preferences' import {useLabelDefinitions} from '#/state/preferences'
import {type app} from '#/lexicons'
export interface LabelInfo { export interface LabelInfo {
label: ComAtprotoLabelDefs.Label label: ComAtprotoLabelDefs.Label
def: InterpretedLabelValueDefinition def: InterpretedLabelValueDefinition
strings: ComAtprotoLabelDefs.LabelValueDefinitionStrings strings: ComAtprotoLabelDefs.LabelValueDefinitionStrings
labeler: AppBskyLabelerDefs.LabelerViewDetailed | undefined labeler: app.bsky.labeler.defs.LabelerViewDetailed | undefined
} }
export function useLabelInfo(label: ComAtprotoLabelDefs.Label): LabelInfo { export function useLabelInfo(label: ComAtprotoLabelDefs.Label): LabelInfo {
@@ -1,9 +1,6 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import { import {BSKY_LABELER_DID} from '@atproto/api'
BSKY_LABELER_DID, import {type ModerationCause} from '@bsky.app/sdk/moderation'
type ModerationCause,
type ModerationCauseSource,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
@@ -25,7 +22,7 @@ export interface ModerationCauseDescription {
description: string description: string
source?: string source?: string
sourceDisplayName?: string sourceDisplayName?: string
sourceType?: ModerationCauseSource['type'] sourceType?: ModerationCause['source']['type']
sourceAvi?: string sourceAvi?: string
sourceDid?: string sourceDid?: string
isSubjectAccount?: boolean isSubjectAccount?: boolean
+1 -1
View File
@@ -1,4 +1,4 @@
import {type ModerationUI} from '@atproto/api' import {type ModerationUI} from '@bsky.app/sdk/moderation'
// \u2705 = ✅ // \u2705 = ✅
// \u2713 = ✓ // \u2713 = ✓
+2 -1
View File
@@ -1,7 +1,7 @@
import {useCallback, useEffect, useMemo, useState} from 'react' import {useCallback, useEffect, useMemo, useState} from 'react'
import {type LayoutChangeEvent, View} from 'react-native' import {type LayoutChangeEvent, View} from 'react-native'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import {ChatBskyConvoDefs, moderateProfile} from '@atproto/api' import {ChatBskyConvoDefs} from '@atproto/api'
import { import {
ScrollEdgeEffect, ScrollEdgeEffect,
ScrollEdgeEffectProvider, ScrollEdgeEffectProvider,
@@ -18,6 +18,7 @@ import {type NativeStackScreenProps} from '@react-navigation/native-stack'
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
import {useViewportZoomLock} from '#/lib/hooks/useViewportZoomLock' import {useViewportZoomLock} from '#/lib/hooks/useViewportZoomLock'
import {moderateProfile} from '#/lib/moderation/subjects'
import { import {
type CommonNavigatorParams, type CommonNavigatorParams,
type NavigationProp, type NavigationProp,
@@ -1,9 +1,9 @@
import {View} from 'react-native' import {View} from 'react-native'
import {moderateProfile} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {logger} from '#/logger' import {logger} from '#/logger'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
@@ -1,10 +1,7 @@
import {useEffect, useState} from 'react' import {useEffect, useState} from 'react'
import {Pressable, View} from 'react-native' import {Pressable, View} from 'react-native'
import { import {ChatBskyActorDefs, ChatBskyConvoDefs} from '@atproto/api'
ChatBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
ChatBskyConvoDefs,
type ModerationOpts,
} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
+2 -1
View File
@@ -1,11 +1,12 @@
import {useEffect} from 'react' import {useEffect} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {ImageBackground} from 'expo-image' import {ImageBackground} from 'expo-image'
import {ChatBskyGroupDefs, moderateProfile} from '@atproto/api' import {ChatBskyGroupDefs} from '@atproto/api'
import {type ThemeName} from '@bsky.app/alf' import {type ThemeName} from '@bsky.app/alf'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links'
@@ -1,11 +1,10 @@
import {useCallback, useMemo, useState} from 'react' import {useCallback, useMemo, useState} from 'react'
import {type GestureResponderEvent, View} from 'react-native' import {type GestureResponderEvent, View} from 'react-native'
import {ChatBskyConvoDefs} from '@atproto/api'
import { import {
ChatBskyConvoDefs,
moderateProfile,
type ModerationDecision, type ModerationDecision,
type ModerationOpts, type ModerationOpts,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
@@ -13,6 +12,7 @@ import {useQueryClient} from '@tanstack/react-query'
import {GestureActionView} from '#/lib/custom-animations/GestureActionView' import {GestureActionView} from '#/lib/custom-animations/GestureActionView'
import {useHaptics} from '#/lib/haptics' import {useHaptics} from '#/lib/haptics'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {decrementBadgeCount} from '#/lib/notifications/notifications' import {decrementBadgeCount} from '#/lib/notifications/notifications'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import { import {
@@ -1,10 +1,10 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {LinearGradient} from 'expo-linear-gradient' import {LinearGradient} from 'expo-linear-gradient'
import {moderateProfile} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {type ActiveConvoStates} from '#/state/messages/convo' import {type ActiveConvoStates} from '#/state/messages/convo'
@@ -1,15 +1,13 @@
import {useState} from 'react' import {useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import { import {type ChatBskyGroupDefs} from '@atproto/api'
type ChatBskyGroupDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {shareUrl} from '#/lib/sharing' import {shareUrl} from '#/lib/sharing'
import {useCreateJoinLink} from '#/state/queries/messages/create-join-link' import {useCreateJoinLink} from '#/state/queries/messages/create-join-link'
import {useDisableJoinLink} from '#/state/queries/messages/disable-join-link' import {useDisableJoinLink} from '#/state/queries/messages/disable-join-link'
@@ -1,11 +1,12 @@
import {useCallback, useEffect, useMemo, useState} from 'react' import {useCallback, useEffect, useMemo, useState} from 'react'
import {LayoutAnimation, View} from 'react-native' import {LayoutAnimation, View} from 'react-native'
import {AppBskyFeedPost, AtUri, moderatePost} from '@atproto/api' import {AppBskyFeedPost, AtUri} from '@atproto/api'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {type RouteProp, useNavigation, useRoute} from '@react-navigation/native' import {type RouteProp, useNavigation, useRoute} from '@react-navigation/native'
import {HITSLOP_20} from '#/lib/constants' import {HITSLOP_20} from '#/lib/constants'
import {moderatePost} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import { import {
type CommonNavigatorParams, type CommonNavigatorParams,
@@ -1,9 +1,9 @@
import {View} from 'react-native' import {View} from 'react-native'
import {moderateProfile} from '@atproto/api'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {moderateProfile} from '#/lib/moderation/subjects'
import {type NavigationProp} from '#/lib/routes/types' import {type NavigationProp} from '#/lib/routes/types'
import {isInvalidHandle, sanitizeHandle} from '#/lib/strings/handles' import {isInvalidHandle, sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
+1 -1
View File
@@ -1,6 +1,6 @@
import {Fragment, useCallback} from 'react' import {Fragment, useCallback} from 'react'
import {Linking, View} from 'react-native' import {Linking, View} from 'react-native'
import {LABELS} from '@atproto/api' import {LABELS} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -23,7 +23,6 @@ import {PostInteractionSettingsForm} from '#/components/dialogs/PostInteractionS
import * as Layout from '#/components/Layout' import * as Layout from '#/components/Layout'
import {Loader} from '#/components/Loader' import {Loader} from '#/components/Loader'
import * as Toast from '#/components/Toast' import * as Toast from '#/components/Toast'
import {type app} from '#/lexicons'
export function Screen() { export function Screen() {
const gutters = useGutters(['base']) const gutters = useGutters(['base'])
@@ -76,15 +75,14 @@ function Inner({preferences}: {preferences: UsePreferencesQueryResponse}) {
* Preferences are still typed against the legacy client, so the stored * Preferences are still typed against the legacy client, so the stored
* rules arrive unbranded. Wave B migrates `getPreferences`. * rules arrive unbranded. Wave B migrates `getPreferences`.
*/ */
allow: preferences.postInteractionSettings allow: preferences.postInteractionSettings.threadgateAllowRules,
.threadgateAllowRules as app.bsky.feed.threadgate.Main['allow'],
}) })
}, [preferences.postInteractionSettings.threadgateAllowRules]) }, [preferences.postInteractionSettings.threadgateAllowRules])
const postgate = useMemo(() => { const postgate = useMemo(() => {
return createPostgateRecord({ return createPostgateRecord({
post: '', post: '',
embeddingRules: preferences.postInteractionSettings embeddingRules:
.postgateEmbeddingRules as app.bsky.feed.postgate.Main['embeddingRules'], preferences.postInteractionSettings.postgateEmbeddingRules,
}) })
}, [preferences.postInteractionSettings.postgateEmbeddingRules]) }, [preferences.postInteractionSettings.postgateEmbeddingRules])
@@ -1,6 +1,6 @@
import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {useCallback, useEffect, useMemo, useRef, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -1,7 +1,8 @@
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyFeedDefs, AtUri, moderateProfile} from '@atproto/api' import {type AppBskyFeedDefs, AtUri} from '@atproto/api'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
+2 -1
View File
@@ -1,5 +1,6 @@
import {View} from 'react-native' import {View} 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 {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
@@ -1,11 +1,7 @@
import {memo, useCallback, useMemo, useState} from 'react' import {memo, useCallback, useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyActorDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
type AppBskyLabelerDefs,
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {msg, plural} from '@lingui/core/macro' import {msg, plural} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
@@ -15,6 +11,7 @@ import {Plural, Trans} from '@lingui/react/macro'
import {MAX_LABELERS} from '#/lib/constants' import {MAX_LABELERS} from '#/lib/constants'
import {useHaptics} from '#/lib/haptics' import {useHaptics} from '#/lib/haptics'
import {isAppLabeler} from '#/lib/moderation' import {isAppLabeler} from '#/lib/moderation'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {type Shadow} from '#/state/cache/types' import {type Shadow} from '#/state/cache/types'
import {useLabelerSubscriptionMutation} from '#/state/queries/labeler' import {useLabelerSubscriptionMutation} from '#/state/queries/labeler'
@@ -37,6 +34,7 @@ import * as Toast from '#/components/Toast'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {useAnalytics} from '#/analytics' import {useAnalytics} from '#/analytics'
import {IS_IOS} from '#/env' import {IS_IOS} from '#/env'
import {type app} from '#/lexicons'
import {ProfileHeaderDisplayName} from './DisplayName' import {ProfileHeaderDisplayName} from './DisplayName'
import {EditProfileDialog} from './EditProfileDialog' import {EditProfileDialog} from './EditProfileDialog'
import {ProfileHeaderHandle} from './Handle' import {ProfileHeaderHandle} from './Handle'
@@ -45,7 +43,7 @@ import {ProfileHeaderShell} from './Shell'
interface Props { interface Props {
profile: AppBskyActorDefs.ProfileViewDetailed profile: AppBskyActorDefs.ProfileViewDetailed
labeler: AppBskyLabelerDefs.LabelerViewDetailed labeler: app.bsky.labeler.defs.LabelerViewDetailed
descriptionRT: RichTextAPI | null descriptionRT: RichTextAPI | null
moderationOpts: ModerationOpts moderationOpts: ModerationOpts
hideBackButton?: boolean hideBackButton?: boolean
@@ -1,17 +1,17 @@
import {memo, useMemo, useState} from 'react' import {memo, useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyActorDefs} from '@atproto/api'
import { import {
type AppBskyActorDefs,
moderateProfile,
type ModerationDecision, type ModerationDecision,
type ModerationOpts, type ModerationOpts,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {useHaptics} from '#/lib/haptics' import {useHaptics} from '#/lib/haptics'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {logger} from '#/logger' import {logger} from '#/logger'
import {type Shadow, useProfileShadow} from '#/state/cache/profile-shadow' import {type Shadow, useProfileShadow} from '#/state/cache/profile-shadow'
+2 -1
View File
@@ -5,8 +5,9 @@ import Animated, {
useAnimatedRef, useAnimatedRef,
} from 'react-native-reanimated' } from 'react-native-reanimated'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import {type AppBskyActorDefs, type ModerationDecision} from '@atproto/api' import {type AppBskyActorDefs} from '@atproto/api'
import {utils} from '@bsky.app/alf' import {utils} from '@bsky.app/alf'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
+6 -8
View File
@@ -7,15 +7,12 @@ import Animated, {
} from 'react-native-reanimated' } from 'react-native-reanimated'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import {scheduleOnRN} from 'react-native-worklets' import {scheduleOnRN} from 'react-native-worklets'
import { import {type AppBskyActorDefs} from '@atproto/api'
type AppBskyActorDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
type AppBskyLabelerDefs,
moderateProfile,
type ModerationOpts,
} from '@atproto/api'
import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {type RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {useIsFocused} from '@react-navigation/native' import {useIsFocused} from '@react-navigation/native'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
@@ -26,6 +23,7 @@ import {atoms as a, useTheme} from '#/alf'
import {Header} from '#/components/Layout' import {Header} from '#/components/Layout'
import * as ProfileCard from '#/components/ProfileCard' import * as ProfileCard from '#/components/ProfileCard'
import {IS_NATIVE} from '#/env' import {IS_NATIVE} from '#/env'
import {type app} from '#/lexicons'
import { import {
HeaderLabelerButtons, HeaderLabelerButtons,
ProfileHeaderLabeler, ProfileHeaderLabeler,
@@ -61,7 +59,7 @@ export {ProfileHeaderLoading}
interface Props { interface Props {
profile: AppBskyActorDefs.ProfileViewDetailed profile: AppBskyActorDefs.ProfileViewDetailed
labeler: AppBskyLabelerDefs.LabelerViewDetailed | undefined labeler: app.bsky.labeler.defs.LabelerViewDetailed | undefined
descriptionRT: RichTextAPI | null descriptionRT: RichTextAPI | null
moderationOpts: ModerationOpts moderationOpts: ModerationOpts
hideBackButton?: boolean hideBackButton?: boolean
@@ -106,7 +104,7 @@ const MinimalHeader = memo(function MinimalHeader({
}: { }: {
onLayout: (e: LayoutChangeEvent) => void onLayout: (e: LayoutChangeEvent) => void
profile: AppBskyActorDefs.ProfileViewDetailed profile: AppBskyActorDefs.ProfileViewDetailed
labeler?: AppBskyLabelerDefs.LabelerViewDetailed labeler?: app.bsky.labeler.defs.LabelerViewDetailed
hideBackButton?: boolean hideBackButton?: boolean
}) { }) {
const t = useTheme() const t = useTheme()
+4 -4
View File
@@ -1,11 +1,10 @@
import {useCallback, useEffect, useImperativeHandle, useMemo} from 'react' import {useCallback, useEffect, useImperativeHandle, useMemo} from 'react'
import {type ListRenderItemInfo, View} from 'react-native' import {type ListRenderItemInfo, View} from 'react-native'
import { import {
type AppBskyLabelerDefs,
type InterpretedLabelValueDefinition, type InterpretedLabelValueDefinition,
interpretLabelValueDefinitions, interpretLabelValueDefinitions,
type ModerationOpts, type ModerationOpts,
} from '@atproto/api' } from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -21,13 +20,14 @@ import {Loader} from '#/components/Loader'
import {LabelerLabelPreference} from '#/components/moderation/LabelPreference' import {LabelerLabelPreference} from '#/components/moderation/LabelPreference'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import {IS_IOS, IS_NATIVE} from '#/env' import {IS_IOS, IS_NATIVE} from '#/env'
import {type app} from '#/lexicons'
import {ErrorState} from '../ErrorState' import {ErrorState} from '../ErrorState'
import {type SectionRef} from './types' import {type SectionRef} from './types'
interface LabelsSectionProps { interface LabelsSectionProps {
ref: React.Ref<SectionRef> ref: React.Ref<SectionRef>
isLabelerLoading: boolean isLabelerLoading: boolean
labelerInfo: AppBskyLabelerDefs.LabelerViewDetailed | undefined labelerInfo: app.bsky.labeler.defs.LabelerViewDetailed | undefined
labelerError: Error | null labelerError: Error | null
moderationOpts: ModerationOpts moderationOpts: ModerationOpts
scrollElRef: ListRef scrollElRef: ListRef
@@ -161,7 +161,7 @@ export function LabelerListHeader({
}: { }: {
isLabelerLoading: boolean isLabelerLoading: boolean
labelerError?: Error | null labelerError?: Error | null
labelerInfo?: AppBskyLabelerDefs.LabelerViewDetailed labelerInfo?: app.bsky.labeler.defs.LabelerViewDetailed
hasValues: boolean hasValues: boolean
isSubscribed: boolean isSubscribed: boolean
}) { }) {
+3 -6
View File
@@ -1,12 +1,8 @@
import {useCallback, useMemo, useRef, useState} from 'react' import {useCallback, useMemo, useRef, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {useAnimatedRef} from 'react-native-reanimated' import {useAnimatedRef} from 'react-native-reanimated'
import { import {AppBskyGraphDefs, AtUri} from '@atproto/api'
AppBskyGraphDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
AtUri,
moderateUserList,
type ModerationOpts,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -15,6 +11,7 @@ import {useQueryClient} from '@tanstack/react-query'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {useSetTitle} from '#/lib/hooks/useSetTitle' import {useSetTitle} from '#/lib/hooks/useSetTitle'
import {moderateUserList} from '#/lib/moderation/subjects'
import { import {
type CommonNavigatorParams, type CommonNavigatorParams,
type NativeStackScreenProps, type NativeStackScreenProps,
@@ -1,8 +1,9 @@
import {ScrollView, View} from 'react-native' import {ScrollView, View} from 'react-native'
import {moderateProfile, type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {createHitslop} from '#/lib/constants' import {createHitslop} from '#/lib/constants'
import {moderateProfile} from '#/lib/moderation/subjects'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
@@ -1,6 +1,6 @@
import {useCallback} from 'react' import {useCallback} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
@@ -1,14 +1,11 @@
import {useState} from 'react' import {useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {type AppBskyGraphDefs, AppBskyGraphStarterpack} from '@atproto/api'
type AppBskyGraphDefs,
AppBskyGraphStarterpack,
moderateProfile,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizeHandle} from '#/lib/strings/handles'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
@@ -1,6 +1,7 @@
import {memo, useEffect} from 'react' import {memo, useEffect} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {type AppBskyActorSearchActors, type ModerationOpts} from '@atproto/api' import {type AppBskyActorSearchActors} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {type InfiniteData} from '@tanstack/react-query' import {type InfiniteData} from '@tanstack/react-query'
@@ -1,10 +1,11 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {Pressable, View} from 'react-native' import {Pressable, View} from 'react-native'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import {type AppBskyUnspeccedDefs, moderateProfile} from '@atproto/api' import {type AppBskyUnspeccedDefs} from '@atproto/api'
import {RichText as RichTextApi} from '@bsky.app/sdk/richtext' import {RichText as RichTextApi} from '@bsky.app/sdk/richtext'
import {Plural, Trans, useLingui} from '@lingui/react/macro' import {Plural, Trans, useLingui} from '@lingui/react/macro'
import {moderateProfile} from '#/lib/moderation/subjects'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import { import {
useTrendingSettings, useTrendingSettings,
@@ -1,8 +1,9 @@
import {useCallback, useEffect, useState} from 'react' import {useCallback, useEffect, useState} from 'react'
import {type ListRenderItemInfo, View} from 'react-native' import {type ListRenderItemInfo, View} from 'react-native'
import * as Contacts from 'expo-contacts' import * as Contacts from 'expo-contacts'
import {type AppBskyContactDefs, type ModerationOpts} from '@atproto/api' import {type AppBskyContactDefs} from '@atproto/api'
import {type DidString} from '@atproto/syntax' import {type DidString} from '@atproto/syntax'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Plural, Trans} from '@lingui/react/macro' import {Plural, Trans} from '@lingui/react/macro'
@@ -1,6 +1,6 @@
import {useCallback, useMemo} from 'react' import {useCallback, useMemo} from 'react'
import {type ListRenderItemInfo, Text as RNText, View} from 'react-native' import {type ListRenderItemInfo, Text as RNText, View} from 'react-native'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
+2 -1
View File
@@ -1,7 +1,7 @@
import {useState} from 'react' import {useState} from 'react'
import {Alert, LayoutAnimation, Linking, Pressable, View} from 'react-native' import {Alert, LayoutAnimation, Linking, Pressable, View} from 'react-native'
import {useReducedMotion} from 'react-native-reanimated' import {useReducedMotion} from 'react-native-reanimated'
import {type AppBskyActorDefs, moderateProfile} from '@atproto/api' import {type AppBskyActorDefs} from '@atproto/api'
import {removeNuxs} from '@bsky.app/sdk' import {removeNuxs} from '@bsky.app/sdk'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
@@ -10,6 +10,7 @@ import {type NativeStackScreenProps} from '@react-navigation/native-stack'
import {HELP_DESK_URL, HITSLOP_10} from '#/lib/constants' import {HELP_DESK_URL, HITSLOP_10} from '#/lib/constants'
import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher' import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher'
import {useApplyPullRequestOTAUpdate} from '#/lib/hooks/useOTAUpdates' import {useApplyPullRequestOTAUpdate} from '#/lib/hooks/useOTAUpdates'
import {moderateProfile} from '#/lib/moderation/subjects'
import { import {
type CommonNavigatorParams, type CommonNavigatorParams,
type NavigationProp, type NavigationProp,
@@ -1,12 +1,8 @@
import {useEffect, useState} from 'react' import {useEffect, useState} from 'react'
import {Pressable, View} from 'react-native' import {Pressable, View} from 'react-native'
import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' import Animated, {FadeIn, FadeOut} from 'react-native-reanimated'
import { import {AppBskyGraphDefs, AppBskyGraphStarterpack, AtUri} from '@atproto/api'
AppBskyGraphDefs, import {type ModerationOpts} from '@bsky.app/sdk/moderation'
AppBskyGraphStarterpack,
AtUri,
type ModerationOpts,
} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
@@ -1,13 +1,9 @@
import {useCallback, useEffect, useState} from 'react' import {useCallback, useEffect, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import { import {AppBskyGraphDefs, AppBskyGraphStarterpack, AtUri} from '@atproto/api'
AppBskyGraphDefs,
AppBskyGraphStarterpack,
AtUri,
type ModerationOpts,
} from '@atproto/api'
import {type AtUriString} from '@atproto/syntax' import {type AtUriString} from '@atproto/syntax'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
+2 -1
View File
@@ -1,7 +1,8 @@
import {useState} from 'react' import {useState} from 'react'
import {type ListRenderItemInfo, View} from 'react-native' import {type ListRenderItemInfo, View} from 'react-native'
import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' import {KeyboardAwareScrollView} from 'react-native-keyboard-controller'
import {type AppBskyFeedDefs, type ModerationOpts} from '@atproto/api' import {type AppBskyFeedDefs} from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {DISCOVER_FEED_URI} from '#/lib/constants' import {DISCOVER_FEED_URI} from '#/lib/constants'
@@ -1,7 +1,7 @@
import {useState} from 'react' import {useState} from 'react'
import {type ListRenderItemInfo, View} from 'react-native' import {type ListRenderItemInfo, View} from 'react-native'
import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' import {KeyboardAwareScrollView} from 'react-native-keyboard-controller'
import {type ModerationOpts} from '@atproto/api' import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {Trans} from '@lingui/react/macro' import {Trans} from '@lingui/react/macro'
import {useA11y} from '#/state/a11y' import {useA11y} from '#/state/a11y'
+1 -1
View File
@@ -8,8 +8,8 @@ import {
type AppBskyFeedDefs, type AppBskyFeedDefs,
type AppBskyGraphDefs, type AppBskyGraphDefs,
AtUri, AtUri,
type ModerationOpts,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro' import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Plural, Trans} from '@lingui/react/macro' import {Plural, Trans} from '@lingui/react/macro'
+1 -1
View File
@@ -30,8 +30,8 @@ import {
type AppBskyFeedDefs, type AppBskyFeedDefs,
AppBskyFeedPost, AppBskyFeedPost,
AtUri, AtUri,
type ModerationDecision,
} from '@atproto/api' } from '@atproto/api'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext' import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import { import {
+3 -5
View File
@@ -1,14 +1,12 @@
import {createContext, useContext} from 'react' import {createContext, useContext} from 'react'
import { import {type InterpretedLabelValueDefinition} from '@bsky.app/sdk/moderation'
type AppBskyLabelerDefs,
type InterpretedLabelValueDefinition,
} from '@atproto/api'
import {type app} from '#/lexicons'
import {useLabelDefinitionsQuery} from '../queries/preferences' import {useLabelDefinitionsQuery} from '../queries/preferences'
interface StateContext { interface StateContext {
labelDefs: Record<string, InterpretedLabelValueDefinition[]> labelDefs: Record<string, InterpretedLabelValueDefinition[]>
labelers: AppBskyLabelerDefs.LabelerViewDetailed[] labelers: app.bsky.labeler.defs.LabelerViewDetailed[]
} }
const stateContext = createContext<StateContext>({ const stateContext = createContext<StateContext>({
+10 -4
View File
@@ -1,5 +1,6 @@
import {createContext, useContext, useMemo} from 'react' import {createContext, useContext, useMemo} from 'react'
import {AtpAgent, type ModerationOpts} from '@atproto/api' import {Client} from '@atproto/lex'
import {type ModerationOpts} from '@bsky.app/sdk/moderation'
import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences'
import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/const' import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/const'
@@ -38,16 +39,21 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
return undefined return undefined
} }
return { return {
userDid, /*
* `did`/`hiddenPosts` come from persisted storage typed as plain
* `string`, so brand them to the SDK's `DidString`/`AtUriString` slots.
*/
userDid: userDid as ModerationOpts['userDid'],
prefs: { prefs: {
...moderationPrefs, ...moderationPrefs,
labelers: moderationPrefs.labelers.length labelers: moderationPrefs.labelers.length
? moderationPrefs.labelers ? moderationPrefs.labelers
: AtpAgent.appLabelers.map(did => ({ : Client.appLabelers.map(did => ({
did, did,
labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES, labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES,
})), })),
hiddenPosts: hiddenPosts || [], hiddenPosts: (hiddenPosts ||
[]) as ModerationOpts['prefs']['hiddenPosts'],
}, },
labelDefs, labelDefs,
} }

Some files were not shown because too many files have changed in this diff Show More