gonna continue later (a long time)
This commit is contained in:
parent
08cf4913eb
commit
74c05be615
|
|
@ -317,6 +317,8 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
if (kIsWeb) {
|
if (kIsWeb) {
|
||||||
onFocusSub = html.window.onFocus.listen((_) => setReadMarker());
|
onFocusSub = html.window.onFocus.listen((_) => setReadMarker());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _tryLoadTimeline() async {
|
void _tryLoadTimeline() async {
|
||||||
|
|
@ -376,6 +378,7 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void>? loadTimelineFuture;
|
Future<void>? loadTimelineFuture;
|
||||||
|
Map<String, Thread>? threads;
|
||||||
|
|
||||||
int? animateInEventIndex;
|
int? animateInEventIndex;
|
||||||
|
|
||||||
|
|
@ -418,6 +421,15 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _getThreads() async {
|
||||||
|
try {
|
||||||
|
threads = await room.getThreads();
|
||||||
|
Logs().w('Thread amount: ${threads?.length}');
|
||||||
|
} catch (e, s) {
|
||||||
|
Logs().w('Unable to load threads in $roomId', e, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String? scrollToEventIdMarker;
|
String? scrollToEventIdMarker;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -754,7 +766,7 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Navigator.of(context).push(new MaterialPageRoute(
|
Navigator.of(context).push(MaterialPageRoute(
|
||||||
builder: (BuildContext ctx) {
|
builder: (BuildContext ctx) {
|
||||||
return RecoveredEventDialog(
|
return RecoveredEventDialog(
|
||||||
event: recoveredEvent,
|
event: recoveredEvent,
|
||||||
|
|
@ -774,7 +786,7 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
}
|
}
|
||||||
final event = selectedEvents.single;
|
final event = selectedEvents.single;
|
||||||
var text = event.isRichMessage ? event.formattedText : event.text;
|
var text = event.isRichMessage ? event.formattedText : event.text;
|
||||||
var content = {...event.content};
|
final content = {...event.content};
|
||||||
try {
|
try {
|
||||||
text = await Translator.translate(
|
text = await Translator.translate(
|
||||||
text, PlatformDispatcher.instance.locale.languageCode);
|
text, PlatformDispatcher.instance.locale.languageCode);
|
||||||
|
|
@ -873,18 +885,23 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
|
|
||||||
void endPollAction() async {
|
void endPollAction() async {
|
||||||
final event = selectedEvents.first;
|
final event = selectedEvents.first;
|
||||||
if (event == null) return;
|
|
||||||
final client = currentRoomBundle.firstWhere(
|
final client = currentRoomBundle.firstWhere(
|
||||||
(cl) => selectedEvents.first.senderId == cl!.userID,
|
(cl) => selectedEvents.first.senderId == cl!.userID,
|
||||||
orElse: () => null,
|
orElse: () => null,
|
||||||
);
|
);
|
||||||
if (client == null) return;
|
if (client == null) return;
|
||||||
if (event.senderId != client!.userID) return;
|
if (event.senderId != client.userID) return;
|
||||||
await room.sendEvent({
|
await room.sendEvent(
|
||||||
|
{
|
||||||
'org.matrix.msc1767.text': 'Ended poll',
|
'org.matrix.msc1767.text': 'Ended poll',
|
||||||
'm.relates_to': {'rel_type': 'm.reference', 'event_id': event.eventId},
|
'm.relates_to': {
|
||||||
'body': 'Ended poll'
|
'rel_type': 'm.reference',
|
||||||
}, type: 'org.matrix.msc3381.poll.end');
|
'event_id': event.eventId,
|
||||||
|
},
|
||||||
|
'body': 'Ended poll',
|
||||||
|
},
|
||||||
|
type: 'org.matrix.msc3381.poll.end',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void redactEventsAction() async {
|
void redactEventsAction() async {
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ class ChatEventList extends StatelessWidget {
|
||||||
|
|
||||||
final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0;
|
final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0;
|
||||||
|
|
||||||
final events = timeline.events.filterByVisibleInGui();
|
final events = timeline.events.filterByVisibleInGui().filterByThreaded(false);
|
||||||
final animateInEventIndex = controller.animateInEventIndex;
|
final animateInEventIndex = controller.animateInEventIndex;
|
||||||
|
|
||||||
// create a map of eventId --> index to greatly improve performance of
|
// create a map of eventId --> index to greatly improve performance of
|
||||||
|
|
@ -121,6 +121,10 @@ class ChatEventList extends StatelessWidget {
|
||||||
timeline.events.length > animateInEventIndex &&
|
timeline.events.length > animateInEventIndex &&
|
||||||
event == timeline.events[animateInEventIndex];
|
event == timeline.events[animateInEventIndex];
|
||||||
|
|
||||||
|
final thread = (controller.threads?.containsKey(event.eventId) ?? false)
|
||||||
|
? controller.threads![event.eventId]
|
||||||
|
: null;
|
||||||
|
|
||||||
return AutoScrollTag(
|
return AutoScrollTag(
|
||||||
key: ValueKey(event.eventId),
|
key: ValueKey(event.eventId),
|
||||||
index: i,
|
index: i,
|
||||||
|
|
@ -128,6 +132,7 @@ class ChatEventList extends StatelessWidget {
|
||||||
child: Message(
|
child: Message(
|
||||||
event,
|
event,
|
||||||
animateIn: animateIn,
|
animateIn: animateIn,
|
||||||
|
thread: thread,
|
||||||
resetAnimateIn: () {
|
resetAnimateIn: () {
|
||||||
controller.animateInEventIndex = null;
|
controller.animateInEventIndex = null;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ class Message extends StatelessWidget {
|
||||||
final List<Color> colors;
|
final List<Color> colors;
|
||||||
final bool gradient;
|
final bool gradient;
|
||||||
final bool singleSelected;
|
final bool singleSelected;
|
||||||
|
final Thread? thread;
|
||||||
|
|
||||||
const Message(
|
const Message(
|
||||||
this.event, {
|
this.event, {
|
||||||
|
|
@ -54,6 +55,7 @@ class Message extends StatelessWidget {
|
||||||
this.longPressSelect = false,
|
this.longPressSelect = false,
|
||||||
this.gradient = false,
|
this.gradient = false,
|
||||||
this.singleSelected = false,
|
this.singleSelected = false,
|
||||||
|
this.thread,
|
||||||
required this.onSelect,
|
required this.onSelect,
|
||||||
required this.onInfoTab,
|
required this.onInfoTab,
|
||||||
required this.scrollToEventId,
|
required this.scrollToEventId,
|
||||||
|
|
@ -688,6 +690,11 @@ class Message extends StatelessWidget {
|
||||||
: const SizedBox.shrink(),
|
: const SizedBox.shrink(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Text(
|
||||||
|
thread == null
|
||||||
|
? 'No thread'
|
||||||
|
: 'Has thread, last event: ${thread!.lastEvent != null ? thread!.lastEvent!.eventId : 'None'}',
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,7 @@ class ChatListItem extends StatelessWidget {
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (typingText.isEmpty &&
|
if (typingText.isEmpty &&
|
||||||
ownMessage &&
|
ownMessage &&
|
||||||
room.lastEvent!.status.isSending) ...[
|
(room.lastEvent?.status.isSending ?? false)) ...[
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 16,
|
width: 16,
|
||||||
height: 16,
|
height: 16,
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@ import 'package:matrix/matrix.dart';
|
||||||
import '../../config/app_config.dart';
|
import '../../config/app_config.dart';
|
||||||
|
|
||||||
extension VisibleInGuiExtension on List<Event> {
|
extension VisibleInGuiExtension on List<Event> {
|
||||||
|
List<Event> filterByThreaded(bool threaded) {
|
||||||
|
return where((e) => e.isThreaded == threaded).toList();
|
||||||
|
}
|
||||||
|
|
||||||
List<Event> filterByVisibleInGui({String? exceptionEventId}) {
|
List<Event> filterByVisibleInGui({String? exceptionEventId}) {
|
||||||
final visibleEvents =
|
final visibleEvents =
|
||||||
where((e) => e.isVisibleInGui || e.eventId == exceptionEventId)
|
where((e) => e.isVisibleInGui || e.eventId == exceptionEventId)
|
||||||
|
|
@ -46,7 +50,9 @@ extension IsStateExtension on Event {
|
||||||
// if we enabled to hide all redacted events, don't show those
|
// if we enabled to hide all redacted events, don't show those
|
||||||
(!AppConfig.hideRedactedEvents || !redacted) &&
|
(!AppConfig.hideRedactedEvents || !redacted) &&
|
||||||
// if we enabled to hide all unknown events, don't show those
|
// if we enabled to hide all unknown events, don't show those
|
||||||
(!AppConfig.hideUnknownEvents || isEventTypeKnown || type == PollEvents.PollStart) &&
|
(!AppConfig.hideUnknownEvents ||
|
||||||
|
isEventTypeKnown ||
|
||||||
|
type == PollEvents.PollStart) &&
|
||||||
// remove state events that we don't want to render
|
// remove state events that we don't want to render
|
||||||
(isState || !AppConfig.hideAllStateEvents) &&
|
(isState || !AppConfig.hideAllStateEvents) &&
|
||||||
// hide simple join/leave member events in public rooms
|
// hide simple join/leave member events in public rooms
|
||||||
|
|
@ -56,5 +62,9 @@ extension IsStateExtension on Event {
|
||||||
content.tryGet<String>('membership') == 'ban' ||
|
content.tryGet<String>('membership') == 'ban' ||
|
||||||
stateKey != senderId);
|
stateKey != senderId);
|
||||||
|
|
||||||
|
bool get isThreaded =>
|
||||||
|
relationshipEventId != null &&
|
||||||
|
relationshipType == RelationshipTypes.thread;
|
||||||
|
|
||||||
bool get isState => this.stateKey != null;
|
bool get isState => this.stateKey != null;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue