import ComponentAccount from '@components/Account' import ComponentHashtag from '@components/Hashtag' import ComponentSeparator from '@components/Separator' import TimelineDefault from '@components/Timelines/Timeline/Default' import { useSearchQuery } 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 { Trans, useTranslation } from 'react-i18next' import { KeyboardAvoidingView, Platform, 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 { t } = useTranslation('sharedSearch') const { theme } = useTheme() const { status, data, refetch } = useSearchQuery({ term: searchTerm, options: { enabled: false } }) const [setctionData, setSectionData] = useState< { title: string; data: any }[] >([]) const mapKeyToTranslations = { accounts: t('content.sections.accounts'), hashtags: t('content.sections.hashtags'), statuses: t('content.sections.statuses') } useEffect( () => data && setSectionData( Object.keys(data as Mastodon.Results) .map(key => ({ title: key, // @ts-ignore translation: mapKeyToTranslations[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(() => { return ( {status === 'loading' ? ( ) : ( <> }} /> {t('content.empty.advanced.header')} @username@domain {' '} {t('content.empty.advanced.example.account')} #example {' '} {t('content.empty.advanced.example.hashtag')} URL {' '} {t('content.empty.advanced.example.statusLink')} URL {' '} {t('content.empty.advanced.example.accountLink')} )} ) }, [status]) const sectionHeader = useCallback( ({ section: { translation } }) => ( {translation} ), [] ) const sectionFooter = useCallback( ({ section: { data, translation } }) => !data.length ? ( }} /> ) : null, [searchTerm] ) const listItem = useCallback(({ item, section }) => { switch (section.title) { case 'accounts': return case 'hashtags': return 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' } }) export default ScreenSharedSearch