about summary refs log tree commit diff
path: root/src/screens/Onboarding/util.ts
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-01-25 22:22:40 -0600
committerGitHub <noreply@github.com>2024-01-25 20:22:40 -0800
commit3371038f7d8b740f2415d3a54dc99b69e0598042 (patch)
tree9ef008e132f268ce6a8a23765ab34fda71a4bedc /src/screens/Onboarding/util.ts
parent5443503593a67cc7ff6e081ef9b1fe66ea0cbe0d (diff)
downloadvoidsky-3371038f7d8b740f2415d3a54dc99b69e0598042.tar.zst
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 8f4b517b8585ca64a4bf44f6cb40ac070ece8932.

* 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>
Diffstat (limited to 'src/screens/Onboarding/util.ts')
-rw-r--r--src/screens/Onboarding/util.ts112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/screens/Onboarding/util.ts b/src/screens/Onboarding/util.ts
new file mode 100644
index 000000000..2a709a67b
--- /dev/null
+++ b/src/screens/Onboarding/util.ts
@@ -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
+  })
+}