Bluesky app fork with some witchin' additions 馃挮
at readme-update 96 lines 3.1 kB view raw
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}