Compare commits

...
Author SHA1 Message Date
0a3ec830a3
stop event preview resizing itself on load
Fixes #109
2026-10-03 13:50:46 -04:00
650f1ac8e4
allow hiding gomuks internal messages 2026-10-03 13:24:47 -04:00
5 changed files with 49 additions and 29 deletions

View file

@ -10,6 +10,7 @@ import "package:nexus/controllers/recent_emoji.dart";
import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/rooms.dart";
import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/room_chat.dart";
import "package:nexus/controllers/via.dart"; import "package:nexus/controllers/via.dart";
import "package:nexus/helpers/extensions/event_id_is_fake.dart";
import "package:nexus/models/content/message.dart"; import "package:nexus/models/content/message.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/relation_type.dart"; import "package:nexus/models/relation_type.dart";
@ -229,7 +230,7 @@ extension BuildEventOptions on Event {
.redaction(targetUser: sender, roomId: roomId), .redaction(targetUser: sender, roomId: roomId),
), ),
) && ) &&
!eventId.startsWith("~")) !eventId.isFake)
PopupMenuItem( PopupMenuItem(
onTap: () => showReasonDialog( onTap: () => showReasonDialog(
title: "Delete Message", title: "Delete Message",
@ -246,7 +247,7 @@ extension BuildEventOptions on Event {
), ),
), ),
if (eventId.startsWith("~")) if (eventId.isFake)
PopupMenuItem( PopupMenuItem(
onTap: () => ref.watch(notifier).hideClientSticky(rowId), onTap: () => ref.watch(notifier).hideClientSticky(rowId),
child: ListTile( child: ListTile(

View file

@ -0,0 +1,3 @@
extension EventIdIsFake on String {
bool get isFake => startsWith("~") || startsWith("\$gomuks");
}

View file

@ -18,17 +18,20 @@ class const EventPreview(final Event event, {super.key})
if (event.content is MessageContent) MessageAvatar(event), if (event.content is MessageContent) MessageAvatar(event),
Flexible( Flexible(
child: Wrap( child: Row(
crossAxisAlignment: .center, crossAxisAlignment: .center,
mainAxisSize: .min,
spacing: 8, spacing: 8,
runSpacing: 2,
children: [ children: [
if (event.content is MessageContent) MessageDisplayname(event), if (event.content is MessageContent)
EventRenderer( Flexible(child: MessageDisplayname(event)),
event.rowId, Flexible(
roomId: event.roomId, child: EventRenderer(
textOnly: true, event.rowId,
maxLines: 1, roomId: event.roomId,
textOnly: true,
maxLines: 1,
),
), ),
], ],
), ),

View file

@ -1,11 +1,15 @@
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
class const Loading({super.key, final double? height}) extends StatelessWidget { class const Loading({super.key, final double? dimension})
extends StatelessWidget {
@override @override
Widget build(BuildContext context) => Center( Widget build(BuildContext context) => Center(
child: Padding( child: Padding(
padding: .all(16), padding: .all(16),
child: SizedBox(height: height, child: CircularProgressIndicator()), child: SizedBox.square(
dimension: dimension,
child: CircularProgressIndicator(),
),
), ),
); );
} }

View file

@ -13,6 +13,7 @@ import "package:nexus/widgets/html/html.dart";
import "package:nexus/widgets/lazy_loading/message_avatar.dart"; import "package:nexus/widgets/lazy_loading/message_avatar.dart";
import "package:nexus/widgets/lazy_loading/message_displayname.dart"; import "package:nexus/widgets/lazy_loading/message_displayname.dart";
import "package:nexus/widgets/linkified_text.dart"; import "package:nexus/widgets/linkified_text.dart";
import "package:nexus/widgets/loading.dart";
import "package:nexus/widgets/message_image.dart"; import "package:nexus/widgets/message_image.dart";
import "package:nexus/widgets/reaction_row.dart"; import "package:nexus/widgets/reaction_row.dart";
import "package:nexus/widgets/timestamp.dart"; import "package:nexus/widgets/timestamp.dart";
@ -197,24 +198,32 @@ class const MessageRenderer(
onTap: onTapReply, onTap: onTapReply,
child: Padding( child: Padding(
padding: .symmetric(vertical: 8, horizontal: 12), padding: .symmetric(vertical: 8, horizontal: 12),
child: switch (ref.watch( child: SizedBox(
EventController.provider( height: 32,
.new( child: OverflowBox(
roomId: event.roomId, alignment: .centerLeft,
eventId: event.replyTo!, minHeight: 0,
), maxHeight: .infinity,
child: switch (ref.watch(
EventController.provider(
.new(
roomId: event.roomId,
eventId: event.replyTo!,
),
),
)) {
AsyncData(:final value?) ||
AsyncLoading(
:final value?,
) => EventPreview(value),
AsyncError _ => Text(
"An error occurred while fetching the reply",
style: errorStyle,
),
_ => Loading(dimension: 12),
},
), ),
)) { ),
AsyncData(:final value?) ||
AsyncLoading(
:final value?,
) => EventPreview(value),
AsyncError _ => Text(
"An error occurred while fetching the reply",
style: errorStyle,
),
_ => Text("Fetching event..."),
},
), ),
), ),
), ),