import GradientFlatList from '@app/components/GradientFlatList' import ListItem from '@app/components/ListItem' import { withSuspense } from '@app/components/withSuspense' import { useQuerySearchResults } from '@app/hooks/query' import { useSetQueue } from '@app/hooks/trackplayer' import { Album, Artist, Song } from '@app/models/library' import { Search3Params } from '@app/subsonic/params' import { useNavigation } from '@react-navigation/native' import React, { useEffect } from 'react' import { useTranslation } from 'react-i18next' import { StyleSheet } from 'react-native' type SearchListItemType = Album | Song | Artist const SongResultsListItem: React.FC<{ item: Song }> = ({ item }) => { const { setQueue, contextId } = useSetQueue('song', [item]) return ( setQueue({ title: item.title, playTrack: 0 })} style={styles.listItem} /> ) } const OtherResultsListItem: React.FC<{ item: SearchListItemType }> = ({ item }) => { return ( ) } const ResultsListItem: React.FC<{ item: SearchListItemType }> = ({ item }) => { if (item.itemType === 'song') { return } else { return } } const SearchResultsRenderItem: React.FC<{ item: SearchListItemType }> = ({ item }) => const SearchResultsView = withSuspense<{ query: string type: 'album' | 'artist' | 'song' }>(({ query, type }) => { const navigation = useNavigation() const { t } = useTranslation() const size = 100 const params: Search3Params = { query } if (type === 'album') { params.albumCount = size } else if (type === 'artist') { params.artistCount = size } else { params.songCount = size } const { data, isLoading, refetch, fetchNextPage } = useQuerySearchResults(params) const items: (Artist | Album | Song)[] = [] if (type === 'album') { data && items.push(...data.pages.flatMap(p => p.albums)) } else if (type === 'artist') { data && items.push(...data.pages.flatMap(p => p.artists)) } else { data && items.push(...data.pages.flatMap(p => p.songs)) } useEffect(() => { navigation.setOptions({ title: t('search.headerTitle', { query }), }) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return ( i.toString()} onRefresh={refetch} refreshing={isLoading} overScrollMode="never" onEndReached={() => fetchNextPage} removeClippedSubviews={true} onEndReachedThreshold={2} contentMarginTop={6} windowSize={5} /> ) }) const styles = StyleSheet.create({ listItem: { paddingHorizontal: 10, }, }) export default SearchResultsView