An ATproto social media client -- with an independent Appview.
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}