fix up debugmod

This commit is contained in:
Samuel Newman
2026-05-18 15:22:52 +03:00
parent ff731849b0
commit 586641536d
2 changed files with 308 additions and 295 deletions
-5
View File
@@ -688,11 +688,6 @@
"count": 1 "count": 1
} }
}, },
"src/view/screens/DebugMod.tsx": {
"@typescript-eslint/no-explicit-any": {
"count": 1
}
},
"src/view/shell/createNativeStackNavigatorWithAuth.tsx": { "src/view/shell/createNativeStackNavigatorWithAuth.tsx": {
"@typescript-eslint/no-explicit-any": { "@typescript-eslint/no-explicit-any": {
"count": 1 "count": 1
+308 -290
View File
@@ -1,5 +1,6 @@
import {useMemo, useState} from 'react' import {useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {useSharedValue} from 'react-native-reanimated'
import { import {
type AppBskyActorDefs, type AppBskyActorDefs,
type AppBskyFeedDefs, type AppBskyFeedDefs,
@@ -54,6 +55,7 @@ import * as ProfileCard from '#/components/ProfileCard'
import {H1, H3, P, Text} from '#/components/Typography' import {H1, H3, P, Text} from '#/components/Typography'
import {ScreenHider} from '../../components/moderation/ScreenHider' import {ScreenHider} from '../../components/moderation/ScreenHider'
import {NotificationFeedItem} from '../com/notifications/NotificationFeedItem' import {NotificationFeedItem} from '../com/notifications/NotificationFeedItem'
import {PagerHeaderProvider} from '../com/pager/PagerHeaderContext'
import {PostFeedItem} from '../com/posts/PostFeedItem' import {PostFeedItem} from '../com/posts/PostFeedItem'
const LABEL_VALUES: (keyof typeof LABELS)[] = Object.keys( const LABEL_VALUES: (keyof typeof LABELS)[] = Object.keys(
@@ -272,325 +274,341 @@ export const DebugModScreen = ({}: NativeStackScreenProps<
return moderatePost(post, modOpts) return moderatePost(post, modOpts)
}, [post, modOpts]) }, [post, modOpts])
const sv = useSharedValue(0)
return ( return (
<Layout.Screen> <Layout.Screen>
<moderationOptsOverrideContext.Provider value={modOpts}> <PagerHeaderProvider headerHeight={0} scrollY={sv}>
<ScrollView> <moderationOptsOverrideContext.Provider value={modOpts}>
<CenteredView style={[t.atoms.bg, a.px_lg, a.py_lg]}> <ScrollView>
<H1 style={[a.text_5xl, a.font_semi_bold, a.pb_lg]}> <CenteredView style={[t.atoms.bg, a.px_lg, a.py_lg]}>
Moderation states <H1 style={[a.text_5xl, a.font_semi_bold, a.pb_lg]}>
</H1> Moderation states
</H1>
<Heading title="" subtitle="Scenario" /> <Heading title="" subtitle="Scenario" />
<ToggleButton.Group <ToggleButton.Group
label="Scenario" label="Scenario"
values={scenario} values={scenario}
onChange={setScenario}> onChange={setScenario}>
<ToggleButton.Button name="label" label="Label"> <ToggleButton.Button name="label" label="Label">
<ToggleButton.ButtonText>Label</ToggleButton.ButtonText> <ToggleButton.ButtonText>Label</ToggleButton.ButtonText>
</ToggleButton.Button> </ToggleButton.Button>
<ToggleButton.Button name="block" label="Block"> <ToggleButton.Button name="block" label="Block">
<ToggleButton.ButtonText>Block</ToggleButton.ButtonText> <ToggleButton.ButtonText>Block</ToggleButton.ButtonText>
</ToggleButton.Button> </ToggleButton.Button>
<ToggleButton.Button name="mute" label="Mute"> <ToggleButton.Button name="mute" label="Mute">
<ToggleButton.ButtonText>Mute</ToggleButton.ButtonText> <ToggleButton.ButtonText>Mute</ToggleButton.ButtonText>
</ToggleButton.Button> </ToggleButton.Button>
</ToggleButton.Group> </ToggleButton.Group>
{scenario[0] === 'label' && ( {scenario[0] === 'label' && (
<> <>
<View <View
style={[ style={[
a.border, a.border,
a.rounded_sm, a.rounded_sm,
a.mt_lg, a.mt_lg,
a.mb_lg, a.mb_lg,
a.p_lg, a.p_lg,
t.atoms.border_contrast_medium, t.atoms.border_contrast_medium,
]}> ]}>
<Toggle.Group
label="Toggle"
type="radio"
values={label}
onChange={setLabel}>
<View style={[a.flex_row, a.gap_md, a.flex_wrap]}>
{LABEL_VALUES.map(labelValue => {
let targetFixed = target[0]
if (
targetFixed !== 'account' &&
targetFixed !== 'profile'
) {
targetFixed = 'content'
}
const disabled =
isSelfLabel &&
LABELS[labelValue].flags.includes('no-self')
return (
<Toggle.Item
key={labelValue}
name={labelValue}
label={labelStrings[labelValue].name}
disabled={disabled}
style={disabled ? {opacity: 0.5} : undefined}>
<Toggle.Radio />
<Toggle.LabelText>{labelValue}</Toggle.LabelText>
</Toggle.Item>
)
})}
<Toggle.Item
name="custom"
label="Custom label"
disabled={isSelfLabel}
style={isSelfLabel ? {opacity: 0.5} : undefined}>
<Toggle.Radio />
<Toggle.LabelText>Custom label</Toggle.LabelText>
</Toggle.Item>
</View>
</Toggle.Group>
{label[0] === 'custom' ? (
<CustomLabelForm
def={customLabelDef}
setDef={setCustomLabelDef}
/>
) : (
<>
<View style={{height: 10}} />
<Divider />
</>
)}
<View style={{height: 10}} />
<SmallToggler label="Advanced">
<Toggle.Group <Toggle.Group
label="Toggle" label="Toggle"
type="checkbox" type="radio"
values={scenarioSwitches} values={label}
onChange={setScenarioSwitches}> onChange={setLabel}>
<View <View style={[a.flex_row, a.gap_md, a.flex_wrap]}>
style={[a.gap_md, a.flex_row, a.flex_wrap, a.pt_md]}> {LABEL_VALUES.map(labelValue => {
<Toggle.Item name="targetMe" label="Target is me"> let targetFixed = target[0]
<Toggle.Checkbox /> if (
<Toggle.LabelText>Target is me</Toggle.LabelText> targetFixed !== 'account' &&
</Toggle.Item> targetFixed !== 'profile'
<Toggle.Item name="following" label="Following target"> ) {
<Toggle.Checkbox /> targetFixed = 'content'
<Toggle.LabelText>Following target</Toggle.LabelText> }
</Toggle.Item> const disabled =
<Toggle.Item name="selfLabel" label="Self label"> isSelfLabel &&
<Toggle.Checkbox /> LABELS[labelValue].flags.includes('no-self')
<Toggle.LabelText>Self label</Toggle.LabelText> return (
</Toggle.Item> <Toggle.Item
<Toggle.Item name="noAdult" label="Adult disabled"> key={labelValue}
<Toggle.Checkbox /> name={labelValue}
<Toggle.LabelText>Adult disabled</Toggle.LabelText> label={labelStrings[labelValue].name}
</Toggle.Item> disabled={disabled}
<Toggle.Item name="loggedOut" label="Signed out"> style={disabled ? {opacity: 0.5} : undefined}>
<Toggle.Checkbox /> <Toggle.Radio />
<Toggle.LabelText>Signed out</Toggle.LabelText> <Toggle.LabelText>{labelValue}</Toggle.LabelText>
</Toggle.Item>
)
})}
<Toggle.Item
name="custom"
label="Custom label"
disabled={isSelfLabel}
style={isSelfLabel ? {opacity: 0.5} : undefined}>
<Toggle.Radio />
<Toggle.LabelText>Custom label</Toggle.LabelText>
</Toggle.Item> </Toggle.Item>
</View> </View>
</Toggle.Group> </Toggle.Group>
{LABELS[label[0] as keyof typeof LABELS]?.configurable !== {label[0] === 'custom' ? (
false && ( <CustomLabelForm
<View style={[a.mt_md]}> def={customLabelDef}
<Text setDef={setCustomLabelDef}
style={[ />
a.font_semi_bold, ) : (
a.text_xs, <>
t.atoms.text, <View style={{height: 10}} />
a.pb_sm, <Divider />
]}> </>
Preference )}
</Text>
<Toggle.Group <View style={{height: 10}} />
label="Preference"
type="radio" <SmallToggler label="Advanced">
values={visibility} <Toggle.Group
onChange={setVisiblity}> label="Toggle"
<View type="checkbox"
values={scenarioSwitches}
onChange={setScenarioSwitches}>
<View
style={[a.gap_md, a.flex_row, a.flex_wrap, a.pt_md]}>
<Toggle.Item name="targetMe" label="Target is me">
<Toggle.Checkbox />
<Toggle.LabelText>Target is me</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item
name="following"
label="Following target">
<Toggle.Checkbox />
<Toggle.LabelText>
Following target
</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="selfLabel" label="Self label">
<Toggle.Checkbox />
<Toggle.LabelText>Self label</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="noAdult" label="Adult disabled">
<Toggle.Checkbox />
<Toggle.LabelText>Adult disabled</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="loggedOut" label="Signed out">
<Toggle.Checkbox />
<Toggle.LabelText>Signed out</Toggle.LabelText>
</Toggle.Item>
</View>
</Toggle.Group>
{LABELS[label[0] as keyof typeof LABELS]?.configurable !==
false && (
<View style={[a.mt_md]}>
<Text
style={[ style={[
a.flex_row, a.font_semi_bold,
a.gap_md, a.text_xs,
a.flex_wrap, t.atoms.text,
a.align_center, a.pb_sm,
]}> ]}>
<Toggle.Item name="hide" label="Hide"> Preference
</Text>
<Toggle.Group
label="Preference"
type="radio"
values={visibility}
onChange={setVisiblity}>
<View
style={[
a.flex_row,
a.gap_md,
a.flex_wrap,
a.align_center,
]}>
<Toggle.Item name="hide" label="Hide">
<Toggle.Radio />
<Toggle.LabelText>Hide</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="warn" label="Warn">
<Toggle.Radio />
<Toggle.LabelText>Warn</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="ignore" label="Ignore">
<Toggle.Radio />
<Toggle.LabelText>Ignore</Toggle.LabelText>
</Toggle.Item>
</View>
</Toggle.Group>
</View>
)}
</SmallToggler>
</View>
<View style={[a.flex_row, a.flex_wrap, a.gap_md]}>
<View>
<Text
style={[
a.font_semi_bold,
a.text_xs,
t.atoms.text,
a.pl_md,
a.pb_xs,
]}>
Target
</Text>
<View
style={[
a.border,
a.rounded_full,
a.px_md,
a.py_sm,
t.atoms.border_contrast_medium,
t.atoms.bg,
]}>
<Toggle.Group
label="Target"
type="radio"
values={target}
onChange={setTarget}>
<View style={[a.flex_row, a.gap_md, a.flex_wrap]}>
<Toggle.Item name="account" label="Account">
<Toggle.Radio /> <Toggle.Radio />
<Toggle.LabelText>Hide</Toggle.LabelText> <Toggle.LabelText>Account</Toggle.LabelText>
</Toggle.Item> </Toggle.Item>
<Toggle.Item name="warn" label="Warn"> <Toggle.Item name="profile" label="Profile">
<Toggle.Radio /> <Toggle.Radio />
<Toggle.LabelText>Warn</Toggle.LabelText> <Toggle.LabelText>Profile</Toggle.LabelText>
</Toggle.Item> </Toggle.Item>
<Toggle.Item name="ignore" label="Ignore"> <Toggle.Item name="post" label="Post">
<Toggle.Radio /> <Toggle.Radio />
<Toggle.LabelText>Ignore</Toggle.LabelText> <Toggle.LabelText>Post</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="embed" label="Embed">
<Toggle.Radio />
<Toggle.LabelText>Embed</Toggle.LabelText>
</Toggle.Item> </Toggle.Item>
</View> </View>
</Toggle.Group> </Toggle.Group>
</View> </View>
)}
</SmallToggler>
</View>
<View style={[a.flex_row, a.flex_wrap, a.gap_md]}>
<View>
<Text
style={[
a.font_semi_bold,
a.text_xs,
t.atoms.text,
a.pl_md,
a.pb_xs,
]}>
Target
</Text>
<View
style={[
a.border,
a.rounded_full,
a.px_md,
a.py_sm,
t.atoms.border_contrast_medium,
t.atoms.bg,
]}>
<Toggle.Group
label="Target"
type="radio"
values={target}
onChange={setTarget}>
<View style={[a.flex_row, a.gap_md, a.flex_wrap]}>
<Toggle.Item name="account" label="Account">
<Toggle.Radio />
<Toggle.LabelText>Account</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="profile" label="Profile">
<Toggle.Radio />
<Toggle.LabelText>Profile</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="post" label="Post">
<Toggle.Radio />
<Toggle.LabelText>Post</Toggle.LabelText>
</Toggle.Item>
<Toggle.Item name="embed" label="Embed">
<Toggle.Radio />
<Toggle.LabelText>Embed</Toggle.LabelText>
</Toggle.Item>
</View>
</Toggle.Group>
</View> </View>
</View> </View>
</View>
</>
)}
<Spacer />
<Heading title="" subtitle="Results" />
<ToggleButton.Group
label="Results"
values={view}
onChange={setView}>
<ToggleButton.Button name="post" label="Post">
<ToggleButton.ButtonText>Post</ToggleButton.ButtonText>
</ToggleButton.Button>
<ToggleButton.Button name="notifications" label="Notifications">
<ToggleButton.ButtonText>Notifications</ToggleButton.ButtonText>
</ToggleButton.Button>
<ToggleButton.Button name="account" label="Account">
<ToggleButton.ButtonText>Account</ToggleButton.ButtonText>
</ToggleButton.Button>
<ToggleButton.Button name="data" label="Data">
<ToggleButton.ButtonText>Data</ToggleButton.ButtonText>
</ToggleButton.Button>
</ToggleButton.Group>
<View
style={[
a.border,
a.rounded_sm,
a.mt_lg,
a.p_md,
t.atoms.border_contrast_medium,
]}>
{view[0] === 'post' && (
<>
<Heading title="Post" subtitle="in feed" />
<MockPostFeedItem post={post} moderation={postModeration} />
<Heading title="Post" subtitle="viewed directly" />
<MockPostThreadItem post={post} moderationOpts={modOpts} />
<Heading title="Post" subtitle="reply in thread" />
<MockPostThreadItem
post={post}
moderationOpts={modOpts}
isReply
/>
</> </>
)} )}
{view[0] === 'notifications' && ( <Spacer />
<>
<Heading title="Notification" subtitle="quote or reply" />
<MockNotifItem notif={replyNotif} moderationOpts={modOpts} />
<View style={{height: 20}} />
<Heading title="Notification" subtitle="follow or like" />
<MockNotifItem notif={followNotif} moderationOpts={modOpts} />
</>
)}
{view[0] === 'account' && ( <Heading title="" subtitle="Results" />
<>
<Heading title="Account" subtitle="in listing" />
<MockAccountCard
profile={profile}
moderation={profileModeration}
/>
<Heading title="Account" subtitle="viewing directly" /> <ToggleButton.Group
<MockAccountScreen label="Results"
profile={profile} values={view}
moderation={profileModeration} onChange={setView}>
moderationOpts={modOpts} <ToggleButton.Button name="post" label="Post">
/> <ToggleButton.ButtonText>Post</ToggleButton.ButtonText>
</> </ToggleButton.Button>
)} <ToggleButton.Button name="notifications" label="Notifications">
<ToggleButton.ButtonText>
Notifications
</ToggleButton.ButtonText>
</ToggleButton.Button>
<ToggleButton.Button name="account" label="Account">
<ToggleButton.ButtonText>Account</ToggleButton.ButtonText>
</ToggleButton.Button>
<ToggleButton.Button name="data" label="Data">
<ToggleButton.ButtonText>Data</ToggleButton.ButtonText>
</ToggleButton.Button>
</ToggleButton.Group>
{view[0] === 'data' && ( <View
<> style={[
<ModerationUIView a.border,
label="Profile Moderation UI" a.rounded_sm,
mod={profileModeration} a.mt_lg,
/> a.p_md,
<ModerationUIView t.atoms.border_contrast_medium,
label="Post Moderation UI" ]}>
mod={postModeration} {view[0] === 'post' && (
/> <>
<DataView <Heading title="Post" subtitle="in feed" />
label={label[0]} <MockPostFeedItem post={post} moderation={postModeration} />
data={LABELS[label[0] as keyof typeof LABELS]}
/>
<DataView
label="Profile Moderation Data"
data={profileModeration}
/>
<DataView
label="Post Moderation Data"
data={postModeration}
/>
</>
)}
</View>
<View style={{height: 400}} /> <Heading title="Post" subtitle="viewed directly" />
</CenteredView> <MockPostThreadItem post={post} moderationOpts={modOpts} />
</ScrollView>
</moderationOptsOverrideContext.Provider> <Heading title="Post" subtitle="reply in thread" />
<MockPostThreadItem
post={post}
moderationOpts={modOpts}
isReply
/>
</>
)}
{view[0] === 'notifications' && (
<>
<Heading title="Notification" subtitle="quote or reply" />
<MockNotifItem
notif={replyNotif}
moderationOpts={modOpts}
/>
<View style={{height: 20}} />
<Heading title="Notification" subtitle="follow or like" />
<MockNotifItem
notif={followNotif}
moderationOpts={modOpts}
/>
</>
)}
{view[0] === 'account' && (
<>
<Heading title="Account" subtitle="in listing" />
<MockAccountCard
profile={profile}
moderation={profileModeration}
/>
<Heading title="Account" subtitle="viewing directly" />
<MockAccountScreen
profile={profile}
moderation={profileModeration}
moderationOpts={modOpts}
/>
</>
)}
{view[0] === 'data' && (
<>
<ModerationUIView
label="Profile Moderation UI"
mod={profileModeration}
/>
<ModerationUIView
label="Post Moderation UI"
mod={postModeration}
/>
<DataView
label={label[0]}
data={LABELS[label[0] as keyof typeof LABELS]}
/>
<DataView
label="Profile Moderation Data"
data={profileModeration}
/>
<DataView
label="Post Moderation Data"
data={postModeration}
/>
</>
)}
</View>
<View style={{height: 400}} />
</CenteredView>
</ScrollView>
</moderationOptsOverrideContext.Provider>
</PagerHeaderProvider>
</Layout.Screen> </Layout.Screen>
) )
} }
@@ -760,7 +778,7 @@ function SmallToggler({
) )
} }
function DataView({label, data}: {label: string; data: any}) { function DataView({label, data}: {label: string; data: unknown}) {
return ( return (
<Toggler label={label}> <Toggler label={label}>
<Text style={[{fontFamily: 'monospace'}, a.p_md]}> <Text style={[{fontFamily: 'monospace'}, a.p_md]}>