import React, {useCallback} from 'react' import { StyleSheet, TouchableWithoutFeedback, Keyboard, View, } from 'react-native' import {useFocusEffect} from '@react-navigation/native' import {withAuthRequired} from 'view/com/auth/withAuthRequired' import {FlatList, ScrollView} from 'view/com/util/Views' import { NativeStackScreenProps, SearchTabNavigatorParams, } from 'lib/routes/types' import {observer} from 'mobx-react-lite' import {Text} from 'view/com/util/text/Text' import {useStores} from 'state/index' import {UserAutocompleteModel} from 'state/models/discovery/user-autocomplete' import {SearchUIModel} from 'state/models/ui/search' import {FoafsModel} from 'state/models/discovery/foafs' import {SuggestedActorsModel} from 'state/models/discovery/suggested-actors' import {HeaderWithInput} from 'view/com/search/HeaderWithInput' import {Suggestions} from 'view/com/search/Suggestions' import {SearchResults} from 'view/com/search/SearchResults' import {s} from 'lib/styles' import {ProfileCard} from 'view/com/profile/ProfileCard' import {usePalette} from 'lib/hooks/usePalette' import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' import {isAndroid, isIOS} from 'platform/detection' type Props = NativeStackScreenProps export const SearchScreen = withAuthRequired( observer(({}: Props) => { const pal = usePalette('default') const store = useStores() const scrollViewRef = React.useRef(null) const flatListRef = React.useRef(null) const [onMainScroll] = useOnMainScroll(store) const [isInputFocused, setIsInputFocused] = React.useState(false) const [query, setQuery] = React.useState('') const autocompleteView = React.useMemo( () => new UserAutocompleteModel(store), [store], ) const foafs = React.useMemo( () => new FoafsModel(store), [store], ) const suggestedActors = React.useMemo( () => new SuggestedActorsModel(store), [store], ) const [searchUIModel, setSearchUIModel] = React.useState< SearchUIModel | undefined >() const onChangeQuery = React.useCallback( (text: string) => { setQuery(text) if (text.length > 0) { autocompleteView.setActive(true) autocompleteView.setPrefix(text) } else { autocompleteView.setActive(false) } }, [setQuery, autocompleteView], ) const onPressClearQuery = React.useCallback(() => { setQuery('') }, [setQuery]) const onPressCancelSearch = React.useCallback(() => { setQuery('') autocompleteView.setActive(false) setSearchUIModel(undefined) store.shell.setIsDrawerSwipeDisabled(false) }, [setQuery, autocompleteView, store]) const onSubmitQuery = React.useCallback(() => { if (query.length === 0) { return } const model = new SearchUIModel(store) model.fetch(query) setSearchUIModel(model) store.shell.setIsDrawerSwipeDisabled(true) }, [query, setSearchUIModel, store]) const onSoftReset = React.useCallback(() => { scrollViewRef.current?.scrollTo({x: 0, y: 0}) flatListRef.current?.scrollToOffset({offset: 0}) onPressCancelSearch() }, [scrollViewRef, flatListRef, onPressCancelSearch]) useFocusEffect( React.useCallback(() => { const softResetSub = store.onScreenSoftReset(onSoftReset) const cleanup = () => { softResetSub.remove() } store.shell.setMinimalShellMode(false) autocompleteView.setup() if (!foafs.hasData) { foafs.fetch() } if (!suggestedActors.hasLoaded) { suggestedActors.loadMore(true) } return cleanup }, [store, autocompleteView, foafs, suggestedActors, onSoftReset]), ) const onPress = useCallback(() => { if (isIOS || isAndroid) { Keyboard.dismiss() } }, []) return ( {searchUIModel ? ( ) : !isInputFocused && !query ? ( ) : ( {query && autocompleteView.searchRes.length ? ( <> {autocompleteView.searchRes.map((profile, index) => ( ))} ) : query && !autocompleteView.searchRes.length ? ( No results found for {autocompleteView.prefix} ) : isInputFocused ? ( Search for users and posts on the network ) : null} )} ) }), ) const styles = StyleSheet.create({ container: { flex: 1, }, searchPrompt: { textAlign: 'center', paddingTop: 10, }, })