An ATproto social media client -- with an independent Appview.
at main 89 lines 2.9 kB view raw
1import {useCallback} from 'react' 2import {type ModerationOpts} from '@atproto/api' 3import {msg, Trans} from '@lingui/macro' 4import {useLingui} from '@lingui/react' 5 6import {useRequireEmailVerification} from '#/lib/hooks/useRequireEmailVerification' 7import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' 8import {Button, ButtonIcon} from '#/components/Button' 9import {useDialogControl} from '#/components/Dialog' 10import {BellPlus_Stroke2_Corner0_Rounded as BellPlusIcon} from '#/components/icons/BellPlus' 11import {BellRinging_Filled_Corner0_Rounded as BellRingingIcon} from '#/components/icons/BellRinging' 12import * as Tooltip from '#/components/Tooltip' 13import {Text} from '#/components/Typography' 14import {useActivitySubscriptionsNudged} from '#/storage/hooks/activity-subscriptions-nudged' 15import type * as bsky from '#/types/bsky' 16import {SubscribeProfileDialog} from './SubscribeProfileDialog' 17 18export function SubscribeProfileButton({ 19 profile, 20 moderationOpts, 21}: { 22 profile: bsky.profile.AnyProfileView 23 moderationOpts: ModerationOpts 24}) { 25 const {_} = useLingui() 26 const requireEmailVerification = useRequireEmailVerification() 27 const subscribeDialogControl = useDialogControl() 28 const [activitySubscriptionsNudged, setActivitySubscriptionsNudged] = 29 useActivitySubscriptionsNudged() 30 31 const onDismissTooltip = () => { 32 setActivitySubscriptionsNudged(true) 33 } 34 35 const onPress = useCallback(() => { 36 subscribeDialogControl.open() 37 }, [subscribeDialogControl]) 38 39 const name = createSanitizedDisplayName(profile, true) 40 41 const wrappedOnPress = requireEmailVerification(onPress, { 42 instructions: [ 43 <Trans key="message"> 44 Before you can get notifications for {name}'s posts, you must first 45 verify your email. 46 </Trans>, 47 ], 48 }) 49 50 const isSubscribed = 51 profile.viewer?.activitySubscription?.post || 52 profile.viewer?.activitySubscription?.reply 53 54 const Icon = isSubscribed ? BellRingingIcon : BellPlusIcon 55 56 return ( 57 <> 58 <Tooltip.Outer 59 visible={!activitySubscriptionsNudged} 60 onVisibleChange={onDismissTooltip} 61 position="bottom"> 62 <Tooltip.Target> 63 <Button 64 accessibilityRole="button" 65 testID="dmBtn" 66 size="small" 67 color="secondary" 68 variant="solid" 69 shape="round" 70 label={_(msg`Get notified when ${name} posts`)} 71 onPress={wrappedOnPress}> 72 <ButtonIcon icon={Icon} size="md" /> 73 </Button> 74 </Tooltip.Target> 75 <Tooltip.TextBubble> 76 <Text> 77 <Trans>Get notified about new posts</Trans> 78 </Text> 79 </Tooltip.TextBubble> 80 </Tooltip.Outer> 81 82 <SubscribeProfileDialog 83 control={subscribeDialogControl} 84 profile={profile} 85 moderationOpts={moderationOpts} 86 /> 87 </> 88 ) 89}