import React from 'react' import {RefreshControl, StyleSheet, View} from 'react-native' import {observer} from 'mobx-react-lite' import {useFocusEffect} from '@react-navigation/native' import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' import {withAuthRequired} from 'view/com/auth/withAuthRequired' import {ViewHeader} from '../com/util/ViewHeader' import {useStores} from 'state/index' import {FeedsDiscoveryModel} from 'state/models/discovery/feeds' import {CenteredView, FlatList} from 'view/com/util/Views' import {CustomFeed} from 'view/com/feeds/CustomFeed' import {Text} from 'view/com/util/text/Text' import {isDesktopWeb} from 'platform/detection' import {usePalette} from 'lib/hooks/usePalette' import {s} from 'lib/styles' import {CustomFeedModel} from 'state/models/feeds/custom-feed' import {HeaderWithInput} from 'view/com/search/HeaderWithInput' import debounce from 'lodash.debounce' type Props = NativeStackScreenProps export const DiscoverFeedsScreen = withAuthRequired( observer(({}: Props) => { const store = useStores() const pal = usePalette('default') const feeds = React.useMemo(() => new FeedsDiscoveryModel(store), [store]) // search stuff const [isInputFocused, setIsInputFocused] = React.useState(false) const [query, setQuery] = React.useState('') const debouncedSearchFeeds = React.useMemo( () => debounce(query => feeds.search(query), 500), // debounce for 500ms [feeds], ) const onChangeQuery = React.useCallback( (text: string) => { setQuery(text) if (text.length > 1) { debouncedSearchFeeds(text) } else { feeds.refresh() } }, [debouncedSearchFeeds, feeds], ) const onPressClearQuery = React.useCallback(() => { setQuery('') feeds.refresh() }, [feeds]) const onPressCancelSearch = React.useCallback(() => { setIsInputFocused(false) setQuery('') feeds.refresh() }, [feeds]) const onSubmitQuery = React.useCallback(() => { debouncedSearchFeeds(query) debouncedSearchFeeds.flush() }, [debouncedSearchFeeds, query]) useFocusEffect( React.useCallback(() => { store.shell.setMinimalShellMode(false) feeds.refresh() }, [store, feeds]), ) const onRefresh = React.useCallback(() => { feeds.refresh() }, [feeds]) const renderListEmptyComponent = React.useCallback(() => { return ( {feeds.isLoading ? 'Loading...' : `We can't find any feeds for some reason. This is probably an error - try refreshing!`} ) }, [pal, feeds.isLoading]) const renderItem = React.useCallback( ({item}: {item: CustomFeedModel}) => ( ), [], ) return ( item.data.uri} contentContainerStyle={styles.contentContainer} refreshControl={ } renderItem={renderItem} initialNumToRender={10} ListEmptyComponent={renderListEmptyComponent} onEndReached={() => feeds.loadMore()} extraData={feeds.isLoading} /> ) }), ) const styles = StyleSheet.create({ container: { flex: 1, }, contentContainer: { paddingBottom: 100, }, containerDesktop: { borderLeftWidth: 1, borderRightWidth: 1, }, empty: { paddingHorizontal: 18, paddingVertical: 16, borderRadius: 8, marginHorizontal: 18, marginTop: 10, }, })