Dismiss rooms in chat list with sliding

This commit is contained in:
Christian Pauly 2020-02-16 09:16:47 +01:00
parent 83b7b0cbea
commit be8f3a4a47
6 changed files with 157 additions and 73 deletions

View file

@ -0,0 +1,39 @@
import 'package:fluffychat/i18n/i18n.dart';
import 'package:flutter/material.dart';
class SimpleDialogs {
final BuildContext context;
const SimpleDialogs(this.context);
Future<bool> askConfirmation({
String titleText,
String confirmText,
String cancelText,
}) async {
bool confirmed = false;
await showDialog(
context: context,
builder: (c) => AlertDialog(
title: Text(I18n.of(context).areYouSure ?? titleText),
actions: <Widget>[
FlatButton(
child: Text(cancelText ?? I18n.of(context).close.toUpperCase(),
style: TextStyle(color: Colors.blueGrey)),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text(
confirmText ?? I18n.of(context).confirm.toUpperCase(),
),
onPressed: () {
confirmed = true;
Navigator.of(context).pop();
},
),
],
),
);
return confirmed;
}
}

View file

@ -1,4 +1,5 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/i18n/i18n.dart';
import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
@ -7,6 +8,7 @@ import 'package:fluffychat/utils/room_extension.dart';
import 'package:fluffychat/views/chat.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:toast/toast.dart';
import 'package:pedantic/pedantic.dart';
@ -84,9 +86,40 @@ class ChatListItem extends StatelessWidget {
}
}
Future<bool> archiveAction(BuildContext context) async {
{
final bool confirmed = await SimpleDialogs(context).askConfirmation();
if (!confirmed) {
return false;
}
final success =
await Matrix.of(context).tryRequestWithLoadingDialog(room.leave());
if (success == false) {
return false;
}
return true;
}
}
@override
Widget build(BuildContext context) {
return Material(
return Slidable(
key: Key(room.id),
secondaryActions: <Widget>[
if ([Membership.join, Membership.invite].contains(room.membership))
IconSlideAction(
caption: I18n.of(context).leave,
color: Colors.red,
icon: Icons.archive,
onTap: () => archiveAction(context),
),
],
actionPane: SlidableDrawerActionPane(),
dismissal: SlidableDismissal(
child: SlidableDrawerDismissal(),
onWillDismiss: (actionType) => archiveAction(context),
),
child: Material(
color: activeChat ? Color(0xFFE8E8E8) : Colors.white,
child: ListTile(
leading: Avatar(room.avatar, room.displayname),
@ -163,6 +196,7 @@ class ChatListItem extends StatelessWidget {
),
onTap: () => clickAction(context),
),
),
);
}
}

View file

@ -74,6 +74,8 @@ class I18n {
String get areGuestsAllowedToJoin =>
Intl.message("Are guest users allowed to join");
String get areYouSure => Intl.message("Are you sure?");
String get authentication => Intl.message("Authentication");
String get avatarHasBeenChanged => Intl.message("Avatar has been changed");

View file

@ -18,7 +18,7 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:toast/toast.dart';
import 'package:uni_links/uni_links.dart';
enum SelectMode { normal, multi_select, share }
enum SelectMode { normal, share }
class ChatListView extends StatelessWidget {
@override
@ -86,7 +86,8 @@ class _ChatListState extends State<ChatList> {
}
},
onError: (error) => Toast.show(
I18n.of(context).oopsSomethingWentWrong + " " + error.toString(), context,
I18n.of(context).oopsSomethingWentWrong + " " + error.toString(),
context,
duration: 5),
);
}

View file

@ -188,6 +188,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.3.1+1"
flutter_slidable:
dependency: "direct main"
description:
name: flutter_slidable
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.4"
flutter_speed_dial:
dependency: "direct main"
description:

View file

@ -50,6 +50,7 @@ dependencies:
universal_html: ^1.1.12
uni_links: ^0.2.0
flutter_svg: ^0.17.1
flutter_slidable: ^0.5.4
intl: ^0.16.0
intl_translation: ^0.17.9