auto-refresh message-list on FB message receive
This commit is contained in:
@@ -9,8 +9,6 @@ class AppBarState extends ChangeNotifier {
|
||||
|
||||
AppBarState._internal() {}
|
||||
|
||||
List<void Function(String)> _searchListeners = [];
|
||||
|
||||
bool _loadingIndeterminate = false;
|
||||
bool get loadingIndeterminate => _loadingIndeterminate;
|
||||
|
||||
@@ -28,18 +26,4 @@ class AppBarState extends ChangeNotifier {
|
||||
_showSearchField = v;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void subscribeSearchListener(void Function(String) listener) {
|
||||
_searchListeners.add(listener);
|
||||
}
|
||||
|
||||
void unsubscribeSearchListener(void Function(String) listener) {
|
||||
_searchListeners.remove(listener);
|
||||
}
|
||||
|
||||
void notifySearchListeners(String query) {
|
||||
for (var listener in _searchListeners) {
|
||||
listener(query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
47
flutter/lib/state/app_events.dart
Normal file
47
flutter/lib/state/app_events.dart
Normal file
@@ -0,0 +1,47 @@
|
||||
import 'package:simplecloudnotifier/models/scn_message.dart';
|
||||
import 'package:simplecloudnotifier/state/application_log.dart';
|
||||
|
||||
class AppEvents {
|
||||
static AppEvents? _singleton = AppEvents._internal();
|
||||
|
||||
factory AppEvents() {
|
||||
return _singleton ?? (_singleton = AppEvents._internal());
|
||||
}
|
||||
|
||||
AppEvents._internal() {}
|
||||
|
||||
List<void Function(String)> _searchListeners = [];
|
||||
List<void Function(SCNMessage)> _messageReceivedListeners = [];
|
||||
|
||||
void subscribeSearchListener(void Function(String) listener) {
|
||||
_searchListeners.add(listener);
|
||||
}
|
||||
|
||||
void unsubscribeSearchListener(void Function(String) listener) {
|
||||
_searchListeners.remove(listener);
|
||||
}
|
||||
|
||||
void notifySearchListeners(String query) {
|
||||
ApplicationLog.debug('[AppEvents] onSearch: $query');
|
||||
|
||||
for (var listener in _searchListeners) {
|
||||
listener(query);
|
||||
}
|
||||
}
|
||||
|
||||
void subscribeMessageReceivedListener(void Function(SCNMessage) listener) {
|
||||
_messageReceivedListeners.add(listener);
|
||||
}
|
||||
|
||||
void unsubscribeMessageReceivedListener(void Function(SCNMessage) listener) {
|
||||
_messageReceivedListeners.remove(listener);
|
||||
}
|
||||
|
||||
void notifyMessageReceivedListeners(SCNMessage msg) {
|
||||
ApplicationLog.debug('[AppEvents] onMessageReceived: ${msg.messageID}');
|
||||
|
||||
for (var listener in _messageReceivedListeners) {
|
||||
listener(msg);
|
||||
}
|
||||
}
|
||||
}
|
60
flutter/lib/state/scn_data_cache.dart
Normal file
60
flutter/lib/state/scn_data_cache.dart
Normal file
@@ -0,0 +1,60 @@
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:simplecloudnotifier/models/channel.dart';
|
||||
import 'package:simplecloudnotifier/models/scn_message.dart';
|
||||
import 'package:simplecloudnotifier/settings/app_settings.dart';
|
||||
|
||||
class SCNDataCache {
|
||||
SCNDataCache._internal();
|
||||
static final SCNDataCache _instance = SCNDataCache._internal();
|
||||
factory SCNDataCache() => _instance;
|
||||
|
||||
Future<void> addToMessageCache(List<SCNMessage> newItems) async {
|
||||
final cfg = AppSettings();
|
||||
|
||||
final cache = Hive.box<SCNMessage>('scn-message-cache');
|
||||
|
||||
for (var msg in newItems) await cache.put(msg.messageID, msg);
|
||||
|
||||
// delete all but the newest 128 messages
|
||||
|
||||
if (cache.length < cfg.messagePageSize) return;
|
||||
|
||||
final allValues = cache.values.toList();
|
||||
|
||||
allValues.sort((a, b) => -1 * a.timestamp.compareTo(b.timestamp));
|
||||
|
||||
for (var val in allValues.sublist(cfg.messagePageSize)) {
|
||||
await cache.delete(val.messageID);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setChannelCache(List<ChannelWithSubscription> channels) async {
|
||||
final cache = Hive.box<Channel>('scn-channel-cache');
|
||||
|
||||
if (cache.length != channels.length) await cache.clear();
|
||||
|
||||
for (var chn in channels) await cache.put(chn.channel.channelID, chn.channel);
|
||||
}
|
||||
|
||||
bool hasMessagesAndChannels() {
|
||||
final chnCache = Hive.box<Channel>('scn-channel-cache');
|
||||
final msgCache = Hive.box<SCNMessage>('scn-message-cache');
|
||||
|
||||
return chnCache.isNotEmpty && msgCache.isNotEmpty;
|
||||
}
|
||||
|
||||
Map<String, Channel> getChannelMap() {
|
||||
final chnCache = Hive.box<Channel>('scn-channel-cache');
|
||||
|
||||
return <String, Channel>{for (var v in chnCache.values) v.channelID: v};
|
||||
}
|
||||
|
||||
List<SCNMessage> getMessagesSorted() {
|
||||
final msgCache = Hive.box<SCNMessage>('scn-message-cache');
|
||||
|
||||
final cacheMessages = msgCache.values.toList();
|
||||
cacheMessages.sort((a, b) => -1 * a.timestamp.compareTo(b.timestamp));
|
||||
|
||||
return cacheMessages;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user