move showContextMenu to extension

This commit is contained in:
Henry Hiles 2025-11-28 18:25:55 -05:00
commit b9bc345b56
No known key found for this signature in database
2 changed files with 38 additions and 37 deletions

View file

@ -0,0 +1,35 @@
import "package:flutter/material.dart";
extension ShowContextMenu on BuildContext {
void showContextMenu({
required Offset globalPosition,
required VoidCallback onTap,
}) {
final overlay = Overlay.of(this).context.findRenderObject() as RenderBox;
showMenu(
context: this,
position: RelativeRect.fromLTRB(
globalPosition.dx,
globalPosition.dy,
overlay.size.width - globalPosition.dx,
overlay.size.height - globalPosition.dy,
),
color: Theme.of(this).colorScheme.surfaceContainerHighest,
items: [
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.reply), title: Text("Reply")),
),
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.edit), title: Text("Edit")),
),
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.delete), title: Text("Delete")),
),
],
);
}
}

View file

@ -14,6 +14,7 @@ import "package:nexus/controllers/current_room_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/helpers/extensions/get_headers.dart"; import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/helpers/extensions/show_context_menu.dart";
import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/helpers/launch_helper.dart";
import "package:nexus/widgets/chat_page/chat_box.dart"; import "package:nexus/widgets/chat_page/chat_box.dart";
import "package:nexus/widgets/chat_page/code_block.dart"; import "package:nexus/widgets/chat_page/code_block.dart";
@ -33,39 +34,6 @@ class RoomChat extends HookConsumerWidget {
super.key, super.key,
}); });
void showContextMenu({
required BuildContext context,
required Offset globalPosition,
required VoidCallback onTap,
}) {
final overlay = Overlay.of(context).context.findRenderObject() as RenderBox;
showMenu(
context: context,
position: RelativeRect.fromLTRB(
globalPosition.dx,
globalPosition.dy,
overlay.size.width - globalPosition.dx,
overlay.size.height - globalPosition.dy,
),
color: Theme.of(context).colorScheme.surfaceContainerHighest,
items: [
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.reply), title: Text("Reply")),
),
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.edit), title: Text("Edit")),
),
PopupMenuItem(
onTap: onTap,
child: ListTile(leading: Icon(Icons.delete), title: Text("Delete")),
),
],
);
}
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final replyToMessage = useState<Message?>(null); final replyToMessage = useState<Message?>(null);
@ -117,8 +85,7 @@ class RoomChat extends HookConsumerWidget {
message, { message, {
required details, required details,
required index, required index,
}) => showContextMenu( }) => context.showContextMenu(
context: context,
globalPosition: details.globalPosition, globalPosition: details.globalPosition,
onTap: () => replyToMessage.value = message, onTap: () => replyToMessage.value = message,
), ),
@ -128,8 +95,7 @@ class RoomChat extends HookConsumerWidget {
message, { message, {
required details, required details,
required index, required index,
}) => showContextMenu( }) => context.showContextMenu(
context: context,
globalPosition: details.globalPosition, globalPosition: details.globalPosition,
onTap: () => replyToMessage.value = message, onTap: () => replyToMessage.value = message,
), ),