forked from Henry-Hiles/nexus
Add delete button
This commit is contained in:
parent
40461aabbf
commit
39a3622af5
2 changed files with 98 additions and 26 deletions
|
|
@ -18,6 +18,15 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
ref.onDispose(
|
ref.onDispose(
|
||||||
room.client.onTimelineEvent.stream.listen((event) async {
|
room.client.onTimelineEvent.stream.listen((event) async {
|
||||||
if (event.roomId != room.id) return;
|
if (event.roomId != room.id) return;
|
||||||
|
|
||||||
|
if (event.type == EventTypes.Redaction) {
|
||||||
|
final controller = await future;
|
||||||
|
await controller.removeMessage(
|
||||||
|
controller.messages.firstWhere(
|
||||||
|
(message) => message.id == event.redacts,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
final message = await event.toMessage();
|
final message = await event.toMessage();
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
if (event.relationshipType == RelationshipTypes.edit) {
|
if (event.relationshipType == RelationshipTypes.edit) {
|
||||||
|
|
@ -31,6 +40,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
await insertMessage(message);
|
await insertMessage(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}).cancel,
|
}).cancel,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -53,6 +63,12 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
: controller.updateMessage(oldMessage, message);
|
: controller.updateMessage(oldMessage, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> deleteMessage(Message message, {String? reason}) async {
|
||||||
|
final controller = await future;
|
||||||
|
await controller.removeMessage(message);
|
||||||
|
await room.redactEvent(message.id, reason: reason);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> loadOlder() async {
|
Future<void> loadOlder() async {
|
||||||
final controller = await future;
|
final controller = await future;
|
||||||
final response = await ref
|
final response = await ref
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import "package:nexus/widgets/chat_page/room_appbar.dart";
|
||||||
import "package:nexus/widgets/chat_page/spoiler_text.dart";
|
import "package:nexus/widgets/chat_page/spoiler_text.dart";
|
||||||
import "package:nexus/widgets/chat_page/top_widget.dart";
|
import "package:nexus/widgets/chat_page/top_widget.dart";
|
||||||
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
|
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
|
||||||
|
import "package:nexus/widgets/form_text_input.dart";
|
||||||
import "package:nexus/widgets/loading.dart";
|
import "package:nexus/widgets/loading.dart";
|
||||||
|
|
||||||
class RoomChat extends HookConsumerWidget {
|
class RoomChat extends HookConsumerWidget {
|
||||||
|
|
@ -40,21 +41,6 @@ class RoomChat extends HookConsumerWidget {
|
||||||
final memberListOpened = useState<bool>(showMembersByDefault);
|
final memberListOpened = useState<bool>(showMembersByDefault);
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
|
||||||
List<PopupMenuEntry> getMessageOptions(Message message) => [
|
|
||||||
PopupMenuItem(
|
|
||||||
onTap: () => replyToMessage.value = message,
|
|
||||||
child: ListTile(leading: Icon(Icons.reply), title: Text("Reply")),
|
|
||||||
),
|
|
||||||
PopupMenuItem(
|
|
||||||
onTap: () {},
|
|
||||||
child: ListTile(leading: Icon(Icons.edit), title: Text("Edit")),
|
|
||||||
),
|
|
||||||
PopupMenuItem(
|
|
||||||
onTap: () {},
|
|
||||||
child: ListTile(leading: Icon(Icons.delete), title: Text("Delete")),
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
return ref
|
return ref
|
||||||
.watch(CurrentRoomController.provider)
|
.watch(CurrentRoomController.provider)
|
||||||
.betterWhen(
|
.betterWhen(
|
||||||
|
|
@ -71,6 +57,76 @@ class RoomChat extends HookConsumerWidget {
|
||||||
room.roomData,
|
room.roomData,
|
||||||
);
|
);
|
||||||
final notifier = ref.watch(controllerProvider.notifier);
|
final notifier = ref.watch(controllerProvider.notifier);
|
||||||
|
|
||||||
|
List<PopupMenuEntry> getMessageOptions(Message message) => [
|
||||||
|
PopupMenuItem(
|
||||||
|
onTap: () => replyToMessage.value = message,
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(Icons.reply),
|
||||||
|
title: Text("Reply"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (message.authorId == room.roomData.client.userID)
|
||||||
|
PopupMenuItem(
|
||||||
|
onTap: () {},
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(Icons.edit),
|
||||||
|
title: Text("Edit"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (message.authorId == room.roomData.client.userID ||
|
||||||
|
room.roomData.canRedact)
|
||||||
|
PopupMenuItem(
|
||||||
|
onTap: () => showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => HookBuilder(
|
||||||
|
builder: (_) {
|
||||||
|
final deleteReasonController =
|
||||||
|
useTextEditingController();
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text("Delete Message"),
|
||||||
|
content: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Are you sure you want to delete this message? This can not be reversed.",
|
||||||
|
),
|
||||||
|
SizedBox(height: 12),
|
||||||
|
FormTextInput(
|
||||||
|
required: false,
|
||||||
|
capitalize: true,
|
||||||
|
controller: deleteReasonController,
|
||||||
|
title: "Reason for deletion (optional)",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: Navigator.of(context).pop,
|
||||||
|
child: Text("Cancel"),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
notifier.deleteMessage(
|
||||||
|
message,
|
||||||
|
reason: deleteReasonController.text,
|
||||||
|
);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text("Delete"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(Icons.delete),
|
||||||
|
title: Text("Delete"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: RoomAppbar(
|
appBar: RoomAppbar(
|
||||||
room,
|
room,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue