about summary refs log tree commit diff
path: root/src/screens/PostThread/components/ThreadError.tsx
blob: e1ca23cf976e04d478b0e027a83b7b66b0a6392a (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
import {useMemo} from 'react'
import {View} from 'react-native'
import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'

import {useCleanError} from '#/lib/hooks/useCleanError'
import {OUTER_SPACE} from '#/screens/PostThread/const'
import {atoms as a, useTheme} from '#/alf'
import {Button, ButtonIcon, ButtonText} from '#/components/Button'
import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as RetryIcon} from '#/components/icons/ArrowRotateCounterClockwise'
import * as Layout from '#/components/Layout'
import {Text} from '#/components/Typography'

export function ThreadError({
  error,
  onRetry,
}: {
  error: Error
  onRetry: () => void
}) {
  const t = useTheme()
  const {_} = useLingui()
  const cleanError = useCleanError()

  const {title, message} = useMemo(() => {
    let title = _(msg`Error loading post`)
    let message = _(msg`Something went wrong. Please try again in a moment.`)

    const {raw, clean} = cleanError(error)

    if (error.message.startsWith('Post not found')) {
      title = _(msg`Post not found`)
      message = clean || raw || message
    }

    return {title, message}
  }, [_, error, cleanError])

  return (
    <Layout.Center>
      <View
        style={[
          a.w_full,
          a.align_center,
          {
            padding: OUTER_SPACE,
            paddingTop: OUTER_SPACE * 2,
          },
        ]}>
        <View
          style={[
            a.w_full,
            a.align_center,
            a.gap_xl,
            {
              maxWidth: 260,
            },
          ]}>
          <View style={[a.gap_xs]}>
            <Text
              style={[a.text_center, a.text_lg, a.font_bold, a.leading_snug]}>
              {title}
            </Text>
            <Text
              style={[
                a.text_center,
                a.text_sm,
                a.leading_snug,
                t.atoms.text_contrast_medium,
              ]}>
              {message}
            </Text>
          </View>
          <Button
            label={_(msg`Retry`)}
            size="small"
            variant="solid"
            color="secondary_inverted"
            onPress={onRetry}>
            <ButtonText>
              <Trans>Retry</Trans>
            </ButtonText>
            <ButtonIcon icon={RetryIcon} position="right" />
          </Button>
        </View>
      </View>
    </Layout.Center>
  )
}