diff options
author | Samuel Newman <mozzius@protonmail.com> | 2024-10-02 22:21:59 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-02 22:21:59 +0300 |
commit | 13c9c79aeec77edc33b1a926843b005c14acccc7 (patch) | |
tree | 0ce80c052a7e504c99e842f0ba6a0f1f2f379a1e /src/screens/Messages/components/ChatDisabled.tsx | |
parent | 405966830ccdbee6152037eebb76c4815ff5526c (diff) | |
download | voidsky-13c9c79aeec77edc33b1a926843b005c14acccc7.tar.zst |
move files around (#5576)
Diffstat (limited to 'src/screens/Messages/components/ChatDisabled.tsx')
-rw-r--r-- | src/screens/Messages/components/ChatDisabled.tsx | 150 |
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> + ) +} |