Bluesky app fork with some witchin' additions 馃挮
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 139 lines 4.4 kB view raw
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}