import React from 'react' import {View} from 'react-native' import { AppBskyLabelerDefs, ModerationOpts, interpretLabelValueDefinitions, InterpretedLabelValueDefinition, } from '@atproto/api' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useSafeAreaFrame} from 'react-native-safe-area-context' import {useScrollHandlers} from '#/lib/ScrollContext' import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {isLabelerSubscribed, lookupLabelValueDefinition} from '#/lib/moderation' import {ListRef} from '#/view/com/util/List' import {SectionRef} from './types' import {isNative} from '#/platform/detection' import {useTheme, atoms as a} from '#/alf' import {Text} from '#/components/Typography' import {Loader} from '#/components/Loader' import {Divider} from '#/components/Divider' import {CenteredView, ScrollView} from '#/view/com/util/Views' import {ErrorState} from '../ErrorState' import {ModerationLabelPref} from '#/components/moderation/ModerationLabelPref' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' interface LabelsSectionProps { isLabelerLoading: boolean labelerInfo: AppBskyLabelerDefs.LabelerViewDetailed | undefined labelerError: Error | null moderationOpts: ModerationOpts scrollElRef: ListRef headerHeight: number } export const ProfileLabelsSection = React.forwardRef< SectionRef, LabelsSectionProps >(function LabelsSectionImpl( { isLabelerLoading, labelerInfo, labelerError, moderationOpts, scrollElRef, headerHeight, }, ref, ) { const {_} = useLingui() const {height: minHeight} = useSafeAreaFrame() const onScrollToTop = React.useCallback(() => { // @ts-ignore TODO fix this scrollElRef.current?.scrollTo({ animated: isNative, x: 0, y: -headerHeight, }) }, [scrollElRef, headerHeight]) React.useImperativeHandle(ref, () => ({ scrollToTop: onScrollToTop, })) return ( {isLabelerLoading ? ( ) : labelerError || !labelerInfo ? ( ) : ( )} ) }) export function ProfileLabelsSectionInner({ moderationOpts, labelerInfo, scrollElRef, headerHeight, }: { moderationOpts: ModerationOpts labelerInfo: AppBskyLabelerDefs.LabelerViewDetailed scrollElRef: ListRef headerHeight: number }) { const t = useTheme() const contextScrollHandlers = useScrollHandlers() const scrollHandler = useAnimatedScrollHandler({ onBeginDrag(e, ctx) { contextScrollHandlers.onBeginDrag?.(e, ctx) }, onEndDrag(e, ctx) { contextScrollHandlers.onEndDrag?.(e, ctx) }, onScroll(e, ctx) { contextScrollHandlers.onScroll?.(e, ctx) }, }) const {labelValues} = labelerInfo.policies const isSubscribed = isLabelerSubscribed(labelerInfo, moderationOpts) const labelDefs = React.useMemo(() => { const customDefs = interpretLabelValueDefinitions(labelerInfo) return labelValues .map(val => lookupLabelValueDefinition(val, customDefs)) .filter( def => def && def?.configurable, ) as InterpretedLabelValueDefinition[] }, [labelerInfo, labelValues]) return ( Labels are annotations on users and content. They can be used to hide, warn, and categorize the network. {labelerInfo.creator.viewer?.blocking ? ( Blocking does not prevent this labeler from placing labels on your account. ) : null} {labelValues.length === 0 ? ( This labeler hasn't declared what labels it publishes, and may not be active. ) : !isSubscribed ? ( Subscribe to @{labelerInfo.creator.handle} to use these labels: ) : null} {labelDefs.length > 0 && ( {labelDefs.map((labelDef, i) => { return ( {i !== 0 && } ) })} )} ) }