Skip to content

Commit 64bca57

Browse files
Merge pull request #2167 from nextcloud/feat/neon_talk/references
2 parents e52e292 + 17bb8e1 commit 64bca57

18 files changed

+1126
-193
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import 'dart:async';
2+
3+
import 'package:built_collection/built_collection.dart';
4+
import 'package:logging/logging.dart';
5+
import 'package:meta/meta.dart';
6+
import 'package:neon_framework/blocs.dart';
7+
import 'package:nextcloud/core.dart' as core;
8+
import 'package:nextcloud/spreed.dart' as spreed;
9+
import 'package:rxdart/rxdart.dart';
10+
11+
/// Bloc for handling the message state and interactions.
12+
@sealed
13+
abstract class TalkMessageBloc implements Bloc {
14+
/// Creates a new Talk message bloc.
15+
factory TalkMessageBloc({
16+
required spreed.$ChatMessageInterface chatMessage,
17+
required ReferencesBloc referencesBloc,
18+
required bool isParent,
19+
}) = _TalkMessageBloc;
20+
21+
/// References contained in the message.
22+
BehaviorSubject<BuiltMap<String, Result<core.Reference>>> get references;
23+
}
24+
25+
class _TalkMessageBloc extends Bloc implements TalkMessageBloc {
26+
_TalkMessageBloc({
27+
required this.chatMessage,
28+
required this.referencesBloc,
29+
required this.isParent,
30+
}) {
31+
if (!isParent) {
32+
referenceRegexSubscription = referencesBloc.referenceRegex.listen((result) {
33+
final referenceRegex = result.data;
34+
if (referenceRegex == null) {
35+
return;
36+
}
37+
38+
final matches =
39+
referenceRegex.allMatches(chatMessage.message).map((match) => match.group(0)!.trim()).toBuiltList();
40+
41+
references.add(
42+
references.value.rebuild((b) {
43+
for (final match in matches) {
44+
b[match] ??= Result.loading();
45+
}
46+
47+
b.removeWhere((key, value) => !matches.contains(key));
48+
}),
49+
);
50+
51+
if (matches.isNotEmpty) {
52+
referencesBloc.loadReferences(matches);
53+
}
54+
});
55+
56+
referencesSubscription = referencesBloc.references.listen((result) {
57+
references.add(
58+
references.value.rebuild((b) {
59+
for (final url in references.value.keys) {
60+
b[url] = result[url] ?? Result.loading();
61+
}
62+
63+
b.removeWhere((key, value) => !result.keys.contains(key));
64+
}),
65+
);
66+
});
67+
}
68+
}
69+
70+
final spreed.$ChatMessageInterface chatMessage;
71+
final ReferencesBloc referencesBloc;
72+
final bool isParent;
73+
StreamSubscription<Result<RegExp?>>? referenceRegexSubscription;
74+
StreamSubscription<BuiltMap<String, Result<core.Reference>>>? referencesSubscription;
75+
76+
@override
77+
Logger log = Logger('TalkMessageBloc');
78+
79+
@override
80+
void dispose() {
81+
unawaited(referenceRegexSubscription?.cancel());
82+
unawaited(referencesSubscription?.cancel());
83+
unawaited(references.close());
84+
}
85+
86+
@override
87+
final references = BehaviorSubject.seeded(BuiltMap());
88+
}

0 commit comments

Comments
 (0)