[READ ONLY MIRROR] Open Source TikTok alternative built on AT Protocol github.com/sprksocial/client
flutter atproto video dart
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(prefs): correct savedFeeds order

+33 -54
+32 -54
lib/src/core/network/atproto/data/repositories/feed_repository_impl.dart
··· 699 699 return []; 700 700 } 701 701 702 - // Separate timeline feeds from custom feeds 703 - final timelineFeeds = <SavedFeed>[]; 704 - final customFeeds = <SavedFeed>[]; 702 + final bskyUris = <AtUri>[]; 703 + final sprkUris = <AtUri>[]; 704 + 705 705 for (final savedFeed in savedFeeds) { 706 706 if (savedFeed.type == 'timeline') { 707 - timelineFeeds.add(savedFeed); 708 - } else { 709 - customFeeds.add(savedFeed); 707 + // Timeline feeds don't need generator views 708 + continue; 710 709 } 711 - } 712 - 713 - final feeds = <Feed>[]; 714 - 715 - // Add timeline feeds directly (they don't need generator views) 716 - for (final savedFeed in timelineFeeds) { 717 - feeds.add(Feed(type: 'timeline', config: savedFeed)); 718 - } 719 - 720 - if (customFeeds.isEmpty) { 721 - return feeds; 722 - } 723 - 724 - // Group custom feeds by type (Bluesky vs Spark) 725 - final bskyFeeds = <SavedFeed>[]; 726 - final sprkFeeds = <SavedFeed>[]; 727 - for (final savedFeed in customFeeds) { 728 710 final feedUri = AtUri(savedFeed.value); 729 711 final isBskyFeed = 730 712 feedUri.collection == NSID.parse('app.bsky.feed.generator'); 731 713 if (isBskyFeed) { 732 - bskyFeeds.add(savedFeed); 714 + bskyUris.add(feedUri); 733 715 } else { 734 - sprkFeeds.add(savedFeed); 716 + sprkUris.add(feedUri); 735 717 } 736 718 } 737 719 738 - // Fetch all Bluesky feed generators at once 739 - if (bskyFeeds.isNotEmpty) { 740 - final bskyUris = bskyFeeds 741 - .map((savedFeed) => AtUri(savedFeed.value)) 742 - .toList(); 743 - final bskyViews = await getFeedGenerators(bskyUris, bluesky: true); 744 - final viewMap = {for (final view in bskyViews) view.uri: view}; 745 - for (final savedFeed in bskyFeeds) { 720 + // Batch fetch all generator views 721 + final bskyViewsFuture = bskyUris.isNotEmpty 722 + ? getFeedGenerators(bskyUris, bluesky: true) 723 + : Future.value(<GeneratorView>[]); 724 + final sprkViewsFuture = sprkUris.isNotEmpty 725 + ? getFeedGenerators(sprkUris) 726 + : Future.value(<GeneratorView>[]); 727 + 728 + final bskyViews = await bskyViewsFuture; 729 + final sprkViews = await sprkViewsFuture; 730 + 731 + // Create view maps for quick lookup 732 + final bskyViewMap = {for (final view in bskyViews) view.uri: view}; 733 + final sprkViewMap = {for (final view in sprkViews) view.uri: view}; 734 + 735 + // Build feeds list preserving the original order from savedFeeds 736 + final feeds = <Feed>[]; 737 + for (final savedFeed in savedFeeds) { 738 + if (savedFeed.type == 'timeline') { 739 + feeds.add(Feed(type: 'timeline', config: savedFeed)); 740 + } else { 746 741 final feedUri = AtUri(savedFeed.value); 742 + final isBskyFeed = 743 + feedUri.collection == NSID.parse('app.bsky.feed.generator'); 744 + final viewMap = isBskyFeed ? bskyViewMap : sprkViewMap; 747 745 final view = viewMap[feedUri]; 748 746 if (view != null) { 749 747 feeds.add(Feed(type: 'feed', config: savedFeed, view: view)); 750 748 } else { 751 749 _logger.w( 752 - 'Feed generator view not found for Bluesky feed: $feedUri', 750 + 'Feed generator view not found for ${isBskyFeed ? 'Bluesky' : 'Spark'} feed: $feedUri', 753 751 ); 754 - // Fallback: create feed without view 755 - feeds.add(Feed(type: 'feed', config: savedFeed)); 756 - } 757 - } 758 - } 759 - 760 - // Fetch all Spark feed generators at once 761 - if (sprkFeeds.isNotEmpty) { 762 - final sprkUris = sprkFeeds 763 - .map((savedFeed) => AtUri(savedFeed.value)) 764 - .toList(); 765 - final sprkViews = await getFeedGenerators(sprkUris); 766 - final viewMap = {for (final view in sprkViews) view.uri: view}; 767 - for (final savedFeed in sprkFeeds) { 768 - final feedUri = AtUri(savedFeed.value); 769 - final view = viewMap[feedUri]; 770 - if (view != null) { 771 - feeds.add(Feed(type: 'feed', config: savedFeed, view: view)); 772 - } else { 773 - _logger.w('Feed generator view not found for Spark feed: $feedUri'); 774 752 // Fallback: create feed without view 775 753 feeds.add(Feed(type: 'feed', config: savedFeed)); 776 754 }
+1
lib/src/features/home/providers/feed_settings_visibility_provider.dart
··· 10 10 } 11 11 12 12 void setVisible(bool visible) { 13 + if (!ref.mounted) return; 13 14 state = visible; 14 15 } 15 16 }