Clean up Mod screen

This commit is contained in:
Eric Bailey
2024-02-15 11:57:27 -06:00
parent 6e4ae28a2b
commit 90662d6cc3
2 changed files with 32 additions and 83 deletions
+30 -83
View File
@@ -40,9 +40,9 @@ import {useLabelGroupStrings} from '#/lib/moderation/useLabelGroupStrings'
import * as Dialog from '#/components/Dialog' import * as Dialog from '#/components/Dialog'
import {Button} from '#/components/Button' import {Button} from '#/components/Button'
import { import {
getLabelGroupsFromLabels,
getModerationServiceTitle, getModerationServiceTitle,
useConfigurableLabelGroups, useConfigurableLabelGroups,
getLabelGroupToLabelerMap,
} from '#/lib/moderation' } from '#/lib/moderation'
import { import {
@@ -91,9 +91,19 @@ export function ModerationScreen(
error: preferencesError, error: preferencesError,
data: preferences, data: preferences,
} = usePreferencesQuery() } = usePreferencesQuery()
const {
isLoading: isModServicesLoading,
data: modservices,
error: modservicesError,
} = useModServicesDetailedInfoQuery({
dids: preferences ? preferences.moderationOpts.mods.map(m => m.did) : [],
})
const {gtMobile} = useBreakpoints() const {gtMobile} = useBreakpoints()
const {height} = useSafeAreaFrame() const {height} = useSafeAreaFrame()
const isLoading = isPreferencesLoading || isModServicesLoading
const error = preferencesError || modservicesError
return ( return (
<CenteredView <CenteredView
testID="moderationScreen" testID="moderationScreen"
@@ -106,11 +116,11 @@ export function ModerationScreen(
]}> ]}>
<ViewHeader title={_(msg`Moderation`)} showOnDesktop /> <ViewHeader title={_(msg`Moderation`)} showOnDesktop />
{isPreferencesLoading ? ( {isLoading ? (
<View style={[a.w_full, a.align_center, a.pt_2xl]}> <View style={[a.w_full, a.align_center, a.pt_2xl]}>
<Loader size="xl" fill={t.atoms.text.color} /> <Loader size="xl" fill={t.atoms.text.color} />
</View> </View>
) : preferencesError || !preferences ? ( ) : error || !(preferences && modservices) ? (
<ErrorState <ErrorState
error={ error={
preferencesError?.toString() || preferencesError?.toString() ||
@@ -118,46 +128,15 @@ export function ModerationScreen(
} }
/> />
) : ( ) : (
<ModerationScreenIntermediate preferences={preferences} /> <ModerationScreenInner
preferences={preferences}
modservices={modservices}
/>
)} )}
</CenteredView> </CenteredView>
) )
} }
function ModerationScreenIntermediate({
preferences,
}: {
preferences: UsePreferencesQueryResponse
}) {
const t = useTheme()
const {_} = useLingui()
const {
isLoading: isModServicesLoading,
data: modservices,
error: modservicesError,
} = useModServicesDetailedInfoQuery({
dids: preferences.moderationOpts.mods.map(m => m.did),
})
return isModServicesLoading ? (
<View style={[a.w_full, a.align_center, a.pt_2xl]}>
<Loader size="xl" fill={t.atoms.text.color} />
</View>
) : modservicesError || !modservices ? (
<ErrorState
error={
modservicesError?.toString() ||
_(msg`Something went wrong, please try again.`)
}
/>
) : (
<ModerationScreenInner
preferences={preferences}
modservices={modservices}
/>
)
}
export function ModerationScreenInner({ export function ModerationScreenInner({
preferences, preferences,
modservices, modservices,
@@ -169,15 +148,17 @@ export function ModerationScreenInner({
const setMinimalShellMode = useSetMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode()
const {screen} = useAnalytics() const {screen} = useAnalytics()
const {gtTablet} = useBreakpoints() const {gtTablet} = useBreakpoints()
const labelGroupStrings = useLabelGroupStrings()
const modSettingsDialogControl = Dialog.useDialogControl() const modSettingsDialogControl = Dialog.useDialogControl()
const [settingsDialogProps, setSettingsDialogProps] = const [settingsDialogProps, setSettingsDialogProps] =
React.useState<SettingsDialogProps>({ React.useState<SettingsDialogProps>({
// @ts-ignore // prefill with valid value to appease TS
labelGroup: '', labelGroup: 'intolerance',
modservices: [], modservices: [],
}) })
const groups = useConfigurableLabelGroups()
const labelGroupToLabelerMap = React.useMemo(() => {
return getLabelGroupToLabelerMap(modservices)
}, [modservices])
useFocusEffect( useFocusEffect(
React.useCallback(() => { React.useCallback(() => {
@@ -186,34 +167,6 @@ export function ModerationScreenInner({
}, [screen, setMinimalShellMode]), }, [screen, setMinimalShellMode]),
) )
const groups = useConfigurableLabelGroups()
const didToModServiceMap = React.useMemo<
Record<string, AppBskyModerationDefs.ModServiceViewDetailed>
>(() => {
return modservices.reduce((acc, modservice) => {
return {
...acc,
[modservice.creator.did]: modservice,
}
}, {})
}, [modservices])
const labelGroupToModServiceMap = React.useMemo(() => {
const groups: Partial<Record<LabelGroupDefinition['id'], string[]>> = {}
for (const modservice of modservices) {
const labelGroups = getLabelGroupsFromLabels(
modservice.policies.labelValues,
)
for (const group of labelGroups) {
const g = (groups[group.id] = groups[group.id] || [])
g.push(modservice.creator.did)
}
}
return groups
}, [modservices])
const openModSettingsDialog = React.useCallback( const openModSettingsDialog = React.useCallback(
({labelGroup, modservices}: Omit<SettingsDialogProps, 'onComplete'>) => { ({labelGroup, modservices}: Omit<SettingsDialogProps, 'onComplete'>) => {
setSettingsDialogProps({ setSettingsDialogProps({
@@ -304,19 +257,15 @@ export function ModerationScreenInner({
</Text> </Text>
{groups.map((def, i) => { {groups.map((def, i) => {
const groupStrings = labelGroupStrings[def.id] const labelers = labelGroupToLabelerMap[def.id] || []
const modDids = labelGroupToModServiceMap[def.id] || []
const mods = modDids.map(did => didToModServiceMap[did])
return ( return (
<React.Fragment key={def.id}> <React.Fragment key={def.id}>
{i !== 0 && <Divider />} {i !== 0 && <Divider />}
<LabelGroup <LabelGroup
name={groupStrings.name}
description={groupStrings.description}
labelers={mods}
openModSettingsDialog={openModSettingsDialog}
preferences={preferences}
labelGroup={def.id} labelGroup={def.id}
labelers={labelers}
preferences={preferences}
openModSettingsDialog={openModSettingsDialog}
/> />
</React.Fragment> </React.Fragment>
) )
@@ -338,21 +287,18 @@ export function ModerationScreenInner({
function LabelGroup({ function LabelGroup({
labelGroup, labelGroup,
name,
description,
labelers: mods, labelers: mods,
preferences, preferences,
openModSettingsDialog, openModSettingsDialog,
}: { }: {
labelGroup: LabelGroupDefinition['id'] labelGroup: LabelGroupDefinition['id']
name: string
description: string
labelers: AppBskyModerationDefs.ModServiceViewDetailed[] labelers: AppBskyModerationDefs.ModServiceViewDetailed[]
preferences: UsePreferencesQueryResponse preferences: UsePreferencesQueryResponse
openModSettingsDialog: (props: SettingsDialogProps) => void openModSettingsDialog: (props: SettingsDialogProps) => void
}) { }) {
const t = useTheme() const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
const labelGroupStrings = useLabelGroupStrings()
const {mutateAsync: setContentLabelPref, variables: optimisticContentLabel} = const {mutateAsync: setContentLabelPref, variables: optimisticContentLabel} =
useSetContentLabelMutation() useSetContentLabelMutation()
@@ -364,16 +310,17 @@ function LabelGroup({
visibility: values[0] as LabelPreference, visibility: values[0] as LabelPreference,
}) })
} catch (e) { } catch (e) {
// TODO
console.error(e) console.error(e)
} }
}, },
[labelGroup, setContentLabelPref], [labelGroup, setContentLabelPref],
) )
const {name, description} = labelGroupStrings[labelGroup]
const value = const value =
optimisticContentLabel?.visibility ?? optimisticContentLabel?.visibility ??
preferences.moderationOpts.labelGroups[labelGroup] preferences.moderationOpts.labelGroups[labelGroup]
const labelOptions = { const labelOptions = {
hide: _(msg`Hide`), hide: _(msg`Hide`),
warn: _(msg`Warn`), warn: _(msg`Warn`),
+2
View File
@@ -17,6 +17,7 @@ export const modServicesDetailedInfoQueryKey = (dids: string[]) => [
export function useModServiceInfoQuery({did}: {did: string}) { export function useModServiceInfoQuery({did}: {did: string}) {
return useQuery({ return useQuery({
enabled: !!did,
queryKey: modServiceInfoQueryKey(did), queryKey: modServiceInfoQueryKey(did),
queryFn: async () => { queryFn: async () => {
const res = await getAgent().app.bsky.moderation.getService({did}) const res = await getAgent().app.bsky.moderation.getService({did})
@@ -38,6 +39,7 @@ export function useModServicesInfoQuery({dids}: {dids: string[]}) {
export function useModServicesDetailedInfoQuery({dids}: {dids: string[]}) { export function useModServicesDetailedInfoQuery({dids}: {dids: string[]}) {
return useQuery({ return useQuery({
enabled: !!dids.length,
queryKey: modServicesDetailedInfoQueryKey(dids), queryKey: modServicesDetailedInfoQueryKey(dids),
queryFn: async () => { queryFn: async () => {
const views: AppBskyModerationDefs.ModServiceViewDetailed[] = [] const views: AppBskyModerationDefs.ModServiceViewDetailed[] = []