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 hookSearch from '@utils/queryHooks/search' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' 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' export interface Props { searchTerm: string | undefined } const ScreenSharedSearch: React.FC = ({ searchTerm }) => { const navigation = useNavigation() const { theme } = useTheme() const { status, data, refetch } = hookSearch({ term: searchTerm, options: { 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] ) 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%' }, emptyBase: { marginVertical: 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