about summary refs log tree commit diff
path: root/src/components/interstitials/Trending.tsx
blob: a217a7da2dd6561bedc8d01ce592b765940d38b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import React from 'react'
import {View} from 'react-native'
import {ScrollView} from 'react-native-gesture-handler'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'

import {logEvent} from '#/lib/statsig/statsig'
import {
  useTrendingSettings,
  useTrendingSettingsApi,
} from '#/state/preferences/trending'
import {useTrendingTopics} from '#/state/queries/trending/useTrendingTopics'
import {useTrendingConfig} from '#/state/trending-config'
import {atoms as a, useGutters, useTheme} from '#/alf'
import {Button, ButtonIcon} from '#/components/Button'
import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times'
import {Trending2_Stroke2_Corner2_Rounded as Graph} from '#/components/icons/Trending2'
import * as Prompt from '#/components/Prompt'
import {TrendingTopicLink} from '#/components/TrendingTopics'
import {Text} from '#/components/Typography'

export function TrendingInterstitial() {
  const {enabled} = useTrendingConfig()
  const {trendingDisabled} = useTrendingSettings()
  return enabled && !trendingDisabled ? <Inner /> : null
}

export function Inner() {
  const t = useTheme()
  const {_} = useLingui()
  const gutters = useGutters([0, 'base', 0, 'base'])
  const trendingPrompt = Prompt.usePromptControl()
  const {setTrendingDisabled} = useTrendingSettingsApi()
  const {data: trending, error, isLoading} = useTrendingTopics()
  const noTopics = !isLoading && !error && !trending?.topics?.length

  const onConfirmHide = React.useCallback(() => {
    logEvent('trendingTopics:hide', {context: 'interstitial'})
    setTrendingDisabled(true)
  }, [setTrendingDisabled])

  return error || noTopics ? null : (
    <View style={[t.atoms.border_contrast_low, a.border_t]}>
      <ScrollView
        horizontal
        showsHorizontalScrollIndicator={false}
        decelerationRate="fast">
        <View style={[gutters, a.flex_row, a.align_center, a.gap_lg]}>
          <View style={{paddingLeft: 4, paddingRight: 2}}>
            <Graph size="sm" />
          </View>
          {isLoading ? (
            <View style={[a.py_lg]}>
              <Text
                style={[t.atoms.text_contrast_medium, a.text_sm, a.font_bold]}>
                {' '}
              </Text>
            </View>
          ) : !trending?.topics ? null : (
            <>
              {trending.topics.map(topic => (
                <TrendingTopicLink
                  key={topic.link}
                  topic={topic}
                  onPress={() => {
                    logEvent('trendingTopic:click', {context: 'interstitial'})
                  }}>
                  <View style={[a.py_lg]}>
                    <Text
                      style={[
                        t.atoms.text,
                        a.text_sm,
                        a.font_bold,
                        {opacity: 0.7}, // NOTE: we use opacity 0.7 instead of a color to match the color of the home pager tab bar
                      ]}>
                      {topic.topic}
                    </Text>
                  </View>
                </TrendingTopicLink>
              ))}
              <Button
                label={_(msg`Hide trending topics`)}
                size="tiny"
                variant="ghost"
                color="secondary"
                shape="round"
                onPress={() => trendingPrompt.open()}>
                <ButtonIcon icon={X} />
              </Button>
            </>
          )}
        </View>
      </ScrollView>

      <Prompt.Basic
        control={trendingPrompt}
        title={_(msg`Hide trending topics?`)}
        description={_(msg`You can update this later from your settings.`)}
        confirmButtonCta={_(msg`Hide`)}
        onConfirm={onConfirmHide}
      />
    </View>
  )
}