2022-05-19 09:29:28 -07:00
import debounce from 'lodash/debounce' ;
2022-04-12 06:52:04 -07:00
import * as React from 'react' ;
2022-04-12 11:25:53 -07:00
import { FormattedMessage } from 'react-intl' ;
2022-04-12 06:52:04 -07:00
import { useDispatch } from 'react-redux' ;
2022-05-30 11:23:55 -07:00
import { fetchSuggestions } from 'soapbox/actions/suggestions' ;
2022-05-19 09:29:28 -07:00
import ScrollableList from 'soapbox/components/scrollable_list' ;
2022-04-12 06:52:04 -07:00
import { Button , Card , CardBody , Stack , Text } from 'soapbox/components/ui' ;
import AccountContainer from 'soapbox/containers/account_container' ;
import { useAppSelector } from 'soapbox/hooks' ;
const SuggestedAccountsStep = ( { onNext } : { onNext : ( ) = > void } ) = > {
const dispatch = useDispatch ( ) ;
2022-06-05 07:17:26 -07:00
const suggestions = useAppSelector ( ( state ) = > state . suggestions . items ) ;
const hasMore = useAppSelector ( ( state ) = > ! ! state . suggestions . next ) ;
const isLoading = useAppSelector ( ( state ) = > state . suggestions . isLoading ) ;
2022-05-19 09:29:28 -07:00
const handleLoadMore = debounce ( ( ) = > {
if ( isLoading ) {
return null ;
}
return dispatch ( fetchSuggestions ( ) ) ;
} , 300 ) ;
2022-04-12 06:52:04 -07:00
React . useEffect ( ( ) = > {
2022-05-19 09:29:28 -07:00
dispatch ( fetchSuggestions ( { limit : 20 } ) ) ;
2022-04-12 06:52:04 -07:00
} , [ ] ) ;
2022-04-20 10:24:03 -07:00
const renderSuggestions = ( ) = > {
return (
2022-05-19 09:29:28 -07:00
< div className = 'sm:pt-4 sm:pb-10 flex flex-col' >
< ScrollableList
isLoading = { isLoading }
scrollKey = 'suggestions'
onLoadMore = { handleLoadMore }
hasMore = { hasMore }
useWindowScroll = { false }
style = { { height : 320 } }
>
2022-06-05 07:17:26 -07:00
{ suggestions . map ( ( suggestion ) = > (
< div key = { suggestion . account } className = 'py-2' >
2022-05-19 09:29:28 -07:00
< AccountContainer
// @ts-ignore: TS thinks `id` is passed to <Account>, but it isn't
2022-06-05 07:17:26 -07:00
id = { suggestion . account }
2022-05-19 09:29:28 -07:00
showProfileHoverCard = { false }
2022-07-01 13:07:01 -07:00
withLinkToProfile = { false }
2022-05-19 09:29:28 -07:00
/ >
< / div >
) ) }
< / ScrollableList >
2022-04-20 10:24:03 -07:00
< / div >
) ;
} ;
const renderEmpty = ( ) = > {
return (
< div className = 'bg-primary-50 dark:bg-slate-700 my-2 rounded-lg text-center p-8' >
< Text >
< FormattedMessage id = 'empty_column.follow_recommendations' defaultMessage = 'Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.' / >
< / Text >
< / div >
) ;
} ;
const renderBody = ( ) = > {
2022-05-19 09:29:28 -07:00
if ( suggestions . isEmpty ( ) ) {
2022-04-20 10:24:03 -07:00
return renderEmpty ( ) ;
} else {
return renderSuggestions ( ) ;
}
} ;
2022-04-12 06:52:04 -07:00
return (
< Card variant = 'rounded' size = 'xl' >
< CardBody >
< div >
2022-07-15 14:53:28 -07:00
< div className = 'pb-4 sm:pb-10 mb-4 border-b border-gray-200 dark:border-gray-600 border-solid -mx-4 sm:-mx-10' >
2022-04-12 06:52:04 -07:00
< Stack space = { 2 } >
< Text size = '2xl' align = 'center' weight = 'bold' >
2022-04-12 11:25:53 -07:00
< FormattedMessage id = 'onboarding.suggestions.title' defaultMessage = 'Suggested accounts' / >
2022-04-12 06:52:04 -07:00
< / Text >
< Text theme = 'muted' align = 'center' >
2022-04-12 11:25:53 -07:00
< FormattedMessage id = 'onboarding.suggestions.subtitle' defaultMessage = 'Here are a few of the most popular accounts you might like.' / >
2022-04-12 06:52:04 -07:00
< / Text >
< / Stack >
< / div >
2022-04-20 10:24:03 -07:00
{ renderBody ( ) }
2022-04-12 06:52:04 -07:00
< div className = 'sm:w-2/3 md:w-1/2 mx-auto' >
< Stack >
< Stack justifyContent = 'center' space = { 2 } >
< Button
block
theme = 'primary'
onClick = { onNext }
>
2022-04-20 10:08:49 -07:00
< FormattedMessage id = 'onboarding.done' defaultMessage = 'Done' / >
2022-04-12 06:52:04 -07:00
< / Button >
2022-04-12 11:25:53 -07:00
< Button block theme = 'link' type = 'button' onClick = { onNext } >
< FormattedMessage id = 'onboarding.skip' defaultMessage = 'Skip for now' / >
< / Button >
2022-04-12 06:52:04 -07:00
< / Stack >
< / Stack >
< / div >
< / div >
< / CardBody >
< / Card >
) ;
} ;
export default SuggestedAccountsStep ;