animate search

This commit is contained in:
Samuel Newman
2024-10-22 12:19:20 +03:00
parent 090ac041c3
commit ddf1eebfe7
+29 -5
View File
@@ -12,6 +12,14 @@ import {
} from 'react-native' } from 'react-native'
import {ScrollView as RNGHScrollView} from 'react-native-gesture-handler' import {ScrollView as RNGHScrollView} from 'react-native-gesture-handler'
import RNPickerSelect from 'react-native-picker-select' import RNPickerSelect from 'react-native-picker-select'
import Animated, {
LayoutAnimationConfig,
LinearTransition,
SlideInLeft,
SlideInRight,
SlideOutLeft,
SlideOutRight,
} from 'react-native-reanimated'
import {AppBskyActorDefs, AppBskyFeedDefs, moderateProfile} from '@atproto/api' import {AppBskyActorDefs, AppBskyFeedDefs, moderateProfile} from '@atproto/api'
import { import {
FontAwesomeIcon, FontAwesomeIcon,
@@ -63,6 +71,7 @@ import {atoms as a, useBreakpoints, useTheme as useThemeNew, web} from '#/alf'
import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {Button, ButtonIcon, ButtonText} from '#/components/Button'
import * as FeedCard from '#/components/FeedCard' import * as FeedCard from '#/components/FeedCard'
import {SearchInput} from '#/components/forms/SearchInput' import {SearchInput} from '#/components/forms/SearchInput'
import {useInteractionState} from '#/components/hooks/useInteractionState'
import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron' import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron'
import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu' import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu'
import * as Layout from '#/components/Layout' import * as Layout from '#/components/Layout'
@@ -844,7 +853,10 @@ export function SearchScreen(
[selectedProfiles], [selectedProfiles],
) )
const {state: isFocused, onIn: onFocus, onOut: onBlur} = useInteractionState()
const onSearchInputFocus = React.useCallback(() => { const onSearchInputFocus = React.useCallback(() => {
onFocus()
if (isWeb) { if (isWeb) {
// Prevent a jump on iPad by ensuring that // Prevent a jump on iPad by ensuring that
// the initial focused render has no result list. // the initial focused render has no result list.
@@ -854,7 +866,7 @@ export function SearchScreen(
} else { } else {
setShowAutocomplete(true) setShowAutocomplete(true)
} }
}, [setShowAutocomplete]) }, [setShowAutocomplete, onFocus])
return ( return (
<Layout.Screen testID="searchScreen"> <Layout.Screen testID="searchScreen">
@@ -872,32 +884,42 @@ export function SearchScreen(
}), }),
]} ]}
sideBorders={gtMobile}> sideBorders={gtMobile}>
<LayoutAnimationConfig skipEntering skipExiting>
<View style={[a.flex_row, a.gap_sm]}> <View style={[a.flex_row, a.gap_sm]}>
{!gtMobile && ( {!gtMobile && !isFocused && (
<Animated.View
layout={LinearTransition}
entering={SlideInLeft}
exiting={SlideOutLeft}>
<Button <Button
testID="viewHeaderBackOrMenuBtn" testID="viewHeaderBackOrMenuBtn"
onPress={onPressMenu} onPress={onPressMenu}
hitSlop={HITSLOP_10} hitSlop={HITSLOP_10}
label={_(msg`Menu`)} label={_(msg`Menu`)}
accessibilityHint={_(msg`Access navigation links and settings`)} accessibilityHint={_(
msg`Access navigation links and settings`,
)}
size="large" size="large"
variant="solid" variant="solid"
color="secondary" color="secondary"
shape="square"> shape="square">
<ButtonIcon icon={Menu} size="lg" /> <ButtonIcon icon={Menu} size="lg" />
</Button> </Button>
</Animated.View>
)} )}
<View style={[a.flex_1]}> <Animated.View style={[a.flex_1]} layout={LinearTransition}>
<SearchInput <SearchInput
ref={textInput} ref={textInput}
value={searchText} value={searchText}
onFocus={onSearchInputFocus} onFocus={onSearchInputFocus}
onBlur={onBlur}
onChangeText={onChangeText} onChangeText={onChangeText}
onClearText={onPressClearQuery} onClearText={onPressClearQuery}
onSubmitEditing={onSubmit} onSubmitEditing={onSubmit}
/> />
</View> </Animated.View>
{showAutocomplete && ( {showAutocomplete && (
<Animated.View entering={SlideInRight} exiting={SlideOutRight}>
<Button <Button
label={_(msg`Cancel search`)} label={_(msg`Cancel search`)}
size="large" size="large"
@@ -910,8 +932,10 @@ export function SearchScreen(
<Trans>Cancel</Trans> <Trans>Cancel</Trans>
</ButtonText> </ButtonText>
</Button> </Button>
</Animated.View>
)} )}
</View> </View>
</LayoutAnimationConfig>
{showFilters && ( {showFilters && (
<View <View