relatica/lib/services/timeline_manager.dart

55 wiersze
2.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:result_monad/result_monad.dart';
import '../globals.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/entry_tree_item.dart';
import '../models/exec_error.dart';
import '../models/timeline.dart';
import 'entry_manager_service.dart';
class TimelineManager extends ChangeNotifier {
static final _logger = Logger('$TimelineManager');
final cachedTimelines = <TimelineIdentifiers, Timeline>{};
// refresh timeline gets statuses newer than the newest in that timeline
Result<List<EntryTreeItem>, ExecError> getTimeline(TimelineIdentifiers type) {
final posts = cachedTimelines[type]?.posts;
if (posts != null) {
return Result.ok(posts);
}
refreshTimeline(type);
return Result.ok([]);
}
Future<void> refreshTimeline(TimelineIdentifiers type) async {
(await getIt<EntryManagerService>().updateTimeline(type)).match(
onSuccess: (posts) {
final timeline = cachedTimelines.putIfAbsent(type, () => Timeline(type));
_logger.finest('Posts returned for adding to $type: ${posts.length}');
timeline.addPosts(posts);
notifyListeners();
}, onError: (error) {
_logger.severe('Error getting timeline: $type}');
});
notifyListeners();
}
// All statuses get dumped into the entity mangager and get full assembled posts out of it
// Timeline keeps track of posts level only so can query timeline manager for those
// Should put backing store on timelines and entity manager so can recover from restart faster
// Have a purge caches button to start that over from scratch
// Should have a contacts manager with backing store as well
// Timeline view is new control that knows how to load timeline, scrolling around with refresh and get more
// Timeline Item view displays itself and children
// Has "Add Comment" value
// Has like/dislke
// Has reshare/quote reshare (if can get that working somehow)
// If our own has delete
}