import React, {useState} from 'react' import {ListRenderItemInfo, View} from 'react-native' import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' import {AppBskyFeedDefs, ModerationOpts} from '@atproto/api' import {Trans} from '@lingui/macro' import {useA11y} from '#/state/a11y' import {DISCOVER_FEED_URI} from 'lib/constants' import { useGetPopularFeedsQuery, useSavedFeeds, useSearchPopularFeedsQuery, } from 'state/queries/feed' import {SearchInput} from 'view/com/util/forms/SearchInput' import {List} from 'view/com/util/List' import {useWizardState} from '#/screens/StarterPack/Wizard/State' import {atoms as a, useTheme} from '#/alf' import {useThrottledValue} from '#/components/hooks/useThrottledValue' import {Loader} from '#/components/Loader' import {ScreenTransition} from '#/components/StarterPack/Wizard/ScreenTransition' import {WizardFeedCard} from '#/components/StarterPack/Wizard/WizardListCard' import {Text} from '#/components/Typography' function keyExtractor(item: AppBskyFeedDefs.GeneratorView) { return item.uri } export function StepFeeds({moderationOpts}: {moderationOpts: ModerationOpts}) { const t = useTheme() const [state, dispatch] = useWizardState() const [query, setQuery] = useState('') const throttledQuery = useThrottledValue(query, 500) const {screenReaderEnabled} = useA11y() const {data: savedFeedsAndLists, isFetchedAfterMount: isFetchedSavedFeeds} = useSavedFeeds() const savedFeeds = savedFeedsAndLists?.feeds .filter(f => f.type === 'feed' && f.view.uri !== DISCOVER_FEED_URI) .map(f => f.view) as AppBskyFeedDefs.GeneratorView[] const { data: popularFeedsPages, fetchNextPage, isLoading: isLoadingPopularFeeds, } = useGetPopularFeedsQuery({ limit: 30, }) const popularFeeds = popularFeedsPages?.pages.flatMap(p => p.feeds) ?? [] // If we have saved feeds already loaded, display them immediately // Then, when popular feeds have loaded we can concat them to the saved feeds const suggestedFeeds = savedFeeds || isFetchedSavedFeeds ? popularFeeds ? savedFeeds.concat( popularFeeds.filter(f => !savedFeeds.some(sf => sf.uri === f.uri)), ) : savedFeeds : undefined const {data: searchedFeeds, isFetching: isFetchingSearchedFeeds} = useSearchPopularFeedsQuery({q: throttledQuery}) const isLoading = !isFetchedSavedFeeds || isLoadingPopularFeeds || isFetchingSearchedFeeds const renderItem = ({ item, }: ListRenderItemInfo) => { return ( ) } return ( setQuery(t)} onPressCancelSearch={() => setQuery('')} onSubmitQuery={() => {}} /> fetchNextPage() : undefined } onEndReachedThreshold={2} renderScrollComponent={props => } keyboardShouldPersistTaps="handled" containWeb={true} sideBorders={false} style={{flex: 1}} ListEmptyComponent={ {isLoading ? ( ) : ( No feeds found. Try searching for something else. )} } /> ) }