Onboarding recommended follows (#1457)
* upgrade api package * add RecommendedFollows as a step in onboarding * add list of recommended follows from suggested actor model * remove dead code * hoist suggestedActors into onboarding model * add comments * load more suggested follows on follow * styling changes * add animation * tweak animations * adjust styling slightly * adjust styles on mobile * styling improvements for web * fix text alignment in RecommendedFollows * dedupe inserted suggestions * fix animation duration * Minor spacing tweak --------- Co-authored-by: Paul Frazee <pfrazee@gmail.com> and Eric Bailey <git@esb.lol>
This commit is contained in:
parent
da8499c881
commit
859588c3f6
11 changed files with 450 additions and 20 deletions
|
@ -2,10 +2,12 @@ import {makeAutoObservable} from 'mobx'
|
|||
import {RootStoreModel} from '../root-store'
|
||||
import {hasProp} from 'lib/type-guards'
|
||||
import {track} from 'lib/analytics/analytics'
|
||||
import {SuggestedActorsModel} from './suggested-actors'
|
||||
|
||||
export const OnboardingScreenSteps = {
|
||||
Welcome: 'Welcome',
|
||||
RecommendedFeeds: 'RecommendedFeeds',
|
||||
RecommendedFollows: 'RecommendedFollows',
|
||||
Home: 'Home',
|
||||
} as const
|
||||
|
||||
|
@ -16,7 +18,11 @@ export class OnboardingModel {
|
|||
// state
|
||||
step: OnboardingStep = 'Home' // default state to skip onboarding, only enabled for new users by calling start()
|
||||
|
||||
// data
|
||||
suggestedActors: SuggestedActorsModel
|
||||
|
||||
constructor(public rootStore: RootStoreModel) {
|
||||
this.suggestedActors = new SuggestedActorsModel(this.rootStore)
|
||||
makeAutoObservable(this, {
|
||||
rootStore: false,
|
||||
hydrate: false,
|
||||
|
@ -56,6 +62,11 @@ export class OnboardingModel {
|
|||
this.step = 'RecommendedFeeds'
|
||||
return this.step
|
||||
} else if (this.step === 'RecommendedFeeds') {
|
||||
this.step = 'RecommendedFollows'
|
||||
// prefetch recommended follows
|
||||
this.suggestedActors.loadMore(true)
|
||||
return this.step
|
||||
} else if (this.step === 'RecommendedFollows') {
|
||||
this.finish()
|
||||
return this.step
|
||||
} else {
|
||||
|
|
|
@ -19,6 +19,7 @@ export class SuggestedActorsModel {
|
|||
loadMoreCursor: string | undefined = undefined
|
||||
error = ''
|
||||
hasMore = false
|
||||
lastInsertedAtIndex = -1
|
||||
|
||||
// data
|
||||
suggestions: SuggestedActor[] = []
|
||||
|
@ -110,6 +111,24 @@ export class SuggestedActorsModel {
|
|||
}
|
||||
})
|
||||
|
||||
async insertSuggestionsByActor(actor: string, indexToInsertAt: number) {
|
||||
// fetch suggestions
|
||||
const res =
|
||||
await this.rootStore.agent.app.bsky.graph.getSuggestedFollowsByActor({
|
||||
actor: actor,
|
||||
})
|
||||
const {suggestions: moreSuggestions} = res.data
|
||||
this.rootStore.me.follows.hydrateProfiles(moreSuggestions)
|
||||
// dedupe
|
||||
const toInsert = moreSuggestions.filter(
|
||||
s => !this.suggestions.find(s2 => s2.did === s.did),
|
||||
)
|
||||
// insert
|
||||
this.suggestions.splice(indexToInsertAt + 1, 0, ...toInsert)
|
||||
// update index
|
||||
this.lastInsertedAtIndex = indexToInsertAt
|
||||
}
|
||||
|
||||
// state transitions
|
||||
// =
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue