From 27d94626399fc05e7c507275cbf3354bfcea0f70 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 3 Feb 2026 18:03:36 +0200 Subject: [PATCH] Add animation to content hider (#9812) * add layout animation to contenthider * add layout animation to posthider --- src/components/moderation/ContentHider.tsx | 19 +++++++++++++------ src/components/moderation/PostHider.tsx | 18 ++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/components/moderation/ContentHider.tsx b/src/components/moderation/ContentHider.tsx index 6ba98ff4d7..67f6205b14 100644 --- a/src/components/moderation/ContentHider.tsx +++ b/src/components/moderation/ContentHider.tsx @@ -1,5 +1,10 @@ -import React from 'react' -import {type StyleProp, View, type ViewStyle} from 'react-native' +import {useMemo, useState} from 'react' +import { + LayoutAnimation, + type StyleProp, + View, + type ViewStyle, +} from 'react-native' import {type ModerationUI} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -64,16 +69,17 @@ function ContentHiderActive({ style, childContainerStyle, children, -}: React.PropsWithChildren<{ +}: { testID?: string modui: ModerationUI style?: StyleProp childContainerStyle?: StyleProp -}>) { + children?: React.ReactNode +}) { const t = useTheme() const {_} = useLingui() const {gtMobile} = useBreakpoints() - const [override, setOverride] = React.useState(false) + const [override, setOverride] = useState(false) const control = useModerationDetailsDialogControl() const {labelDefs} = useLabelDefinitions() const globalLabelStrings = useGlobalLabelStrings() @@ -81,7 +87,7 @@ function ContentHiderActive({ const blur = modui?.blurs[0] const desc = useModerationCauseDescription(blur) - const labelName = React.useMemo(() => { + const labelName = useMemo(() => { if (!modui?.blurs || !blur) { return undefined } @@ -150,6 +156,7 @@ function ContentHiderActive({ e.preventDefault() e.stopPropagation() if (!modui.noOverride) { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) setOverride(v => !v) } else { control.open() diff --git a/src/components/moderation/PostHider.tsx b/src/components/moderation/PostHider.tsx index 77910ec1a7..299b802597 100644 --- a/src/components/moderation/PostHider.tsx +++ b/src/components/moderation/PostHider.tsx @@ -1,5 +1,6 @@ -import React, {type ComponentProps} from 'react' +import {useCallback, useState} from 'react' import { + LayoutAnimation, Pressable, type StyleProp, StyleSheet, @@ -17,7 +18,7 @@ import {useQueryClient} from '@tanstack/react-query' import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription' import {addStyle} from '#/lib/styles' -import {precacheProfile} from '#/state/queries/profile' +import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache' // import {Link} from '#/components/Link' TODO this imposes some styles that screw things up import {Link} from '#/view/com/util/Link' import {atoms as a, useTheme} from '#/alf' @@ -27,7 +28,7 @@ import { } from '#/components/moderation/ModerationDetailsDialog' import {Text} from '#/components/Typography' -interface Props extends ComponentProps { +interface Props extends React.ComponentProps { disabled: boolean iconSize: number iconStyles: StyleProp @@ -54,15 +55,15 @@ export function PostHider({ const queryClient = useQueryClient() const t = useTheme() const {_} = useLingui() - const [override, setOverride] = React.useState(false) + const [override, setOverride] = useState(false) const control = useModerationDetailsDialogControl() const blur = modui.blurs[0] || (interpretFilterAsBlur ? getBlurrableFilter(modui) : undefined) const desc = useModerationCauseDescription(blur) - const onBeforePress = React.useCallback(() => { - precacheProfile(queryClient, profile) + const onBeforePress = useCallback(() => { + unstableCacheProfileView(queryClient, profile) }, [queryClient, profile]) if (!blur || (disabled && !modui.noOverride)) { @@ -83,14 +84,15 @@ export function PostHider({ { if (!modui.noOverride) { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) setOverride(v => !v) } }} accessibilityRole="button" - accessibilityHint={ + accessibilityLabel={ override ? _(msg`Hides the content`) : _(msg`Shows the content`) } - accessibilityLabel="" + accessibilityHint="" style={[ a.flex_row, a.align_center,