···5import {useLingui} from '@lingui/react'
6import {useFocusEffect} from '@react-navigation/native'
78-import {getLabelingServiceTitle} from '#/lib/moderation'
9import {
10 type CommonNavigatorParams,
11 type NativeStackScreenProps,
12} from '#/lib/routes/types'
13import {logger} from '#/logger'
14import {useIsBirthdateUpdateAllowed} from '#/state/birthdate'
015import {
16 useMyLabelersQuery,
17 usePreferencesQuery,
···21import {isNonConfigurableModerationAuthority} from '#/state/session/additional-moderation-authorities'
22import {useSetMinimalShellMode} from '#/state/shell'
23import {atoms as a, useBreakpoints, useTheme, type ViewStyleProp} from '#/alf'
24-import {Admonition} from '#/components/Admonition'
25import {AgeAssuranceAdmonition} from '#/components/ageAssurance/AgeAssuranceAdmonition'
26import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy'
27-import {Button} from '#/components/Button'
28import {useGlobalDialogsControlContext} from '#/components/dialogs/Context'
29import {Divider} from '#/components/Divider'
30import * as Toggle from '#/components/forms/Toggle'
···42import {ListMaybePlaceholder} from '#/components/Lists'
43import {Loader} from '#/components/Loader'
44import {GlobalLabelPreference} from '#/components/moderation/LabelPreference'
045import {Text} from '#/components/Typography'
46import {useAgeAssurance} from '#/ageAssurance'
47import {IS_IOS} from '#/env'
···166 data: labelers,
167 error: labelersError,
168 } = useMyLabelersQuery()
00169 const aa = useAgeAssurance()
170 const isBirthdateUpdateAllowed = useIsBirthdateUpdateAllowed()
171 const aaCopy = useAgeAssuranceCopy()
1720000000000000000000000173 useFocusEffect(
174 useCallback(() => {
175 setMinimalShellMode(false)
···209 <View style={[a.pt_2xl, a.px_lg, gtMobile && a.px_2xl]}>
210 {aa.flags.adultContentDisabled && isBirthdateUpdateAllowed && (
211 <View style={[a.pb_2xl]}>
212- <Admonition type="tip" style={[a.pb_md]}>
213 <Trans>
214 Your declared age is under 18. Some settings below may be
215 disabled. If this was a mistake, you may edit your birthdate in
···221 </InlineLinkText>
222 .
223 </Trans>
224- </Admonition>
225 </View>
226 )}
227···438 ]}>
439 <Trans>Advanced</Trans>
440 </Text>
0000000000000000000000000441442 {isLabelersLoading ? (
443 <View style={[a.w_full, a.align_center, a.p_lg]}>
···5import {useLingui} from '@lingui/react'
6import {useFocusEffect} from '@react-navigation/native'
78+import {getLabelingServiceTitle, isAppLabeler} from '#/lib/moderation'
9import {
10 type CommonNavigatorParams,
11 type NativeStackScreenProps,
12} from '#/lib/routes/types'
13import {logger} from '#/logger'
14import {useIsBirthdateUpdateAllowed} from '#/state/birthdate'
15+import {useRemoveLabelersMutation} from '#/state/queries/labeler'
16import {
17 useMyLabelersQuery,
18 usePreferencesQuery,
···22import {isNonConfigurableModerationAuthority} from '#/state/session/additional-moderation-authorities'
23import {useSetMinimalShellMode} from '#/state/shell'
24import {atoms as a, useBreakpoints, useTheme, type ViewStyleProp} from '#/alf'
25+import * as Admonition from '#/components/Admonition'
26import {AgeAssuranceAdmonition} from '#/components/ageAssurance/AgeAssuranceAdmonition'
27import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy'
28+import {Button, ButtonIcon, ButtonText} from '#/components/Button'
29import {useGlobalDialogsControlContext} from '#/components/dialogs/Context'
30import {Divider} from '#/components/Divider'
31import * as Toggle from '#/components/forms/Toggle'
···43import {ListMaybePlaceholder} from '#/components/Lists'
44import {Loader} from '#/components/Loader'
45import {GlobalLabelPreference} from '#/components/moderation/LabelPreference'
46+import * as Toast from '#/components/Toast'
47import {Text} from '#/components/Typography'
48import {useAgeAssurance} from '#/ageAssurance'
49import {IS_IOS} from '#/env'
···168 data: labelers,
169 error: labelersError,
170 } = useMyLabelersQuery()
171+ const {mutateAsync: removeLabelers, isPending: isRemovingLabelers} =
172+ useRemoveLabelersMutation()
173 const aa = useAgeAssurance()
174 const isBirthdateUpdateAllowed = useIsBirthdateUpdateAllowed()
175 const aaCopy = useAgeAssuranceCopy()
176177+ const subscribedDids = preferences.moderationPrefs.labelers.map(l => l.did)
178+ const returnedDids = new Set(labelers?.map(l => l.creator.did))
179+ const unavailableDids = subscribedDids.filter(
180+ did =>
181+ !returnedDids.has(did) &&
182+ !isAppLabeler(did) &&
183+ !isNonConfigurableModerationAuthority(did),
184+ )
185+186+ const handleCleanup = async () => {
187+ try {
188+ await removeLabelers({dids: unavailableDids})
189+ Toast.show(_(msg`Removed unavailable services`), {
190+ type: 'success',
191+ })
192+ } catch (e: any) {
193+ logger.error('Failed to remove unavailable labelers', {
194+ safeMessage: e.message,
195+ })
196+ }
197+ }
198+199 useFocusEffect(
200 useCallback(() => {
201 setMinimalShellMode(false)
···235 <View style={[a.pt_2xl, a.px_lg, gtMobile && a.px_2xl]}>
236 {aa.flags.adultContentDisabled && isBirthdateUpdateAllowed && (
237 <View style={[a.pb_2xl]}>
238+ <Admonition.Admonition type="tip" style={[a.pb_md]}>
239 <Trans>
240 Your declared age is under 18. Some settings below may be
241 disabled. If this was a mistake, you may edit your birthdate in
···247 </InlineLinkText>
248 .
249 </Trans>
250+ </Admonition.Admonition>
251 </View>
252 )}
253···464 ]}>
465 <Trans>Advanced</Trans>
466 </Text>
467+468+ {unavailableDids.length > 0 && (
469+ <Admonition.Outer type="tip" style={[a.mb_md]}>
470+ <Admonition.Row>
471+ <Admonition.Icon />
472+ <Admonition.Content>
473+ <Admonition.Text>
474+ <Trans>
475+ Some moderation services in your list are no longer available.
476+ </Trans>
477+ </Admonition.Text>
478+ </Admonition.Content>
479+ <Admonition.Button
480+ color="primary_subtle"
481+ label={_(msg`Remove unavailable moderation services`)}
482+ onPress={handleCleanup}
483+ disabled={isRemovingLabelers}>
484+ <ButtonText>
485+ <Trans>Remove</Trans>
486+ </ButtonText>
487+ {isRemovingLabelers && <ButtonIcon icon={Loader} />}
488+ </Admonition.Button>
489+ </Admonition.Row>
490+ </Admonition.Outer>
491+ )}
492493 {isLabelersLoading ? (
494 <View style={[a.w_full, a.align_center, a.p_lg]}>