about summary refs log tree commit diff
path: root/src/screens/Messages/components/ChatDisabled.tsx
diff options
context:
space:
mode:
authorSamuel Newman <mozzius@protonmail.com>2024-10-02 22:21:59 +0300
committerGitHub <noreply@github.com>2024-10-02 22:21:59 +0300
commit13c9c79aeec77edc33b1a926843b005c14acccc7 (patch)
tree0ce80c052a7e504c99e842f0ba6a0f1f2f379a1e /src/screens/Messages/components/ChatDisabled.tsx
parent405966830ccdbee6152037eebb76c4815ff5526c (diff)
downloadvoidsky-13c9c79aeec77edc33b1a926843b005c14acccc7.tar.zst
move files around (#5576)
Diffstat (limited to 'src/screens/Messages/components/ChatDisabled.tsx')
-rw-r--r--src/screens/Messages/components/ChatDisabled.tsx150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/screens/Messages/components/ChatDisabled.tsx b/src/screens/Messages/components/ChatDisabled.tsx
new file mode 100644
index 000000000..c768d2504
--- /dev/null
+++ b/src/screens/Messages/components/ChatDisabled.tsx
@@ -0,0 +1,150 @@
+import React, {useCallback, useState} from 'react'
+import {View} from 'react-native'
+import {ComAtprotoModerationDefs} from '@atproto/api'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
+import {useMutation} from '@tanstack/react-query'
+
+import {logger} from '#/logger'
+import {useAgent, useSession} from '#/state/session'
+import * as Toast from '#/view/com/util/Toast'
+import {atoms as a, useBreakpoints, useTheme} from '#/alf'
+import {Button, ButtonIcon, ButtonText} from '#/components/Button'
+import * as Dialog from '#/components/Dialog'
+import {Loader} from '#/components/Loader'
+import {Text} from '#/components/Typography'
+
+export function ChatDisabled() {
+  const t = useTheme()
+  return (
+    <View style={[a.p_md]}>
+      <View
+        style={[a.align_start, a.p_xl, a.rounded_md, t.atoms.bg_contrast_25]}>
+        <Text
+          style={[a.text_md, a.font_bold, a.pb_sm, t.atoms.text_contrast_high]}>
+          <Trans>Your chats have been disabled</Trans>
+        </Text>
+        <Text style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}>
+          <Trans>
+            Our moderators have reviewed reports and decided to disable your
+            access to chats on Bluesky.
+          </Trans>
+        </Text>
+        <AppealDialog />
+      </View>
+    </View>
+  )
+}
+
+function AppealDialog() {
+  const control = Dialog.useDialogControl()
+  const {_} = useLingui()
+
+  return (
+    <>
+      <Button
+        testID="appealDisabledChatBtn"
+        variant="ghost"
+        color="secondary"
+        size="small"
+        onPress={control.open}
+        label={_(msg`Appeal this decision`)}
+        style={a.mt_sm}>
+        <ButtonText>{_(msg`Appeal this decision`)}</ButtonText>
+      </Button>
+
+      <Dialog.Outer control={control}>
+        <Dialog.Handle />
+        <DialogInner />
+      </Dialog.Outer>
+    </>
+  )
+}
+
+function DialogInner() {
+  const {_} = useLingui()
+  const control = Dialog.useDialogContext()
+  const [details, setDetails] = useState('')
+  const {gtMobile} = useBreakpoints()
+  const agent = useAgent()
+  const {currentAccount} = useSession()
+
+  const {mutate, isPending} = useMutation({
+    mutationFn: async () => {
+      if (!currentAccount)
+        throw new Error('No current account, should be unreachable')
+      await agent.createModerationReport({
+        reasonType: ComAtprotoModerationDefs.REASONAPPEAL,
+        subject: {
+          $type: 'com.atproto.admin.defs#repoRef',
+          did: currentAccount.did,
+        },
+        reason: details,
+      })
+    },
+    onError: err => {
+      logger.error('Failed to submit chat appeal', {message: err})
+      Toast.show(_(msg`Failed to submit appeal, please try again.`), 'xmark')
+    },
+    onSuccess: () => {
+      control.close()
+      Toast.show(_(msg`Appeal submitted`))
+    },
+  })
+
+  const onSubmit = useCallback(() => mutate(), [mutate])
+  const onBack = useCallback(() => control.close(), [control])
+
+  return (
+    <Dialog.ScrollableInner label={_(msg`Appeal this decision`)}>
+      <Text style={[a.text_2xl, a.font_bold, a.pb_xs, a.leading_tight]}>
+        <Trans>Appeal this decision</Trans>
+      </Text>
+      <Text style={[a.text_md, a.leading_snug]}>
+        <Trans>This appeal will be sent to Bluesky's moderation service.</Trans>
+      </Text>
+      <View style={[a.my_md]}>
+        <Dialog.Input
+          label={_(msg`Text input field`)}
+          placeholder={_(
+            msg`Please explain why you think your chats were incorrectly disabled`,
+          )}
+          value={details}
+          onChangeText={setDetails}
+          autoFocus={true}
+          numberOfLines={3}
+          multiline
+          maxLength={300}
+        />
+      </View>
+
+      <View
+        style={
+          gtMobile
+            ? [a.flex_row, a.justify_between]
+            : [{flexDirection: 'column-reverse'}, a.gap_sm]
+        }>
+        <Button
+          testID="backBtn"
+          variant="solid"
+          color="secondary"
+          size="large"
+          onPress={onBack}
+          label={_(msg`Back`)}>
+          <ButtonText>{_(msg`Back`)}</ButtonText>
+        </Button>
+        <Button
+          testID="submitBtn"
+          variant="solid"
+          color="primary"
+          size="large"
+          onPress={onSubmit}
+          label={_(msg`Submit`)}>
+          <ButtonText>{_(msg`Submit`)}</ButtonText>
+          {isPending && <ButtonIcon icon={Loader} />}
+        </Button>
+      </View>
+      <Dialog.Close />
+    </Dialog.ScrollableInner>
+  )
+}