import { useNavigation } from '@react-navigation/native' import ComponentAccount from '@root/components/Account' import ComponentSeparator from '@root/components/Separator' import TimelineDefault from '@root/components/Timelines/Timeline/Default' import { searchFetch } from '@utils/fetches/searchFetch' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { debounce } from 'lodash' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { KeyboardAvoidingView, Pressable, SectionList, StyleSheet, Text, View } from 'react-native' import { Chase } from 'react-native-animated-spinkit' import { TextInput } from 'react-native-gesture-handler' import { useQuery } from 'react-query' const ScreenSharedSearch: React.FC = () => { const navigation = useNavigation() const { theme } = useTheme() const [searchTerm, setSearchTerm] = useState() const { status, data, refetch } = useQuery( ['Search', { term: searchTerm }], searchFetch, { enabled: false } ) useEffect(() => { const updateHeaderRight = () => navigation.setOptions({ headerCenter: () => ( 搜索 setSearchTerm(text) } placeholder={'些什么'} placeholderTextColor={theme.secondary} returnKeyType='go' /> ) }) return updateHeaderRight() }, []) const [setctionData, setSectionData] = useState< { title: string; data: any }[] >([]) useEffect( () => data && setSectionData( Object.keys(data as Mastodon.Results) .map(key => ({ title: key, // @ts-ignore data: data[key] })) .sort((a, b) => { if (!a.data.length) { return 1 } else if (!b.data.length) { return -1 } else { return 0 } }) ), [data] ) const onChangeText = useCallback( debounce(text => setSearchTerm(text), 1000, { trailing: true }), [] ) useEffect(() => { if (searchTerm) { refetch() } else { setSectionData([]) } }, [searchTerm]) const listEmpty = useMemo( () => ( {status === 'loading' ? ( ) : ( <> 输入关键词搜索用户话题标签或者 嘟文 高级搜索格式 @username@domain {' '} 搜索用户 #example {' '}搜索话题标签 URL {' '}搜索指定嘟文 URL {' '}搜索指定用户 )} ), [status] ) const sectionHeader = useCallback( ({ section: { title } }) => ( {title} ), [] ) const sectionFooter = useCallback( ({ section: { data, title } }) => !data.length ? ( 找不到{' '} {searchTerm} {' '} 相关的{title} ) : null, [searchTerm] ) const listItem = useCallback(({ item, section, index }) => { switch (section.title) { case 'accounts': return case 'hashtags': return ( { navigation.goBack() navigation.push('Screen-Shared-Hashtag', { hashtag: item.name }) }} > #{item.name} ) case 'statuses': return default: return null } }, []) return ( item + index} SectionSeparatorComponent={ComponentSeparator} ItemSeparatorComponent={ComponentSeparator} /> ) } const styles = StyleSheet.create({ base: { minHeight: '100%' }, searchBar: { flexBasis: '80%', flexDirection: 'row', alignItems: 'center' }, textInput: { ...StyleConstants.FontStyle.M, paddingLeft: StyleConstants.Spacing.XS, marginBottom: (StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M) / 2 }, emptyBase: { marginVertical: StyleConstants.Spacing.Global.PagePadding, // paddingHorizontal: StyleConstants.Spacing.Global.PagePadding alignItems: 'center' }, loading: { flex: 1, alignItems: 'center' }, emptyFontSize: { ...StyleConstants.FontStyle.S }, emptyFontBold: { fontWeight: StyleConstants.Font.Weight.Bold }, emptyDefault: { marginBottom: StyleConstants.Spacing.L }, emptyAdvanced: { marginBottom: StyleConstants.Spacing.S }, sectionHeader: { padding: StyleConstants.Spacing.M }, sectionHeaderText: { ...StyleConstants.FontStyle.M, fontWeight: StyleConstants.Font.Weight.Bold, textAlign: 'center' }, sectionFooter: { padding: StyleConstants.Spacing.S }, sectionFooterText: { ...StyleConstants.FontStyle.S, textAlign: 'center' }, itemDefault: { padding: StyleConstants.Spacing.S * 1.5, borderBottomWidth: StyleSheet.hairlineWidth }, itemHashtag: { ...StyleConstants.FontStyle.M } }) export default ScreenSharedSearch