···43import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
44import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
45import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
046import {
47 Provider as SessionProvider,
48 type SessionAccount,
···57import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed'
58import {Provider as StarterPackProvider} from '#/state/shell/starter-pack'
59import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies'
60-import {Provider as TrendingConfigProvider} from '#/state/trending-config'
61import {TestCtrls} from '#/view/com/testing/TestCtrls'
62import {Provider as VideoVolumeProvider} from '#/view/com/util/post-embeds/VideoVolumeContext'
63import * as Toast from '#/view/com/util/Toast'
···149 <BackgroundNotificationPreferencesProvider>
150 <MutedThreadsProvider>
151 <ProgressGuideProvider>
152- <TrendingConfigProvider>
153 <GestureHandlerRootView
154 style={s.h100pct}>
155 <IntentDialogProvider>
···158 <NuxDialogs />
159 </IntentDialogProvider>
160 </GestureHandlerRootView>
161- </TrendingConfigProvider>
162 </ProgressGuideProvider>
163 </MutedThreadsProvider>
164 </BackgroundNotificationPreferencesProvider>
···43import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
44import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
45import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
46+import {Provider as ServiceAccountManager} from '#/state/service-config'
47import {
48 Provider as SessionProvider,
49 type SessionAccount,
···58import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed'
59import {Provider as StarterPackProvider} from '#/state/shell/starter-pack'
60import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies'
061import {TestCtrls} from '#/view/com/testing/TestCtrls'
62import {Provider as VideoVolumeProvider} from '#/view/com/util/post-embeds/VideoVolumeContext'
63import * as Toast from '#/view/com/util/Toast'
···149 <BackgroundNotificationPreferencesProvider>
150 <MutedThreadsProvider>
151 <ProgressGuideProvider>
152+ <ServiceAccountManager>
153 <GestureHandlerRootView
154 style={s.h100pct}>
155 <IntentDialogProvider>
···158 <NuxDialogs />
159 </IntentDialogProvider>
160 </GestureHandlerRootView>
161+ </ServiceAccountManager>
162 </ProgressGuideProvider>
163 </MutedThreadsProvider>
164 </BackgroundNotificationPreferencesProvider>
+3-3
src/App.web.tsx
···33import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
34import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
35import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
036import {
37 Provider as SessionProvider,
38 type SessionAccount,
···47import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed'
48import {Provider as StarterPackProvider} from '#/state/shell/starter-pack'
49import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies'
50-import {Provider as TrendingConfigProvider} from '#/state/trending-config'
51import {Provider as ActiveVideoProvider} from '#/view/com/util/post-embeds/ActiveVideoWebContext'
52import {Provider as VideoVolumeProvider} from '#/view/com/util/post-embeds/VideoVolumeContext'
53import * as Toast from '#/view/com/util/Toast'
···130 <MutedThreadsProvider>
131 <SafeAreaProvider>
132 <ProgressGuideProvider>
133- <TrendingConfigProvider>
134 <IntentDialogProvider>
135 <Shell />
136 <NuxDialogs />
137 </IntentDialogProvider>
138- </TrendingConfigProvider>
139 </ProgressGuideProvider>
140 </SafeAreaProvider>
141 </MutedThreadsProvider>
···33import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
34import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
35import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
36+import {Provider as ServiceConfigProvider} from '#/state/service-config'
37import {
38 Provider as SessionProvider,
39 type SessionAccount,
···48import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed'
49import {Provider as StarterPackProvider} from '#/state/shell/starter-pack'
50import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies'
051import {Provider as ActiveVideoProvider} from '#/view/com/util/post-embeds/ActiveVideoWebContext'
52import {Provider as VideoVolumeProvider} from '#/view/com/util/post-embeds/VideoVolumeContext'
53import * as Toast from '#/view/com/util/Toast'
···130 <MutedThreadsProvider>
131 <SafeAreaProvider>
132 <ProgressGuideProvider>
133+ <ServiceConfigProvider>
134 <IntentDialogProvider>
135 <Shell />
136 <NuxDialogs />
137 </IntentDialogProvider>
138+ </ServiceConfigProvider>
139 </ProgressGuideProvider>
140 </SafeAreaProvider>
141 </MutedThreadsProvider>
+1-1
src/components/interstitials/Trending.tsx
···9 useTrendingSettingsApi,
10} from '#/state/preferences/trending'
11import {useTrendingTopics} from '#/state/queries/trending/useTrendingTopics'
12-import {useTrendingConfig} from '#/state/trending-config'
13import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
14import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture'
15import {atoms as a, useGutters, useTheme} from '#/alf'
···9 useTrendingSettingsApi,
10} from '#/state/preferences/trending'
11import {useTrendingTopics} from '#/state/queries/trending/useTrendingTopics'
12+import {useTrendingConfig} from '#/state/service-config'
13import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
14import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture'
15import {atoms as a, useGutters, useTheme} from '#/alf'
···8 DEFAULT_LIMIT as RECOMMENDATIONS_COUNT,
9 useTrendingTopics,
10} from '#/state/queries/trending/useTrendingTopics'
11-import {useTrendingConfig} from '#/state/trending-config'
12import {atoms as a, useGutters, useTheme} from '#/alf'
13import {Hashtag_Stroke2_Corner0_Rounded} from '#/components/icons/Hashtag'
14import {
···8 DEFAULT_LIMIT as RECOMMENDATIONS_COUNT,
9 useTrendingTopics,
10} from '#/state/queries/trending/useTrendingTopics'
11+import {useTrendingConfig} from '#/state/service-config'
12import {atoms as a, useGutters, useTheme} from '#/alf'
13import {Hashtag_Stroke2_Corner0_Rounded} from '#/components/icons/Hashtag'
14import {
···8import {useModerationOpts} from '#/state/preferences/moderation-opts'
9import {useTrendingSettings} from '#/state/preferences/trending'
10import {useGetTrendsQuery} from '#/state/queries/trending/useGetTrendsQuery'
11-import {useTrendingConfig} from '#/state/trending-config'
12import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
13import {formatCount} from '#/view/com/util/numeric/format'
14import {atoms as a, useGutters, useTheme, type ViewStyleProp, web} from '#/alf'
···8import {useModerationOpts} from '#/state/preferences/moderation-opts'
9import {useTrendingSettings} from '#/state/preferences/trending'
10import {useGetTrendsQuery} from '#/state/queries/trending/useGetTrendsQuery'
11+import {useTrendingConfig} from '#/state/service-config'
12import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
13import {formatCount} from '#/view/com/util/numeric/format'
14import {atoms as a, useGutters, useTheme, type ViewStyleProp, web} from '#/alf'
+1-1
src/screens/Settings/ContentAndMediaSettings.tsx
···14 useTrendingSettings,
15 useTrendingSettingsApi,
16} from '#/state/preferences/trending'
17-import {useTrendingConfig} from '#/state/trending-config'
18import * as SettingsList from '#/screens/Settings/components/SettingsList'
19import * as Toggle from '#/components/forms/Toggle'
20import {Bubbles_Stroke2_Corner2_Rounded as BubblesIcon} from '#/components/icons/Bubble'
···14 useTrendingSettings,
15 useTrendingSettingsApi,
16} from '#/state/preferences/trending'
17+import {useTrendingConfig} from '#/state/service-config'
18import * as SettingsList from '#/screens/Settings/components/SettingsList'
19import * as Toggle from '#/components/forms/Toggle'
20import {Bubbles_Stroke2_Corner2_Rounded as BubblesIcon} from '#/components/icons/Bubble'
···19import {useLingui} from '@lingui/react'
20import {useQueryClient} from '@tanstack/react-query'
2122-import {isStatusStillActive} from '#/lib/actor-status'
23import {DISCOVER_FEED_URI, KNOWN_SHUTDOWN_FEEDS} from '#/lib/constants'
24import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
25import {logEvent} from '#/lib/statsig/statsig'
···39 RQKEY,
40 usePostFeedQuery,
41} from '#/state/queries/post-feed'
042import {useSession} from '#/state/session'
43import {useProgressGuide} from '#/state/shell/progress-guide'
44import {List, type ListRef} from '#/view/com/util/List'
···53} from '#/components/feeds/PostFeedVideoGridRow'
54import {TrendingInterstitial} from '#/components/interstitials/Trending'
55import {TrendingVideos as TrendingVideosInterstitial} from '#/components/interstitials/TrendingVideos'
56-import {temp__canBeLive, temp__isStatusValid} from '#/components/live/temp'
57import {DiscoverFallbackHeader} from './DiscoverFallbackHeader'
58import {FeedShutdownMsg} from './FeedShutdownMsg'
59import {PostFeedErrorMessage} from './PostFeedErrorMessage'
···777 )
778 }, [isFetchingNextPage, shouldRenderEndOfFeed, renderEndOfFeed, headerOffset])
77900780 const seenActorWithStatusRef = useRef<Set<string>>(new Set())
781 const onItemSeen = useCallback(
782 (item: FeedRow) => {
783 feedFeedback.onItemSeen(item)
784 if (item.type === 'sliceItem') {
785 const actor = item.slice.items[item.indexInSlice].post.author
0786 if (
787 actor.status &&
788- temp__canBeLive(actor) &&
789- temp__isStatusValid(actor.status) &&
790 isStatusStillActive(actor.status.expiresAt)
791 ) {
792 if (!seenActorWithStatusRef.current.has(actor.did)) {
···799 }
800 }
801 },
802- [feedFeedback, feed],
803 )
804805 return (
···19import {useLingui} from '@lingui/react'
20import {useQueryClient} from '@tanstack/react-query'
2122+import {isStatusStillActive, validateStatus} from '#/lib/actor-status'
23import {DISCOVER_FEED_URI, KNOWN_SHUTDOWN_FEEDS} from '#/lib/constants'
24import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
25import {logEvent} from '#/lib/statsig/statsig'
···39 RQKEY,
40 usePostFeedQuery,
41} from '#/state/queries/post-feed'
42+import {useLiveNowConfig} from '#/state/service-config'
43import {useSession} from '#/state/session'
44import {useProgressGuide} from '#/state/shell/progress-guide'
45import {List, type ListRef} from '#/view/com/util/List'
···54} from '#/components/feeds/PostFeedVideoGridRow'
55import {TrendingInterstitial} from '#/components/interstitials/Trending'
56import {TrendingVideos as TrendingVideosInterstitial} from '#/components/interstitials/TrendingVideos'
057import {DiscoverFallbackHeader} from './DiscoverFallbackHeader'
58import {FeedShutdownMsg} from './FeedShutdownMsg'
59import {PostFeedErrorMessage} from './PostFeedErrorMessage'
···777 )
778 }, [isFetchingNextPage, shouldRenderEndOfFeed, renderEndOfFeed, headerOffset])
779780+ const liveNowConfig = useLiveNowConfig()
781+782 const seenActorWithStatusRef = useRef<Set<string>>(new Set())
783 const onItemSeen = useCallback(
784 (item: FeedRow) => {
785 feedFeedback.onItemSeen(item)
786 if (item.type === 'sliceItem') {
787 const actor = item.slice.items[item.indexInSlice].post.author
788+789 if (
790 actor.status &&
791+ validateStatus(actor.did, actor.status, liveNowConfig) &&
0792 isStatusStillActive(actor.status.expiresAt)
793 ) {
794 if (!seenActorWithStatusRef.current.has(actor.did)) {
···801 }
802 }
803 },
804+ [feedFeedback, feed, liveNowConfig],
805 )
806807 return (
+3-2
src/view/com/profile/ProfileMenu.tsx
···20 useProfileFollowMutationQueue,
21 useProfileMuteMutationQueue,
22} from '#/state/queries/profile'
023import {useSession} from '#/state/session'
24import {EventStopper} from '#/view/com/util/EventStopper'
25import * as Toast from '#/view/com/util/Toast'
···43import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/icons/Speaker'
44import {EditLiveDialog} from '#/components/live/EditLiveDialog'
45import {GoLiveDialog} from '#/components/live/GoLiveDialog'
46-import {temp__canGoLive} from '#/components/live/temp'
47import * as Menu from '#/components/Menu'
48import {
49 ReportDialog,
···73 const isLabelerAndNotBlocked = !!profile.associated?.labeler && !isBlocked
74 const [devModeEnabled] = useDevMode()
75 const verification = useFullVerificationState({profile})
07677 const [queueMute, queueUnmute] = useProfileMuteMutationQueue(profile)
78 const [queueBlock, queueUnblock] = useProfileBlockMutationQueue(profile)
···299 </Menu.ItemText>
300 <Menu.ItemIcon icon={List} />
301 </Menu.Item>
302- {isSelf && temp__canGoLive(profile) && (
303 <Menu.Item
304 testID="profileHeaderDropdownListAddRemoveBtn"
305 label={
···20 useProfileFollowMutationQueue,
21 useProfileMuteMutationQueue,
22} from '#/state/queries/profile'
23+import {useCanGoLive} from '#/state/service-config'
24import {useSession} from '#/state/session'
25import {EventStopper} from '#/view/com/util/EventStopper'
26import * as Toast from '#/view/com/util/Toast'
···44import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/icons/Speaker'
45import {EditLiveDialog} from '#/components/live/EditLiveDialog'
46import {GoLiveDialog} from '#/components/live/GoLiveDialog'
047import * as Menu from '#/components/Menu'
48import {
49 ReportDialog,
···73 const isLabelerAndNotBlocked = !!profile.associated?.labeler && !isBlocked
74 const [devModeEnabled] = useDevMode()
75 const verification = useFullVerificationState({profile})
76+ const canGoLive = useCanGoLive(currentAccount?.did)
7778 const [queueMute, queueUnmute] = useProfileMuteMutationQueue(profile)
79 const [queueBlock, queueUnblock] = useProfileBlockMutationQueue(profile)
···300 </Menu.ItemText>
301 <Menu.ItemIcon icon={List} />
302 </Menu.Item>
303+ {isSelf && canGoLive && (
304 <Menu.Item
305 testID="profileHeaderDropdownListAddRemoveBtn"
306 label={
+1-1
src/view/shell/desktop/SidebarTrendingTopics.tsx
···9 useTrendingSettingsApi,
10} from '#/state/preferences/trending'
11import {useTrendingTopics} from '#/state/queries/trending/useTrendingTopics'
12-import {useTrendingConfig} from '#/state/trending-config'
13import {atoms as a, useTheme} from '#/alf'
14import {Button, ButtonIcon} from '#/components/Button'
15import {Divider} from '#/components/Divider'
···9 useTrendingSettingsApi,
10} from '#/state/preferences/trending'
11import {useTrendingTopics} from '#/state/queries/trending/useTrendingTopics'
12+import {useTrendingConfig} from '#/state/service-config'
13import {atoms as a, useTheme} from '#/alf'
14import {Button, ButtonIcon} from '#/components/Button'
15import {Divider} from '#/components/Divider'