diff options
Diffstat (limited to 'src/state/preferences/feed-tuners.tsx')
-rw-r--r-- | src/state/preferences/feed-tuners.tsx | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/state/preferences/feed-tuners.tsx b/src/state/preferences/feed-tuners.tsx new file mode 100644 index 000000000..c4954d20a --- /dev/null +++ b/src/state/preferences/feed-tuners.tsx @@ -0,0 +1,52 @@ +import {useMemo} from 'react' +import {FeedTuner} from '#/lib/api/feed-manip' +import {FeedDescriptor} from '../queries/post-feed' +import {useLanguagePrefs} from './languages' +import {usePreferencesQuery} from '../queries/preferences' +import {useSession} from '../session' + +export function useFeedTuners(feedDesc: FeedDescriptor) { + const langPrefs = useLanguagePrefs() + const {data: preferences} = usePreferencesQuery() + const {currentAccount} = useSession() + + return useMemo(() => { + if (feedDesc.startsWith('feedgen')) { + return [ + FeedTuner.dedupReposts, + FeedTuner.preferredLangOnly(langPrefs.contentLanguages), + ] + } + if (feedDesc.startsWith('list')) { + return [FeedTuner.dedupReposts] + } + if (feedDesc === 'home' || feedDesc === 'following') { + const feedTuners = [] + + if (preferences?.feedViewPrefs.hideReposts) { + feedTuners.push(FeedTuner.removeReposts) + } else { + feedTuners.push(FeedTuner.dedupReposts) + } + + if (preferences?.feedViewPrefs.hideReplies) { + feedTuners.push(FeedTuner.removeReplies) + } else { + feedTuners.push( + FeedTuner.thresholdRepliesOnly({ + userDid: currentAccount?.did || '', + minLikes: preferences?.feedViewPrefs.hideRepliesByLikeCount || 0, + followedOnly: !!preferences?.feedViewPrefs.hideRepliesByUnfollowed, + }), + ) + } + + if (preferences?.feedViewPrefs.hideQuotePosts) { + feedTuners.push(FeedTuner.removeQuotePosts) + } + + return feedTuners + } + return [] + }, [feedDesc, currentAccount, preferences, langPrefs]) +} |