···190190 String sort = 'latest',
191191 String? cursor,
192192 });
193193+194194+ /// Get a list of posts reposted by an actor
195195+ ///
196196+ /// [actor] The at-identifier of the actor (handle or DID)
197197+ /// [limit] The number of items to return (default 50, max 100)
198198+ /// [cursor] Pagination cursor for the next set of results
199199+ Future<({List<FeedViewPost> posts, String? cursor})> getActorReposts(
200200+ String actor, {
201201+ int limit = 50,
202202+ String? cursor,
203203+ });
193204}
···13501350 });
13511351 }
1352135213531353+ @override
13541354+ Future<({List<FeedViewPost> posts, String? cursor})> getActorReposts(
13551355+ String actor, {
13561356+ int limit = 50,
13571357+ String? cursor,
13581358+ }) async {
13591359+ _logger.d('Getting actor reposts for actor: $actor, limit: $limit, cursor: $cursor');
13601360+13611361+ return _client.executeWithRetry(() async {
13621362+ if (!_client.authRepository.isAuthenticated) {
13631363+ _logger.w('Not authenticated');
13641364+ throw Exception('Not authenticated');
13651365+ }
13661366+13671367+ final atproto = _client.authRepository.atproto;
13681368+ if (atproto == null) {
13691369+ _logger.e('AtProto not initialized');
13701370+ throw Exception('AtProto not initialized');
13711371+ }
13721372+13731373+ final parameters = <String, dynamic>{
13741374+ 'actor': actor,
13751375+ 'limit': limit,
13761376+ };
13771377+13781378+ if (cursor != null) {
13791379+ parameters['cursor'] = cursor;
13801380+ }
13811381+13821382+ final result = await atproto.get(
13831383+ NSID.parse('so.sprk.feed.getActorReposts'),
13841384+ parameters: parameters,
13851385+ headers: {'atproto-proxy': _client.sprkDid},
13861386+ to: (jsonMap) {
13871387+ final rawFeed = jsonMap['feed']! as List<dynamic>;
13881388+ final feedPosts = _parseAndFilterPosts<FeedViewPost>(
13891389+ rawPosts: rawFeed,
13901390+ fromJson: FeedViewPost.fromJson,
13911391+ hasMedia: _feedViewPostHasMedia,
13921392+ getUri: _getFeedViewPostUri,
13931393+ source: 'sprk actor reposts',
13941394+ );
13951395+ return (posts: feedPosts, cursor: jsonMap['cursor'] as String?);
13961396+ },
13971397+ adaptor: (uint8) => jsonDecode(utf8.decode(uint8 as List<int>)) as Map<String, dynamic>,
13981398+ );
13991399+ _logger.d('Actor reposts retrieved successfully: ${result.data.posts.length} posts');
14001400+ return result.data;
14011401+ });
14021402+ }
14031403+13531404 /// Helper method to determine content type based on file extension
13541405 String _getContentType(String videoPath) {
13551406 final extension = path.extension(videoPath).toLowerCase();
+1
lib/src/core/routing/app_router.dart
···110110 // Deep linking routes or routes that will be pushed on top of everything
111111 AutoRoute(page: StandalonePostRoute.page, path: '/post/:postUri'),
112112 AutoRoute(page: StandaloneProfileFeedRoute.page, path: '/profile-feed'),
113113+ AutoRoute(page: StandaloneRepostsFeedRoute.page, path: '/reposts-feed'),
113114 AutoRoute(
114115 page: ProfileRoute.page,
115116 path: '/profile/:did',
···51515252 @override
5353 Widget build(BuildContext context) {
5454- // Initialize the index provider SYNCHRONOUSLY before any child widgets build.
5454+ // Initialize the index provider after the build phase to avoid modifying providers during build.
5555 // This prevents race conditions where video widgets see the default index (0)
5656 // before the correct initial index is set.
5757 if (!_hasInitializedIndex) {
5858 _hasInitializedIndex = true;
5959- ref.read(profileFeedIndexProvider(widget.profileUri).notifier).setIndex(widget.initialPostIndex);
5959+ WidgetsBinding.instance.addPostFrameCallback((_) {
6060+ ref.read(profileFeedIndexProvider(widget.profileUri).notifier).setIndex(widget.initialPostIndex);
6161+ });
6062 }
61636264 final feedState = ref.watch(profileFeedProvider(profileAtUri, widget.videosOnly));