67 lines
2.1 KiB
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);
|
|
});
|
|
|