forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {View} from 'react-native'
2import {msg} from '@lingui/core/macro'
3import {useLingui} from '@lingui/react'
4import {Trans} from '@lingui/react/macro'
5
6import {useTrendingSettings} from '#/state/preferences/trending'
7import {atoms as a, useLayoutBreakpoints} from '#/alf'
8import {Button} from '#/components/Button'
9import {TimesLarge_Stroke2_Corner0_Rounded as CloseIcon} from '#/components/icons/Times'
10import {TrendingInterstitial} from '#/components/interstitials/Trending'
11import * as Toast from '#/components/Toast'
12import {LiveEventFeedCardWide} from '#/features/liveEvents/components/LiveEventFeedCardWide'
13import {useUserPreferencedLiveEvents} from '#/features/liveEvents/context'
14import {useUpdateLiveEventPreferences} from '#/features/liveEvents/preferences'
15import {type LiveEventFeed} from '#/features/liveEvents/types'
16
17export function DiscoverFeedLiveEventFeedsAndTrendingBanner() {
18 const events = useUserPreferencedLiveEvents()
19 const {rightNavVisible} = useLayoutBreakpoints()
20 const {trendingDisabled} = useTrendingSettings()
21
22 if (!events.feeds.length) {
23 if (!rightNavVisible && !trendingDisabled) {
24 // only show trending on mobile when live event banner is not shown
25 return <TrendingInterstitial />
26 } else {
27 // no feed, no trending
28 return null
29 }
30 }
31
32 // On desktop, we show in the sidebar
33 if (rightNavVisible) return null
34
35 return events.feeds.map(feed => <Inner feed={feed} key={feed.id} />)
36}
37
38function Inner({feed}: {feed: LiveEventFeed}) {
39 const {_} = useLingui()
40 const layout = feed.layouts.wide
41
42 const {mutate: update, variables} = useUpdateLiveEventPreferences({
43 feed,
44 metricContext: 'discover',
45 onUpdateSuccess({undoAction}) {
46 Toast.show(
47 <Toast.Outer>
48 <Toast.Icon />
49 <Toast.Text>
50 {undoAction ? (
51 <Trans>Live event hidden</Trans>
52 ) : (
53 <Trans>Live event unhidden</Trans>
54 )}
55 </Toast.Text>
56 {undoAction && (
57 <Toast.Action
58 label={_(msg`Undo`)}
59 onPress={() => {
60 if (undoAction) {
61 update(undoAction)
62 }
63 }}>
64 <Trans>Undo</Trans>
65 </Toast.Action>
66 )}
67 </Toast.Outer>,
68 {type: 'success'},
69 )
70 },
71 })
72
73 if (variables) return null
74
75 return (
76 <>
77 <View style={[a.px_lg, a.pt_md, a.pb_xs]}>
78 <View>
79 <LiveEventFeedCardWide feed={feed} metricContext="discover" />
80
81 <Button
82 label={_(msg`Dismiss live event banner`)}
83 size="tiny"
84 shape="round"
85 style={[a.absolute, a.z_10, {top: 6, right: 6}]}
86 onPress={() => {
87 update({type: 'hideFeed', id: feed.id})
88 }}>
89 {({hovered, pressed}) => (
90 <>
91 <View
92 style={[
93 a.absolute,
94 a.inset_0,
95 a.rounded_full,
96 {
97 backgroundColor: layout.overlayColor,
98 opacity: hovered || pressed ? 0.8 : 0.6,
99 },
100 ]}
101 />
102 <CloseIcon size="xs" fill={layout.textColor} style={[a.z_20]} />
103 </>
104 )}
105 </Button>
106 </View>
107 </View>
108 </>
109 )
110}