import ComponentAccount from '@components/Account' import ComponentHashtag from '@components/Hashtag' import ComponentSeparator from '@components/Separator' import TimelineDefault from '@components/Timeline/Default' import { useSearchQuery } from '@utils/queryHooks/search' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback, useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import { KeyboardAvoidingView, Platform, SectionList, StyleSheet, Text, View } from 'react-native' import { Circle } from 'react-native-animated-spinkit' import { SharedSearchProp } from './sharedScreens' const TabSharedSearch: React.FC = ({ route: { params: { text } } }) => { const { t } = useTranslation('sharedSearch') const { theme } = useTheme() const mapKeyToTranslations = { accounts: t('content.sections.accounts'), hashtags: t('content.sections.hashtags'), statuses: t('content.sections.statuses') } const { status, data } = useSearchQuery({ term: text, options: { enabled: text !== undefined, select: data => 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 } }) } }) 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, [text] ) 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 TabSharedSearch