3371038f7d
* Add round and square buttons
* Allow some style for buttons, add icons
* Change text selection color
* Center button text, whoops
* Outer layout, some primitive updates
* WIP
* onboarding feed prefs (#2590)
* add `style` to toggle label to modify text style
* Revert "add `style` to toggle label to modify text style"
This reverts commit 8f4b517b85.
* following feed prefs
* remove unnecessary memo
* reusable divider component
* org imports
* add finished screen
* Theme SelectedAccountCard
* Require at least 3 interests
* Placeholder save logic
* WIP algo feeds
* Improve lineHeight handling, add RichText, improve Link by adding InlineLink
* Inherit lineHeight in heading comps
* Algo feeds mostly good
* Topical feeds ish
* Layout cleanup
* Improve button styles
* moderation prefs for onboarding (#2594)
* WIP algo feeds
* modify controlalbelgroup typing for easy .map()
* adjust padding on button
* add moderation screen
* add moderation screen
* add moderation screen
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Fix toggle button styles
* A11y props on outer portal
* Put it all on red
* New data shape
* Handle mock data
* Bulk write (not yet)
* Remove interests validation
* Clean up interests
* i18n layout and first step
* Clean up suggested follows screen
* Clean up following step
* Clean up algo feeds step
* Clean up topical feeds
* Add skeleton for feed card
* WIP moderation step
* cleanup moderation styles (#2605)
* cleanup moderation styles
* fix(?) toggle button group styles
* adjust toggle to fit any screen
* Some more cleanup
* Icons
* ToggleButton tweaks
* Reset
* Hook up data
* Better suggestions
* Bulk write
* Some logging
* Use new api
* Concat topical feeds
* Metrics
* Disable links in RichText, feedcards
* Tweak primary feed cards
* Update metrics
* Fix layout shift
* Fix ToggleButton again, whoops
* Error state
* Bump api package, ensure interests are saved
* Better fix for autofill
* i18n, button positions
* Remove unused export
* Add default prefs object
* Fix overflow in user cards
* Add 2 lines of bios to suggested accounts cards
* Nits
* Don't resolve facets by default
* Update storybook
* Disable flag for now
* Remove age dialog from moderations step
* Improvements and tweaks to new onboarding
---------
Co-authored-by: Hailey <153161762+haileyok@users.noreply.github.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
159 lines
5.3 KiB
TypeScript
159 lines
5.3 KiB
TypeScript
import React from 'react'
|
|
import {View} from 'react-native'
|
|
import {useLingui} from '@lingui/react'
|
|
import {msg, Trans} from '@lingui/macro'
|
|
|
|
import {logger} from '#/logger'
|
|
import {atoms as a, useTheme} from '#/alf'
|
|
import {Button, ButtonText, ButtonIcon} from '#/components/Button'
|
|
import {News2_Stroke2_Corner0_Rounded as News} from '#/components/icons/News2'
|
|
import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check'
|
|
import {Growth_Stroke2_Corner0_Rounded as Growth} from '#/components/icons/Growth'
|
|
import {Trending2_Stroke2_Corner2_Rounded as Trending} from '#/components/icons/Trending2'
|
|
import {Text} from '#/components/Typography'
|
|
import {useOnboardingDispatch} from '#/state/shell'
|
|
import {Loader} from '#/components/Loader'
|
|
import {useSetSaveFeedsMutation} from '#/state/queries/preferences'
|
|
import {getAgent} from '#/state/session'
|
|
import {useAnalytics} from '#/lib/analytics/analytics'
|
|
|
|
import {Context} from '#/screens/Onboarding/state'
|
|
import {
|
|
Title,
|
|
Description,
|
|
OnboardingControls,
|
|
} from '#/screens/Onboarding/Layout'
|
|
import {IconCircle} from '#/screens/Onboarding/IconCircle'
|
|
import {
|
|
bulkWriteFollows,
|
|
sortPrimaryAlgorithmFeeds,
|
|
} from '#/screens/Onboarding/util'
|
|
|
|
export function StepFinished() {
|
|
const {_} = useLingui()
|
|
const t = useTheme()
|
|
const {track} = useAnalytics()
|
|
const {state, dispatch} = React.useContext(Context)
|
|
const onboardDispatch = useOnboardingDispatch()
|
|
const [saving, setSaving] = React.useState(false)
|
|
const {mutateAsync: saveFeeds} = useSetSaveFeedsMutation()
|
|
|
|
const finishOnboarding = React.useCallback(async () => {
|
|
setSaving(true)
|
|
|
|
const {
|
|
interestsStepResults,
|
|
suggestedAccountsStepResults,
|
|
algoFeedsStepResults,
|
|
topicalFeedsStepResults,
|
|
} = state
|
|
const {selectedInterests} = interestsStepResults
|
|
const selectedFeeds = [
|
|
...sortPrimaryAlgorithmFeeds(algoFeedsStepResults.feedUris),
|
|
...topicalFeedsStepResults.feedUris,
|
|
]
|
|
|
|
try {
|
|
await Promise.all([
|
|
bulkWriteFollows(suggestedAccountsStepResults.accountDids),
|
|
// these must be serial
|
|
(async () => {
|
|
await getAgent().setInterestsPref({tags: selectedInterests})
|
|
await saveFeeds({
|
|
saved: selectedFeeds,
|
|
pinned: selectedFeeds,
|
|
})
|
|
})(),
|
|
])
|
|
} catch (e: any) {
|
|
logger.info(`onboarding: bulk save failed`)
|
|
logger.error(e)
|
|
// don't alert the user, just let them into their account
|
|
}
|
|
|
|
setSaving(false)
|
|
dispatch({type: 'finish'})
|
|
onboardDispatch({type: 'finish'})
|
|
track('OnboardingV2:StepFinished:End')
|
|
track('OnboardingV2:Complete')
|
|
}, [state, dispatch, onboardDispatch, setSaving, saveFeeds, track])
|
|
|
|
React.useEffect(() => {
|
|
track('OnboardingV2:StepFinished:Start')
|
|
}, [track])
|
|
|
|
return (
|
|
<View style={[a.align_start]}>
|
|
<IconCircle icon={Check} style={[a.mb_2xl]} />
|
|
|
|
<Title>
|
|
<Trans>You're ready to go!</Trans>
|
|
</Title>
|
|
<Description>
|
|
<Trans>We hope you have a wonderful time. Remember, Bluesky is:</Trans>
|
|
</Description>
|
|
|
|
<View style={[a.pt_5xl, a.gap_3xl]}>
|
|
<View style={[a.flex_row, a.align_center, a.w_full, a.gap_lg]}>
|
|
<IconCircle icon={Growth} size="lg" style={{width: 48, height: 48}} />
|
|
<View style={[a.flex_1, a.gap_xs]}>
|
|
<Text style={[a.font_bold, a.text_lg]}>
|
|
<Trans>Public</Trans>
|
|
</Text>
|
|
<Text
|
|
style={[t.atoms.text_contrast_500, a.text_md, a.leading_snug]}>
|
|
<Trans>
|
|
Your posts, likes, and blocks are public. Mutes are private.
|
|
</Trans>
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
<View style={[a.flex_row, a.align_center, a.w_full, a.gap_lg]}>
|
|
<IconCircle icon={News} size="lg" style={{width: 48, height: 48}} />
|
|
<View style={[a.flex_1, a.gap_xs]}>
|
|
<Text style={[a.font_bold, a.text_lg]}>
|
|
<Trans>Open</Trans>
|
|
</Text>
|
|
<Text
|
|
style={[t.atoms.text_contrast_500, a.text_md, a.leading_snug]}>
|
|
<Trans>Never lose access to your followers and data.</Trans>
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
<View style={[a.flex_row, a.align_center, a.w_full, a.gap_lg]}>
|
|
<IconCircle
|
|
icon={Trending}
|
|
size="lg"
|
|
style={{width: 48, height: 48}}
|
|
/>
|
|
<View style={[a.flex_1, a.gap_xs]}>
|
|
<Text style={[a.font_bold, a.text_lg]}>
|
|
<Trans>Flexible</Trans>
|
|
</Text>
|
|
<Text
|
|
style={[t.atoms.text_contrast_500, a.text_md, a.leading_snug]}>
|
|
<Trans>Choose the algorithms that power your custom feeds.</Trans>
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
|
|
<OnboardingControls.Portal>
|
|
<Button
|
|
disabled={saving}
|
|
key={state.activeStep} // remove focus state on nav
|
|
variant="gradient"
|
|
color="gradient_sky"
|
|
size="large"
|
|
label={_(msg`Complete onboarding and start using your account`)}
|
|
onPress={finishOnboarding}>
|
|
<ButtonText>
|
|
{saving ? <Trans>Finalizing</Trans> : <Trans>Let's go!</Trans>}
|
|
</ButtonText>
|
|
{saving && <ButtonIcon icon={Loader} position="right" />}
|
|
</Button>
|
|
</OnboardingControls.Portal>
|
|
</View>
|
|
)
|
|
}
|