@@ -3,7 +3,7 @@ import { api } from '$lib/services/api';
33import { profileService } from '$lib/services/profiles' ;
44import { syncQueue , type FollowPayload } from '$lib/services/sync-queue' ;
55import { syncStore } from './sync.svelte' ;
6- import type { DiscoverUser , SocialShare } from '$lib/types' ;
6+ import type { DiscoverUser , FollowedUserDetailed , SocialShare } from '$lib/types' ;
77import { generateTid } from '$lib/utils/tid' ;
88
99export interface FollowedUser {
@@ -16,8 +16,14 @@ function createSocialStore() {
1616 let popularShares = $state < ( SocialShare & { shareCount : number } ) [ ] > ( [ ] ) ;
1717 let followedUsers = $state < FollowedUser [ ] > ( [ ] ) ;
1818 let discoverUsers = $state < DiscoverUser [ ] > ( [ ] ) ;
19+ let skyreaderFollows = $state < FollowedUserDetailed [ ] > ( [ ] ) ;
20+ let blueskyFollows = $state < FollowedUserDetailed [ ] > ( [ ] ) ;
21+ let skyreaderFollowsNextOffset = $state < number | null > ( null ) ;
22+ let blueskyFollowsNextOffset = $state < number | null > ( null ) ;
1923 let isLoadingFeed = $state ( false ) ;
2024 let isLoadingUsers = $state ( false ) ;
25+ let isLoadingSkyreaderFollows = $state ( false ) ;
26+ let isLoadingBlueskyFollows = $state ( false ) ;
2127 let isDiscoverLoading = $state ( false ) ;
2228 let isSyncing = $state ( false ) ;
2329 let cursor = $state < string | null > ( null ) ;
@@ -131,6 +137,60 @@ function createSocialStore() {
131137 }
132138 }
133139
140+ async function loadSkyreaderFollows ( reset = true ) {
141+ if ( isLoadingSkyreaderFollows ) return ;
142+ if ( ! reset && skyreaderFollowsNextOffset === null ) return ;
143+
144+ isLoadingSkyreaderFollows = true ;
145+ error = null ;
146+
147+ try {
148+ const offset = reset ? 0 : ( skyreaderFollowsNextOffset ?? 0 ) ;
149+ const result = await api . getFollowingDetailed ( 'skyreader' , 50 , offset ) ;
150+
151+ if ( reset ) {
152+ skyreaderFollows = result . users ;
153+ } else {
154+ skyreaderFollows = [ ...skyreaderFollows , ...result . users ] ;
155+ }
156+ skyreaderFollowsNextOffset = result . nextOffset ;
157+
158+ // Prefetch profiles from Bluesky
159+ profileService . prefetch ( result . users . map ( ( u ) => u . did ) ) ;
160+ } catch ( e ) {
161+ error = e instanceof Error ? e . message : 'Failed to load Skyreader follows' ;
162+ } finally {
163+ isLoadingSkyreaderFollows = false ;
164+ }
165+ }
166+
167+ async function loadBlueskyFollows ( reset = true ) {
168+ if ( isLoadingBlueskyFollows ) return ;
169+ if ( ! reset && blueskyFollowsNextOffset === null ) return ;
170+
171+ isLoadingBlueskyFollows = true ;
172+ error = null ;
173+
174+ try {
175+ const offset = reset ? 0 : ( blueskyFollowsNextOffset ?? 0 ) ;
176+ const result = await api . getFollowingDetailed ( 'bluesky' , 50 , offset ) ;
177+
178+ if ( reset ) {
179+ blueskyFollows = result . users ;
180+ } else {
181+ blueskyFollows = [ ...blueskyFollows , ...result . users ] ;
182+ }
183+ blueskyFollowsNextOffset = result . nextOffset ;
184+
185+ // Prefetch profiles from Bluesky
186+ profileService . prefetch ( result . users . map ( ( u ) => u . did ) ) ;
187+ } catch ( e ) {
188+ error = e instanceof Error ? e . message : 'Failed to load Bluesky follows' ;
189+ } finally {
190+ isLoadingBlueskyFollows = false ;
191+ }
192+ }
193+
134194 async function followUser ( did : string ) : Promise < boolean > {
135195 const rkey = generateTid ( ) ;
136196
@@ -199,6 +259,10 @@ function createSocialStore() {
199259 popularShares = [ ] ;
200260 followedUsers = [ ] ;
201261 discoverUsers = [ ] ;
262+ skyreaderFollows = [ ] ;
263+ blueskyFollows = [ ] ;
264+ skyreaderFollowsNextOffset = null ;
265+ blueskyFollowsNextOffset = null ;
202266 cursor = null ;
203267 hasMore = true ;
204268 error = null ;
@@ -221,9 +285,27 @@ function createSocialStore() {
221285 get discoverUsers ( ) {
222286 return discoverUsers ;
223287 } ,
288+ get skyreaderFollows ( ) {
289+ return skyreaderFollows ;
290+ } ,
291+ get blueskyFollows ( ) {
292+ return blueskyFollows ;
293+ } ,
294+ get hasMoreSkyreaderFollows ( ) {
295+ return skyreaderFollowsNextOffset !== null ;
296+ } ,
297+ get hasMoreBlueskyFollows ( ) {
298+ return blueskyFollowsNextOffset !== null ;
299+ } ,
224300 get isLoading ( ) {
225301 return isLoading ;
226302 } ,
303+ get isLoadingSkyreaderFollows ( ) {
304+ return isLoadingSkyreaderFollows ;
305+ } ,
306+ get isLoadingBlueskyFollows ( ) {
307+ return isLoadingBlueskyFollows ;
308+ } ,
227309 get isDiscoverLoading ( ) {
228310 return isDiscoverLoading ;
229311 } ,
@@ -240,6 +322,8 @@ function createSocialStore() {
240322 loadPopular,
241323 loadFollowedUsers,
242324 loadDiscoverUsers,
325+ loadSkyreaderFollows,
326+ loadBlueskyFollows,
243327 followUser,
244328 unfollowInApp,
245329 syncFollows,
0 commit comments