import { HeaderRight } from '@components/Header' import { ParseEmojis, ParseHTML } from '@components/Parse' import { Feather } from '@expo/vector-icons' import { useNavigation } from '@react-navigation/native' 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 { Image, KeyboardAvoidingView, Pressable, SectionList, StyleSheet, Text, TextInput, View } from 'react-native' import { Chase } from 'react-native-animated-spinkit' import { SafeAreaView } from 'react-native-safe-area-context' 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 } ) 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 }) => { switch (section.title) { case 'accounts': return ( { navigation.goBack() navigation.push('Screen-Shared-Account', { account: item }) }} > @{item.acct} ) case 'hashtags': return ( { navigation.goBack() navigation.push('Screen-Shared-Hashtag', { hashtag: item.name }) }} > #{item.name} ) case 'statuses': return ( { navigation.goBack() navigation.push('Screen-Shared-Toot', { toot: item }) }} > @{item.account.acct} {item.content && ( )} ) default: return null } }, []) return ( setSearchTerm(text) } placeholder={'搜索些什么'} placeholderTextColor={theme.secondary} returnKeyType='go' /> navigation.goBack()} /> item + index} /> ) } const styles = StyleSheet.create({ base: { flex: 1, padding: StyleConstants.Spacing.Global.PagePadding, paddingTop: 0 }, searchBar: { padding: StyleConstants.Spacing.Global.PagePadding, paddingBottom: 0, flexDirection: 'row', alignItems: 'center' }, searchField: { flex: 1, flexDirection: 'row', alignItems: 'center', borderBottomWidth: 1.25 }, searchIcon: { marginLeft: StyleConstants.Spacing.S }, searchCancel: { paddingHorizontal: StyleConstants.Spacing.S, marginLeft: StyleConstants.Spacing.S }, textInput: { flex: 1, padding: StyleConstants.Spacing.S, ...StyleConstants.FontStyle.M, marginRight: StyleConstants.Spacing.S }, emptyBase: { marginTop: StyleConstants.Spacing.M, marginLeft: StyleConstants.Spacing.S + StyleConstants.Spacing.M + StyleConstants.Spacing.S }, 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, borderBottomWidth: StyleSheet.hairlineWidth }, 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 }, itemAccount: { flexDirection: 'row', alignItems: 'center' }, itemAccountAvatar: { alignSelf: 'flex-start', width: StyleConstants.Avatar.S, height: StyleConstants.Avatar.S, borderRadius: 6, marginRight: StyleConstants.Spacing.S }, itemAccountAcct: { marginTop: StyleConstants.Spacing.XS }, itemHashtag: { ...StyleConstants.FontStyle.M }, itemStatus: { marginTop: StyleConstants.Spacing.S } }) export default ScreenSharedSearch