wind/lib/thread_list_model.dart

64 lines
1.6 KiB
Dart
Raw Permalink Normal View History

2022-04-15 02:46:18 +00:00
import 'package:flutter/cupertino.dart';
import 'package:wind/nntp_client.dart';
import 'package:wind/thread_list_view.dart';
class ThreadListModel extends ChangeNotifier {
String currentGroup = "";
NNTPClient? client;
Map<String, Map<int, List<ThreadItem>>> threads = {};
2022-04-18 23:33:56 +00:00
int _pageNum = -1;
List<ThreadItem> _curItems = [];
2022-04-15 02:46:18 +00:00
Future<void> selectNewsgroup(String name) async {
if (currentGroup == name) return;
currentGroup = name;
await client!.selectGroup(name);
threads.putIfAbsent(name, () => {});
2022-04-18 23:33:56 +00:00
_curItems.clear();
_pageNum = -1;
2022-04-15 02:46:18 +00:00
notifyListeners();
}
2022-04-18 23:33:56 +00:00
Future<List<ThreadItem>> getNewThreads(bool clearCache) async {
2022-04-15 02:46:18 +00:00
if (currentGroup == "") return [];
2022-04-18 23:33:56 +00:00
_pageNum += 1;
2022-04-15 02:46:18 +00:00
if (clearCache) {
threads[currentGroup]?.clear();
}
2022-04-18 23:33:56 +00:00
if (threads[currentGroup]!.containsKey(_pageNum)) {
_curItems.addAll(threads[currentGroup]![_pageNum]!);
2022-04-15 02:46:18 +00:00
} else {
2022-04-18 23:33:56 +00:00
var resp = await client!.getNewThreads(10, _pageNum);
2022-04-15 02:46:18 +00:00
resp.forEach((pair) {
var number = pair.item1;
var msg = pair.item2;
2022-04-18 23:33:56 +00:00
_curItems.add(ThreadItem(
2022-04-15 02:46:18 +00:00
msg.getHeaderValue("Message-Id")!,
number,
2022-05-01 21:49:03 +00:00
msg.decodeSubject()!,
2022-04-15 02:46:18 +00:00
msg.getHeaderValue("From")!,
msg.getHeaderValue("Date")!,
msg.decodeTextPlainPart()!));
});
2022-04-18 23:33:56 +00:00
if (resp.isEmpty) _pageNum -= 1;
threads[currentGroup]![_pageNum] = List.from(_curItems);
2022-04-15 02:46:18 +00:00
}
2022-04-18 23:33:56 +00:00
return _curItems;
}
void update() {
_curItems.clear();
_pageNum = -1;
threads[currentGroup]!.clear();
notifyListeners();
2022-04-15 02:46:18 +00:00
}
}