gonna continue later (a long time)

This commit is contained in:
OfficialDakari 2025-10-24 21:20:53 +05:00
parent 08cf4913eb
commit 74c05be615
5 changed files with 51 additions and 12 deletions

View File

@ -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', {
'm.relates_to': {'rel_type': 'm.reference', 'event_id': event.eventId}, 'org.matrix.msc1767.text': 'Ended poll',
'body': 'Ended poll' 'm.relates_to': {
}, type: 'org.matrix.msc3381.poll.end'); 'rel_type': 'm.reference',
'event_id': event.eventId,
},
'body': 'Ended poll',
},
type: 'org.matrix.msc3381.poll.end',
);
} }
void redactEventsAction() async { void redactEventsAction() async {

View File

@ -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;
}, },

View File

@ -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'}',
),
], ],
), ),
), ),

View File

@ -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,

View File

@ -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;
} }