forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import React from 'react'
2import {View} from 'react-native'
3import {type ModerationDecision} from '@atproto/api'
4import {msg, Trans} from '@lingui/macro'
5import {useLingui} from '@lingui/react'
6
7import {useProfileShadow} from '#/state/cache/profile-shadow'
8import {useProfileBlockMutationQueue} from '#/state/queries/profile'
9import {atoms as a, useBreakpoints, useTheme} from '#/alf'
10import {Button, ButtonText} from '#/components/Button'
11import {useDialogControl} from '#/components/Dialog'
12import {Divider} from '#/components/Divider'
13import {BlockedByListDialog} from '#/components/dms/BlockedByListDialog'
14import {LeaveConvoPrompt} from '#/components/dms/LeaveConvoPrompt'
15import {ReportConversationPrompt} from '#/components/dms/ReportConversationPrompt'
16import {Text} from '#/components/Typography'
17import type * as bsky from '#/types/bsky'
18
19export function MessagesListBlockedFooter({
20 recipient: initialRecipient,
21 convoId,
22 hasMessages,
23 moderation,
24}: {
25 recipient: bsky.profile.AnyProfileView
26 convoId: string
27 hasMessages: boolean
28 moderation: ModerationDecision
29}) {
30 const t = useTheme()
31 const {gtMobile} = useBreakpoints()
32 const {_} = useLingui()
33 const recipient = useProfileShadow(initialRecipient)
34 const [__, queueUnblock] = useProfileBlockMutationQueue(recipient)
35
36 const leaveConvoControl = useDialogControl()
37 const reportControl = useDialogControl()
38 const blockedByListControl = useDialogControl()
39
40 const {listBlocks, userBlock} = React.useMemo(() => {
41 const modui = moderation.ui('profileView')
42 const blocks = modui.alerts.filter(alert => alert.type === 'blocking')
43 const listBlocks = blocks.filter(alert => alert.source.type === 'list')
44 const userBlock = blocks.find(alert => alert.source.type === 'user')
45 return {
46 listBlocks,
47 userBlock,
48 }
49 }, [moderation])
50
51 const isBlocking = !!userBlock || !!listBlocks.length
52
53 const onUnblockPress = React.useCallback(() => {
54 if (listBlocks.length) {
55 blockedByListControl.open()
56 } else {
57 queueUnblock()
58 }
59 }, [blockedByListControl, listBlocks, queueUnblock])
60
61 return (
62 <View style={[hasMessages && a.pt_md, a.pb_xl, a.gap_lg]}>
63 <Divider />
64 <Text style={[a.text_md, a.font_semi_bold, a.text_center]}>
65 {isBlocking ? (
66 <Trans>You have blocked this user</Trans>
67 ) : (
68 <Trans>This user has blocked you</Trans>
69 )}
70 </Text>
71
72 <View style={[a.flex_row, a.justify_between, a.gap_lg, a.px_md]}>
73 <Button
74 label={_(msg`Leave chat`)}
75 color="secondary"
76 variant="solid"
77 size="small"
78 style={[a.flex_1]}
79 onPress={leaveConvoControl.open}>
80 <ButtonText style={{color: t.palette.negative_500}}>
81 <Trans>Leave chat</Trans>
82 </ButtonText>
83 </Button>
84 <Button
85 label={_(msg`Report`)}
86 color="secondary"
87 variant="solid"
88 size="small"
89 style={[a.flex_1]}
90 onPress={reportControl.open}>
91 <ButtonText style={{color: t.palette.negative_500}}>
92 <Trans>Report</Trans>
93 </ButtonText>
94 </Button>
95 {isBlocking && gtMobile && (
96 <Button
97 label={_(msg`Unblock`)}
98 color="secondary"
99 variant="solid"
100 size="small"
101 style={[a.flex_1]}
102 onPress={onUnblockPress}>
103 <ButtonText style={{color: t.palette.primary_500}}>
104 <Trans>Unblock</Trans>
105 </ButtonText>
106 </Button>
107 )}
108 </View>
109 {isBlocking && !gtMobile && (
110 <View style={[a.flex_row, a.justify_center, a.px_md]}>
111 <Button
112 label={_(msg`Unblock`)}
113 color="secondary"
114 variant="solid"
115 size="small"
116 style={[a.flex_1]}
117 onPress={onUnblockPress}>
118 <ButtonText style={{color: t.palette.primary_500}}>
119 <Trans>Unblock</Trans>
120 </ButtonText>
121 </Button>
122 </View>
123 )}
124
125 <LeaveConvoPrompt
126 control={leaveConvoControl}
127 currentScreen="conversation"
128 convoId={convoId}
129 />
130
131 <ReportConversationPrompt control={reportControl} />
132
133 <BlockedByListDialog
134 control={blockedByListControl}
135 listBlocks={listBlocks}
136 />
137 </View>
138 )
139}