Handle muting correctly
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {
|
import {
|
||||||
ModerationCause,
|
ModerationCause,
|
||||||
|
ModerationUI,
|
||||||
LABEL_GROUPS,
|
LABEL_GROUPS,
|
||||||
LabelGroupDefinition,
|
LabelGroupDefinition,
|
||||||
AppBskyModerationDefs,
|
AppBskyModerationDefs,
|
||||||
@@ -22,6 +23,10 @@ export function getModerationCauseKey(cause: ModerationCause): string {
|
|||||||
return `${cause.type}:${source}`
|
return `${cause.type}:${source}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isJustAMute(modui: ModerationUI): boolean {
|
||||||
|
return modui.filters.length === 1 && modui.filters[0].type === 'muted'
|
||||||
|
}
|
||||||
|
|
||||||
export function getLabelGroupsFromLabels(labels: string[]) {
|
export function getLabelGroupsFromLabels(labels: string[]) {
|
||||||
const groups: LabelGroupDefinition[] = []
|
const groups: LabelGroupDefinition[] = []
|
||||||
|
|
||||||
|
|||||||
@@ -58,18 +58,12 @@ export function useModerationCauseDescription(
|
|||||||
if (cause.type === 'muted') {
|
if (cause.type === 'muted') {
|
||||||
if (cause.source.type === 'list') {
|
if (cause.source.type === 'list') {
|
||||||
return {
|
return {
|
||||||
name:
|
name: _(msg`Muted by "${cause.source.list.name}"`),
|
||||||
context === 'account'
|
|
||||||
? _(msg`Muted by "${cause.source.list.name}"`)
|
|
||||||
: _(msg`Post by muted user ("${cause.source.list.name}")`),
|
|
||||||
description: _(msg`You have muted this user`),
|
description: _(msg`You have muted this user`),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
name:
|
name: _(msg`Muted User`),
|
||||||
context === 'account'
|
|
||||||
? _(msg`Muted User`)
|
|
||||||
: _(msg`Post by muted user`),
|
|
||||||
description: _(msg`You have muted this user`),
|
description: _(msg`You have muted this user`),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {useMyFollowsQuery} from '#/state/queries/my-follows'
|
|||||||
import {STALE} from '#/state/queries'
|
import {STALE} from '#/state/queries'
|
||||||
import {DEFAULT_LOGGED_OUT_PREFERENCES, useModerationOpts} from './preferences'
|
import {DEFAULT_LOGGED_OUT_PREFERENCES, useModerationOpts} from './preferences'
|
||||||
import {isInvalidHandle} from '#/lib/strings/handles'
|
import {isInvalidHandle} from '#/lib/strings/handles'
|
||||||
|
import {isJustAMute} from '#/lib/moderation'
|
||||||
|
|
||||||
const DEFAULT_MOD_OPTS = DEFAULT_LOGGED_OUT_PREFERENCES.moderationOpts
|
const DEFAULT_MOD_OPTS = DEFAULT_LOGGED_OUT_PREFERENCES.moderationOpts
|
||||||
|
|
||||||
@@ -107,8 +108,8 @@ function computeSuggestions(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return items.filter(profile => {
|
return items.filter(profile => {
|
||||||
const mod = moderateProfile(profile, moderationOpts).ui('profileList')
|
const modui = moderateProfile(profile, moderationOpts).ui('profileList')
|
||||||
return !mod.filter // TODO && mod.account.cause?.type !== 'muted'
|
return !modui.filter || isJustAMute(modui)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -230,9 +230,17 @@ export function usePostFeedQuery(
|
|||||||
|
|
||||||
// apply moderation filter
|
// apply moderation filter
|
||||||
for (let i = 0; i < slice.items.length; i++) {
|
for (let i = 0; i < slice.items.length; i++) {
|
||||||
|
const ignoreFilter =
|
||||||
|
slice.items[i].post.author.did === ignoreFilterFor
|
||||||
|
if (ignoreFilter) {
|
||||||
|
// remove mutes to avoid confused UIs
|
||||||
|
moderations[i].causes = moderations[i].causes.filter(
|
||||||
|
cause => cause.type !== 'muted',
|
||||||
|
)
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
moderations[i]?.ui('contentList').filter &&
|
!ignoreFilter &&
|
||||||
slice.items[i].post.author.did !== ignoreFilterFor
|
moderations[i]?.ui('contentList').filter
|
||||||
) {
|
) {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,7 +173,6 @@ let PostThreadItemLoaded = ({
|
|||||||
const itemTitle = _(msg`Post by ${post.author.handle}`)
|
const itemTitle = _(msg`Post by ${post.author.handle}`)
|
||||||
const authorHref = makeProfileLink(post.author)
|
const authorHref = makeProfileLink(post.author)
|
||||||
const authorTitle = post.author.handle
|
const authorTitle = post.author.handle
|
||||||
const isAuthorMuted = post.author.viewer?.muted
|
|
||||||
const likesHref = React.useMemo(() => {
|
const likesHref = React.useMemo(() => {
|
||||||
const urip = new AtUri(post.uri)
|
const urip = new AtUri(post.uri)
|
||||||
return makeProfileLink(post.author, 'post', urip.rkey, 'liked-by')
|
return makeProfileLink(post.author, 'post', urip.rkey, 'liked-by')
|
||||||
@@ -275,30 +274,6 @@ let PostThreadItemLoaded = ({
|
|||||||
</Link>
|
</Link>
|
||||||
</View>
|
</View>
|
||||||
<View style={styles.meta}>
|
<View style={styles.meta}>
|
||||||
{isAuthorMuted && (
|
|
||||||
<View
|
|
||||||
style={[
|
|
||||||
pal.viewLight,
|
|
||||||
{
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
gap: 4,
|
|
||||||
borderRadius: 6,
|
|
||||||
paddingHorizontal: 6,
|
|
||||||
paddingVertical: 2,
|
|
||||||
marginRight: 4,
|
|
||||||
},
|
|
||||||
]}>
|
|
||||||
<FontAwesomeIcon
|
|
||||||
icon={['far', 'eye-slash']}
|
|
||||||
size={12}
|
|
||||||
color={pal.colors.textLight}
|
|
||||||
/>
|
|
||||||
<Text type="sm-medium" style={pal.textLight}>
|
|
||||||
Muted
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
<Link style={s.flex1} href={authorHref} title={authorTitle}>
|
<Link style={s.flex1} href={authorHref} title={authorTitle}>
|
||||||
<Text type="md" style={[pal.textLight]} numberOfLines={1}>
|
<Text type="md" style={[pal.textLight]} numberOfLines={1}>
|
||||||
{sanitizeHandle(post.author.handle, '@')}
|
{sanitizeHandle(post.author.handle, '@')}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {FollowButton} from './FollowButton'
|
|||||||
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 {makeProfileLink} from 'lib/routes/links'
|
import {makeProfileLink} from 'lib/routes/links'
|
||||||
import {getModerationCauseKey} from 'lib/moderation'
|
import {getModerationCauseKey, isJustAMute} from 'lib/moderation'
|
||||||
import {Shadow} from '#/state/cache/types'
|
import {Shadow} from '#/state/cache/types'
|
||||||
import {useModerationOpts} from '#/state/queries/preferences'
|
import {useModerationOpts} from '#/state/queries/preferences'
|
||||||
import {useProfileShadow} from '#/state/cache/profile-shadow'
|
import {useProfileShadow} from '#/state/cache/profile-shadow'
|
||||||
@@ -52,7 +52,7 @@ export function ProfileCard({
|
|||||||
}
|
}
|
||||||
const moderation = moderateProfile(profile, moderationOpts)
|
const moderation = moderateProfile(profile, moderationOpts)
|
||||||
const modui = moderation.ui('profileList')
|
const modui = moderation.ui('profileList')
|
||||||
if (!noModFilter && modui.filter /* TODO && modui.type !== 'muted'*/) {
|
if (!noModFilter && modui.filter && !isJustAMute(modui)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {ModerationUI} from '@atproto/api'
|
|||||||
import {useLingui} from '@lingui/react'
|
import {useLingui} from '@lingui/react'
|
||||||
import {msg, Trans} from '@lingui/macro'
|
import {msg, Trans} from '@lingui/macro'
|
||||||
import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription'
|
import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription'
|
||||||
|
import {isJustAMute} from '#/lib/moderation'
|
||||||
|
|
||||||
import {atoms as a, useTheme, useBreakpoints} from '#/alf'
|
import {atoms as a, useTheme, useBreakpoints} from '#/alf'
|
||||||
import {Button, ButtonText, ButtonIcon} from '#/components/Button'
|
import {Button, ButtonText, ButtonIcon} from '#/components/Button'
|
||||||
@@ -16,7 +17,7 @@ import {useOpenGlobalDialog} from '#/components/dialogs'
|
|||||||
export function ContentHider({
|
export function ContentHider({
|
||||||
testID,
|
testID,
|
||||||
modui,
|
modui,
|
||||||
// ignoreMute, TODO
|
ignoreMute,
|
||||||
style,
|
style,
|
||||||
childContainerStyle,
|
childContainerStyle,
|
||||||
children,
|
children,
|
||||||
@@ -36,10 +37,7 @@ export function ContentHider({
|
|||||||
const blur = modui?.blurs[0]
|
const blur = modui?.blurs[0]
|
||||||
const desc = useModerationCauseDescription(blur, 'content')
|
const desc = useModerationCauseDescription(blur, 'content')
|
||||||
|
|
||||||
if (
|
if (!blur || (ignoreMute && isJustAMute(modui))) {
|
||||||
!blur
|
|
||||||
// || (ignoreMute && moderation.cause?.type === 'muted') TODO
|
|
||||||
) {
|
|
||||||
return (
|
return (
|
||||||
<View testID={testID} style={[styles.outer, style]}>
|
<View testID={testID} style={[styles.outer, style]}>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export function ProfileHeaderAlerts({
|
|||||||
|
|
||||||
function ProfileInform({cause}: {cause: ModerationCause}) {
|
function ProfileInform({cause}: {cause: ModerationCause}) {
|
||||||
const openDialog = useOpenGlobalDialog()
|
const openDialog = useOpenGlobalDialog()
|
||||||
const desc = useModerationCauseDescription(cause, 'content')
|
const desc = useModerationCauseDescription(cause, 'account')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
@@ -55,7 +55,7 @@ function ProfileInform({cause}: {cause: ModerationCause}) {
|
|||||||
shape="default"
|
shape="default"
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
openDialog(ModerationDetailsDialog, {
|
openDialog(ModerationDetailsDialog, {
|
||||||
context: 'content',
|
context: 'account',
|
||||||
modcause: cause,
|
modcause: cause,
|
||||||
})
|
})
|
||||||
}}>
|
}}>
|
||||||
@@ -71,7 +71,7 @@ function ProfileInform({cause}: {cause: ModerationCause}) {
|
|||||||
function ProfileAlert({cause}: {cause: ModerationCause}) {
|
function ProfileAlert({cause}: {cause: ModerationCause}) {
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
const openDialog = useOpenGlobalDialog()
|
const openDialog = useOpenGlobalDialog()
|
||||||
const desc = useModerationCauseDescription(cause, 'content')
|
const desc = useModerationCauseDescription(cause, 'account')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
@@ -82,7 +82,7 @@ function ProfileAlert({cause}: {cause: ModerationCause}) {
|
|||||||
shape="default"
|
shape="default"
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
openDialog(ModerationDetailsDialog, {
|
openDialog(ModerationDetailsDialog, {
|
||||||
context: 'content',
|
context: 'account',
|
||||||
modcause: cause,
|
modcause: cause,
|
||||||
})
|
})
|
||||||
}}>
|
}}>
|
||||||
|
|||||||
Reference in New Issue
Block a user