···1212export const EMBED_SERVICE = 'https://embed.bsky.app'
1313export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js`
1414export const BSKY_DOWNLOAD_URL = 'https://bsky.app/download'
1515+export const STARTER_PACK_MAX_SIZE = 150
15161617// HACK
1718// Yes, this is exactly what it looks like. It's a hard-coded constant
+11-8
src/screens/Onboarding/StepFinished.tsx
···2323import {uploadBlob} from 'lib/api'
2424import {useRequestNotificationsPermission} from 'lib/notifications/notifications'
2525import {useSetHasCheckedForStarterPack} from 'state/preferences/used-starter-packs'
2626+import {getAllListMembers} from 'state/queries/list-members'
2627import {
2728 useActiveStarterPack,
2829 useSetActiveStarterPack,
···7374 starterPack: activeStarterPack.uri,
7475 })
7576 starterPack = spRes.data.starterPack
7676-7777- if (starterPack.list) {
7878- const listRes = await agent.app.bsky.graph.getList({
7979- list: starterPack.list.uri,
8080- limit: 50,
8181- })
8282- listItems = listRes.data.items
8383- }
8477 } catch (e) {
8578 logger.error('Failed to fetch starter pack', {safeMessage: e})
7979+ // don't tell the user, just get them through onboarding.
8080+ }
8181+ try {
8282+ if (starterPack?.list) {
8383+ listItems = await getAllListMembers(agent, starterPack.list.uri)
8484+ }
8585+ } catch (e) {
8686+ logger.error('Failed to fetch starter pack list items', {
8787+ safeMessage: e,
8888+ })
8689 // don't tell the user, just get them through onboarding.
8790 }
8891 }
+8-4
src/screens/Onboarding/util.ts
···44 BskyAgent,
55} from '@atproto/api'
66import {TID} from '@atproto/common-web'
77+import chunk from 'lodash.chunk'
7889import {until} from '#/lib/async/until'
910···2930 value: r,
3031 }))
31323232- await agent.com.atproto.repo.applyWrites({
3333- repo: session.did,
3434- writes: followWrites,
3535- })
3333+ const chunks = chunk(followWrites, 50)
3434+ for (const chunk of chunks) {
3535+ await agent.com.atproto.repo.applyWrites({
3636+ repo: session.did,
3737+ writes: chunk,
3838+ })
3939+ }
3640 await whenFollowsIndexed(agent, session.did, res => !!res.data.follows.length)
37413842 const followUris = new Map()
+40-29
src/screens/StarterPack/StarterPackScreen.tsx
···3232import {isWeb} from 'platform/detection'
3333import {updateProfileShadow} from 'state/cache/profile-shadow'
3434import {useModerationOpts} from 'state/preferences/moderation-opts'
3535+import {getAllListMembers} from 'state/queries/list-members'
3536import {useResolvedStarterPackShortLink} from 'state/queries/resolve-short-link'
3637import {useResolveDidQuery} from 'state/queries/resolve-uri'
3738import {useShortenLink} from 'state/queries/shorten-link'
···327328328329 setIsProcessing(true)
329330331331+ let listItems: AppBskyGraphDefs.ListItemView[] = []
330332 try {
331331- const list = await agent.app.bsky.graph.getList({
332332- list: starterPack.list.uri,
333333+ listItems = await getAllListMembers(agent, starterPack.list.uri)
334334+ } catch (e) {
335335+ setIsProcessing(false)
336336+ Toast.show(_(msg`An error occurred while trying to follow all`), 'xmark')
337337+ logger.error('Failed to get list members for starter pack', {
338338+ safeMessage: e,
333339 })
334334- const dids = list.data.items
335335- .filter(
336336- li =>
337337- li.subject.did !== currentAccount?.did &&
338338- !isBlockedOrBlocking(li.subject) &&
339339- !isMuted(li.subject) &&
340340- !li.subject.viewer?.following,
341341- )
342342- .map(li => li.subject.did)
340340+ return
341341+ }
343342344344- const followUris = await bulkWriteFollows(agent, dids)
345345-346346- batchedUpdates(() => {
347347- for (let did of dids) {
348348- updateProfileShadow(queryClient, did, {
349349- followingUri: followUris.get(did),
350350- })
351351- }
352352- })
343343+ const dids = listItems
344344+ .filter(
345345+ li =>
346346+ li.subject.did !== currentAccount?.did &&
347347+ !isBlockedOrBlocking(li.subject) &&
348348+ !isMuted(li.subject) &&
349349+ !li.subject.viewer?.following,
350350+ )
351351+ .map(li => li.subject.did)
353352354354- logEvent('starterPack:followAll', {
355355- logContext: 'StarterPackProfilesList',
356356- starterPack: starterPack.uri,
357357- count: dids.length,
358358- })
359359- captureAction(ProgressGuideAction.Follow, dids.length)
360360- Toast.show(_(msg`All accounts have been followed!`))
353353+ let followUris: Map<string, string>
354354+ try {
355355+ followUris = await bulkWriteFollows(agent, dids)
361356 } catch (e) {
362362- Toast.show(_(msg`An error occurred while trying to follow all`), 'xmark')
363363- } finally {
364357 setIsProcessing(false)
358358+ Toast.show(_(msg`An error occurred while trying to follow all`), 'xmark')
359359+ logger.error('Failed to follow all accounts', {safeMessage: e})
365360 }
361361+362362+ setIsProcessing(false)
363363+ batchedUpdates(() => {
364364+ for (let did of dids) {
365365+ updateProfileShadow(queryClient, did, {
366366+ followingUri: followUris.get(did),
367367+ })
368368+ }
369369+ })
370370+ Toast.show(_(msg`All accounts have been followed!`))
371371+ captureAction(ProgressGuideAction.Follow, dids.length)
372372+ logEvent('starterPack:followAll', {
373373+ logContext: 'StarterPackProfilesList',
374374+ starterPack: starterPack.uri,
375375+ count: dids.length,
376376+ })
366377 }
367378368379 if (!AppBskyGraphStarterpack.isRecord(record)) {
+6-4
src/screens/StarterPack/Wizard/State.tsx
···77import {GeneratorView} from '@atproto/api/dist/client/types/app/bsky/feed/defs'
88import {msg} from '@lingui/macro'
991010+import {STARTER_PACK_MAX_SIZE} from 'lib/constants'
1011import {useSession} from 'state/session'
1112import * as Toast from '#/view/com/util/Toast'
1213···7374 updatedState = {...state, description: action.description}
7475 break
7576 case 'AddProfile':
7676- if (state.profiles.length >= 51) {
7777+ if (state.profiles.length > STARTER_PACK_MAX_SIZE) {
7778 Toast.show(
7878- msg`You may only add up to 50 profiles`.message ?? '',
7979+ msg`You may only add up to ${STARTER_PACK_MAX_SIZE} profiles`
8080+ .message ?? '',
7981 'info',
8082 )
8183 } else {
···9193 }
9294 break
9395 case 'AddFeed':
9494- if (state.feeds.length >= 50) {
9595- Toast.show(msg`You may only add up to 50 feeds`.message ?? '', 'info')
9696+ if (state.feeds.length >= 3) {
9797+ Toast.show(msg`You may only add up to 3 feeds`.message ?? '', 'info')
9698 } else {
9799 updatedState = {...state, feeds: [...state.feeds, action.feed]}
98100 }