MotorSignal-App/lib/services/social/social_feed_providers.dart

67 lines
2.1 KiB
Dart

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'social_feed_models.dart';
import 'social_feed_service.dart';
/// Provider for SocialFeedService singleton.
final socialFeedServiceProvider = Provider<SocialFeedService>((ref) {
FirebaseFirestore? firestore;
try {
if (Firebase.apps.isNotEmpty) {
firestore = FirebaseFirestore.instance;
}
} catch (_) {
firestore = null;
}
final service = SocialFeedService(firestore: firestore);
ref.onDispose(() {
service.dispose();
});
return service;
});
/// State provider for the active feed filter tab.
final feedFilterStateProvider = StateProvider<FeedFilter>((ref) {
return FeedFilter.allActivity;
});
/// StateNotifier providing instant synchronous initial feed items and reacting to changes.
class SocialFeedNotifier extends StateNotifier<List<SocialFeedItem>> {
final SocialFeedService _service;
final FeedFilter _filter;
StreamSubscription<List<SocialFeedItem>>? _sub;
SocialFeedNotifier(this._service, this._filter)
: super(_service.getFilteredItems(filter: _filter)) {
_sub = _service.getFeedStream(filter: _filter).listen((items) {
state = items;
});
}
@override
void dispose() {
_sub?.cancel();
super.dispose();
}
}
/// Primary feed provider with zero-latency synchronous initial data.
final socialFeedNotifierProvider =
StateNotifierProvider.autoDispose<SocialFeedNotifier, List<SocialFeedItem>>(
(ref) {
final service = ref.watch(socialFeedServiceProvider);
final filter = ref.watch(feedFilterStateProvider);
return SocialFeedNotifier(service, filter);
});
/// Stream provider for the filtered community social feed (preserved for backwards compatibility).
final socialFeedStreamProvider =
StreamProvider.autoDispose<List<SocialFeedItem>>((ref) {
final service = ref.watch(socialFeedServiceProvider);
final filter = ref.watch(feedFilterStateProvider);
return service.getFeedStream(filter: filter);
});