forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {View} from 'react-native'
2import * as Contacts from 'expo-contacts'
3import {msg, Trans} from '@lingui/macro'
4import {useLingui} from '@lingui/react'
5import {useQuery} from '@tanstack/react-query'
6
7import {urls} from '#/lib/constants'
8import {useCallOnce} from '#/lib/once'
9import {atoms as a} from '#/alf'
10import {Admonition} from '#/components/Admonition'
11import {Button, ButtonText} from '#/components/Button'
12import {ContactsHeroImage} from '#/components/contacts/components/HeroImage'
13import {InlineLinkText} from '#/components/Link'
14import {useAnalytics} from '#/analytics'
15import {
16 OnboardingControls,
17 OnboardingDescriptionText,
18 OnboardingPosition,
19 OnboardingTitleText,
20} from '../Layout'
21import {useOnboardingInternalState} from '../state'
22
23export function StepFindContactsIntro() {
24 const ax = useAnalytics()
25 const {_} = useLingui()
26 const {dispatch} = useOnboardingInternalState()
27
28 useCallOnce(() => {
29 ax.metric('onboarding:contacts:presented', {})
30 })()
31
32 const {data: isAvailable, isSuccess} = useQuery({
33 queryKey: ['contacts-available'],
34 queryFn: async () => await Contacts.isAvailableAsync(),
35 })
36
37 return (
38 <View style={[a.w_full, a.gap_sm]}>
39 <OnboardingPosition />
40 <ContactsHeroImage />
41 <OnboardingTitleText style={[a.mt_sm]}>
42 <Trans>Bluesky is more fun with friends</Trans>
43 </OnboardingTitleText>
44 <OnboardingDescriptionText>
45 <Trans>
46 Find your friends on Bluesky by verifying your phone number and
47 matching with your contacts. We protect your information and you
48 control what happens next.{' '}
49 <InlineLinkText
50 to={urls.website.blog.findFriendsAnnouncement}
51 label={_(
52 msg({
53 message: `Learn more about importing contacts`,
54 context: `english-only-resource`,
55 }),
56 )}
57 style={[a.text_md, a.leading_snug]}>
58 <Trans context="english-only-resource">Learn more</Trans>
59 </InlineLinkText>
60 </Trans>
61 </OnboardingDescriptionText>
62 {!isAvailable && isSuccess && (
63 <Admonition type="error">
64 <Trans>
65 Contact sync is not available on this device, as the app is unable
66 to access your contacts.
67 </Trans>
68 </Admonition>
69 )}
70
71 <OnboardingControls.Portal>
72 <View style={[a.gap_md]}>
73 <Button
74 onPress={() => dispatch({type: 'next'})}
75 label={_(msg`Import contacts`)}
76 size="large"
77 color="primary"
78 disabled={!isAvailable}>
79 <ButtonText>
80 <Trans>Import contacts</Trans>
81 </ButtonText>
82 </Button>
83 <Button
84 onPress={() => dispatch({type: 'skip-contacts'})}
85 label={_(msg`Skip`)}
86 size="large"
87 color="secondary">
88 <ButtonText>
89 <Trans>Skip</Trans>
90 </ButtonText>
91 </Button>
92 </View>
93 </OnboardingControls.Portal>
94 </View>
95 )
96}