New Onboarding (#2596)
* 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>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
import {AppBskyGraphFollow, AppBskyGraphGetFollows} from '@atproto/api'
|
||||
|
||||
import {until} from '#/lib/async/until'
|
||||
import {getAgent} from '#/state/session'
|
||||
|
||||
function shuffle(array: any) {
|
||||
let currentIndex = array.length,
|
||||
randomIndex
|
||||
|
||||
// While there remain elements to shuffle.
|
||||
while (currentIndex > 0) {
|
||||
// Pick a remaining element.
|
||||
randomIndex = Math.floor(Math.random() * currentIndex)
|
||||
currentIndex--
|
||||
|
||||
// And swap it with the current element.
|
||||
;[array[currentIndex], array[randomIndex]] = [
|
||||
array[randomIndex],
|
||||
array[currentIndex],
|
||||
]
|
||||
}
|
||||
|
||||
return array
|
||||
}
|
||||
|
||||
export function aggregateInterestItems(
|
||||
interests: string[],
|
||||
map: {[key: string]: string[]},
|
||||
fallbackItems: string[],
|
||||
) {
|
||||
const selected = interests.length
|
||||
const all = interests
|
||||
.map(i => {
|
||||
const suggestions = shuffle(map[i])
|
||||
|
||||
if (selected === 1) {
|
||||
return suggestions // return all
|
||||
} else if (selected === 2) {
|
||||
return suggestions.slice(0, 5) // return 5
|
||||
} else {
|
||||
return suggestions.slice(0, 3) // return 3
|
||||
}
|
||||
})
|
||||
.flat()
|
||||
// dedupe suggestions
|
||||
const results = Array.from(new Set(all))
|
||||
|
||||
// backfill
|
||||
if (results.length < 20) {
|
||||
results.push(...shuffle(fallbackItems))
|
||||
}
|
||||
|
||||
// dedupe and return 20
|
||||
return Array.from(new Set(results)).slice(0, 20)
|
||||
}
|
||||
|
||||
export async function bulkWriteFollows(dids: string[]) {
|
||||
const session = getAgent().session
|
||||
|
||||
if (!session) {
|
||||
throw new Error(`bulkWriteFollows failed: no session`)
|
||||
}
|
||||
|
||||
const followRecords: AppBskyGraphFollow.Record[] = dids.map(did => {
|
||||
return {
|
||||
$type: 'app.bsky.graph.follow',
|
||||
subject: did,
|
||||
createdAt: new Date().toISOString(),
|
||||
}
|
||||
})
|
||||
const followWrites = followRecords.map(r => ({
|
||||
$type: 'com.atproto.repo.applyWrites#create',
|
||||
collection: 'app.bsky.graph.follow',
|
||||
value: r,
|
||||
}))
|
||||
|
||||
await getAgent().com.atproto.repo.applyWrites({
|
||||
repo: session.did,
|
||||
writes: followWrites,
|
||||
})
|
||||
await whenFollowsIndexed(session.did, res => !!res.data.follows.length)
|
||||
}
|
||||
|
||||
async function whenFollowsIndexed(
|
||||
actor: string,
|
||||
fn: (res: AppBskyGraphGetFollows.Response) => boolean,
|
||||
) {
|
||||
await until(
|
||||
5, // 5 tries
|
||||
1e3, // 1s delay between tries
|
||||
fn,
|
||||
() =>
|
||||
getAgent().app.bsky.graph.getFollows({
|
||||
actor,
|
||||
limit: 1,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Kinda hacky, but we want For Your or Discover to appear as the first pinned
|
||||
* feed after Following
|
||||
*/
|
||||
export function sortPrimaryAlgorithmFeeds(uris: string[]) {
|
||||
return uris.sort(uri => {
|
||||
return uri.includes('the-algorithm')
|
||||
? -1
|
||||
: uri.includes('whats-hot')
|
||||
? 0
|
||||
: 1
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user