allow editing and redacting of other messages in the same bundle

This commit is contained in:
Sorunome 2021-09-19 13:13:58 +02:00
parent e8cc480c2f
commit c0faf04917
No known key found for this signature in database
GPG Key ID: B19471D07FC9BE9C
2 changed files with 45 additions and 11 deletions

View File

@ -458,19 +458,51 @@ class ChatController extends State<Chat> {
for (final event in selectedEvents) {
await showFutureLoadingDialog(
context: context,
future: () =>
event.status > 0 ? event.redactEvent() : event.remove());
future: () async {
if (event.status > 0) {
if (event.canRedact) {
await event.redactEvent();
} else {
final client = currentRoomBundle.firstWhere(
(cl) => selectedEvents.first.senderId == cl.userID,
orElse: () => null);
if (client == null) {
return;
}
final room = client.getRoomById(roomId);
await Event.fromJson(event.toJson(), room).redactEvent();
}
} else {
await event.remove();
}
});
}
setState(() => selectedEvents.clear());
}
List<Client> get currentRoomBundle {
final clients = matrix.currentBundle;
clients.removeWhere((c) => c.getRoomById(roomId) == null);
return clients;
}
bool get canRedactSelectedEvents {
final clients = matrix.currentBundle;
for (final event in selectedEvents) {
if (event.canRedact == false) return false;
if (event.canRedact == false &&
!(clients.any((cl) => event.senderId == cl.userID))) return false;
}
return true;
}
bool get canEditSelectedEvents {
if (selectedEvents.length != 1 || selectedEvents.first.status < 1) {
return false;
}
return currentRoomBundle
.any((cl) => selectedEvents.first.senderId == cl.userID);
}
void forwardEventsAction() async {
if (selectedEvents.length == 1) {
Matrix.of(context).shareContent = selectedEvents.first.content;
@ -595,6 +627,13 @@ class ChatController extends State<Chat> {
});
void editSelectedEventAction() {
final client = currentRoomBundle.firstWhere(
(cl) => selectedEvents.first.senderId == cl.userID,
orElse: () => null);
if (client == null) {
return;
}
setSendingClient(client);
setState(() {
pendingText = sendController.text;
editEvent = selectedEvents.first;
@ -700,8 +739,7 @@ class ChatController extends State<Chat> {
}
void onInputBarChanged(String text) {
final clients = matrix.currentBundle;
clients.removeWhere((c) => c.getRoomById(roomId) == null);
final clients = currentRoomBundle;
for (final client in clients) {
final prefix = client.sendPrefix;
if ((prefix?.isNotEmpty ?? false) &&

View File

@ -148,10 +148,7 @@ class ChatView extends StatelessWidget {
: Text(controller.selectedEvents.length.toString()),
actions: controller.selectMode
? <Widget>[
if (controller.selectedEvents.length == 1 &&
controller.selectedEvents.first.status > 0 &&
controller.selectedEvents.first.senderId ==
client.userID)
if (controller.canEditSelectedEvents)
IconButton(
icon: Icon(Icons.edit_outlined),
tooltip: L10n.of(context).edit,
@ -820,8 +817,7 @@ class _ChatAccountPicker extends StatelessWidget {
@override
Widget build(BuildContext context) {
controller.matrix ??= Matrix.of(context);
final clients = controller.matrix.currentBundle;
clients.removeWhere((c) => c.getRoomById(controller.roomId) == null);
final clients = controller.currentRoomBundle;
return Padding(
padding: const EdgeInsets.all(8.0),
child: FutureBuilder<Profile>(