Bluesky app fork with some witchin' additions 💫

[APP-1794] respect mute words for live event feed banners (#9831)

* respect mute words for live event feed banners

* linting

authored by

Spence Pope and committed by
GitHub
dc3f0159 423eddc4

+22 -3
+22 -3
src/features/liveEvents/context.tsx
··· 1 import {createContext, useContext, useMemo} from 'react' 2 import {QueryClient, useQuery} from '@tanstack/react-query' 3 4 import {useOnAppStateChange} from '#/lib/appState' ··· 8 isBskyCustomFeedUrl, 9 makeRecordUri, 10 } from '#/lib/strings/url-helpers' 11 - import {LIVE_EVENTS_URL} from '#/env' 12 import {useLiveEventPreferences} from '#/features/liveEvents/preferences' 13 import {type LiveEventsWorkerResponse} from '#/features/liveEvents/types' 14 import {useDevMode} from '#/storage/hooks/dev-mode' ··· 36 export function Provider({children}: React.PropsWithChildren<{}>) { 37 const [isDevMode] = useDevMode() 38 const isBskyTeam = useIsBskyTeam() 39 const {data, refetch} = useQuery( 40 { 41 // keep this, prefectching handles initial load ··· 50 ) 51 52 useOnAppStateChange(state => { 53 - if (state === 'active') refetch() 54 }) 55 56 const ctx = useMemo(() => { 57 if (!data) return DEFAULT_LIVE_EVENTS 58 const feeds = data.feeds.filter(f => { 59 if (f.preview && !isBskyTeam) return false 60 return true 61 }) 62 return { ··· 64 // only one at a time for now, unless bsky team and dev mode 65 feeds: isBskyTeam && isDevMode ? feeds : feeds.slice(0, 1), 66 } 67 - }, [data, isBskyTeam, isDevMode]) 68 69 return <Context.Provider value={ctx}>{children}</Context.Provider> 70 }
··· 1 import {createContext, useContext, useMemo} from 'react' 2 + import {hasMutedWord} from '@atproto/api' 3 import {QueryClient, useQuery} from '@tanstack/react-query' 4 5 import {useOnAppStateChange} from '#/lib/appState' ··· 9 isBskyCustomFeedUrl, 10 makeRecordUri, 11 } from '#/lib/strings/url-helpers' 12 + import {usePreferencesQuery} from '#/state/queries/preferences' 13 + import {IS_DEV, LIVE_EVENTS_URL} from '#/env' 14 import {useLiveEventPreferences} from '#/features/liveEvents/preferences' 15 import {type LiveEventsWorkerResponse} from '#/features/liveEvents/types' 16 import {useDevMode} from '#/storage/hooks/dev-mode' ··· 38 export function Provider({children}: React.PropsWithChildren<{}>) { 39 const [isDevMode] = useDevMode() 40 const isBskyTeam = useIsBskyTeam() 41 + const {data: preferences} = usePreferencesQuery() 42 + const mutedWords = useMemo( 43 + () => preferences?.moderationPrefs?.mutedWords ?? [], 44 + [preferences?.moderationPrefs?.mutedWords], 45 + ) 46 + 47 const {data, refetch} = useQuery( 48 { 49 // keep this, prefectching handles initial load ··· 58 ) 59 60 useOnAppStateChange(state => { 61 + if (state === 'active') void refetch() 62 }) 63 64 const ctx = useMemo(() => { 65 if (!data) return DEFAULT_LIVE_EVENTS 66 + const skipMuteFilter = isBskyTeam || IS_DEV 67 const feeds = data.feeds.filter(f => { 68 if (f.preview && !isBskyTeam) return false 69 + if (!skipMuteFilter && mutedWords.length > 0) { 70 + const text = [ 71 + f.title, 72 + f.layouts?.wide?.title, 73 + f.layouts?.compact?.title, 74 + ] 75 + .filter(Boolean) 76 + .join(' ') 77 + if (hasMutedWord({mutedWords, text})) return false 78 + } 79 return true 80 }) 81 return { ··· 83 // only one at a time for now, unless bsky team and dev mode 84 feeds: isBskyTeam && isDevMode ? feeds : feeds.slice(0, 1), 85 } 86 + }, [data, isBskyTeam, isDevMode, mutedWords]) 87 88 return <Context.Provider value={ctx}>{children}</Context.Provider> 89 }