about summary refs log tree commit diff
path: root/src/view/com/util/moderation/ImageHider.tsx
blob: 40add5b67b26cf790f14ab1bcd582e34c829264e (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import React from 'react'
import {Pressable, StyleProp, StyleSheet, View, ViewStyle} from 'react-native'
import {usePalette} from 'lib/hooks/usePalette'
import {Text} from '../text/Text'
import {BlurView} from '../BlurView'
import {ModerationBehavior, ModerationBehaviorCode} from 'lib/labeling/types'
import {isAndroid} from 'platform/detection'

export function ImageHider({
  testID,
  moderation,
  style,
  containerStyle,
  children,
}: React.PropsWithChildren<{
  testID?: string
  moderation: ModerationBehavior
  style?: StyleProp<ViewStyle>
  containerStyle?: StyleProp<ViewStyle>
}>) {
  const pal = usePalette('default')
  const [override, setOverride] = React.useState(false)
  const onPressShow = React.useCallback(() => {
    setOverride(true)
  }, [setOverride])
  const onPressHide = React.useCallback(() => {
    setOverride(false)
  }, [setOverride])

  if (moderation.behavior === ModerationBehaviorCode.Hide) {
    return null
  }

  if (moderation.behavior !== ModerationBehaviorCode.WarnImages) {
    return (
      <View testID={testID} style={style}>
        {children}
      </View>
    )
  }

  return (
    <View style={[styles.container, containerStyle]}>
      <View testID={testID} style={style}>
        {children}
      </View>
      {override ? (
        <Pressable
          onPress={onPressHide}
          style={[styles.hideBtn, pal.view]}
          accessibilityLabel="Hide image"
          accessibilityHint="Rehides the image">
          <Text type="xl-bold" style={pal.link}>
            Hide
          </Text>
        </Pressable>
      ) : (
        <>
          {isAndroid ? (
            /* android has an issue that breaks the blurview */
            /* see https://github.com/Kureev/react-native-blur/issues/486 */
            <View style={[pal.viewLight, styles.overlay, styles.coverView]} />
          ) : (
            <BlurView
              style={[styles.overlay, styles.blurView]}
              blurType="light"
              blurAmount={100}
              reducedTransparencyFallbackColor="white"
            />
          )}
          <View style={[styles.overlay, styles.info]}>
            <Pressable
              onPress={onPressShow}
              style={[styles.showBtn, pal.view]}
              accessibilityLabel="Show image"
              accessibilityHint="Shows image hidden based on your moderation settings">
              <Text type="xl" style={pal.text}>
                {moderation.reason || 'Content warning'}
              </Text>
              <Text type="xl-bold" style={pal.link}>
                Show
              </Text>
            </Pressable>
          </View>
        </>
      )}
    </View>
  )
}

const styles = StyleSheet.create({
  container: {
    position: 'relative',
    marginBottom: 10,
  },
  overlay: {
    position: 'absolute',
    left: 0,
    top: 0,
    right: 0,
    bottom: 0,
  },
  blurView: {
    borderRadius: 8,
  },
  coverView: {
    borderRadius: 8,
  },
  info: {
    justifyContent: 'center',
    alignItems: 'center',
  },
  showBtn: {
    flexDirection: 'row',
    gap: 8,
    paddingHorizontal: 18,
    paddingVertical: 14,
    borderRadius: 24,
  },
  hideBtn: {
    position: 'absolute',
    left: 8,
    bottom: 20,
    paddingHorizontal: 8,
    paddingVertical: 6,
    borderRadius: 8,
  },
})