From f366ab6a22ec879ac2c5fbddef067acc5a9dae75 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sat, 1 May 2021 08:12:14 +0200 Subject: [PATCH] feat: Archive with clean up --- lib/l10n/intl_en.arb | 5 +++ lib/views/archive.dart | 28 +++++++++++++++ lib/views/ui/archive_ui.dart | 70 +++++++++++++++++++++--------------- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 7b59bdbf..a9552c37 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -21,6 +21,11 @@ "type": "text", "placeholders": {} }, + "clearArchive": "Clear archive", + "@people": { + "type": "text", + "placeholders": {} + }, "publicGroups": "Public Groups", "@publicGroups": { "type": "text", diff --git a/lib/views/archive.dart b/lib/views/archive.dart index bdb4ef20..4e97923b 100644 --- a/lib/views/archive.dart +++ b/lib/views/archive.dart @@ -1,7 +1,10 @@ +import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/views/ui/archive_ui.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; import 'package:flutter/material.dart'; +import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; class Archive extends StatefulWidget { @override @@ -18,6 +21,31 @@ class ArchiveController extends State { void forgetAction(int i) => setState(() => archive.removeAt(i)); + void forgetAllAction() async { + if (await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).clearArchive, + useRootNavigator: false, + ) != + OkCancelResult.ok) { + return; + } + await showFutureLoadingDialog( + context: context, + future: () async { + while (archive.isNotEmpty) { + Logs().v('Forget room ${archive.last.displayname}'); + await archive.last.forget(); + archive.removeLast(); + } + }, + ); + setState(() => null); + } + @override Widget build(BuildContext context) => ArchiveUI(this); } diff --git a/lib/views/ui/archive_ui.dart b/lib/views/ui/archive_ui.dart index d741b721..74736dff 100644 --- a/lib/views/ui/archive_ui.dart +++ b/lib/views/ui/archive_ui.dart @@ -11,34 +11,48 @@ class ArchiveUI extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - leading: BackButton(), - title: Text(L10n.of(context).archive), - ), - body: FutureBuilder>( - future: controller.getArchive(context), - builder: (BuildContext context, snapshot) { - if (snapshot.hasError) { - return Center( - child: Text( - L10n.of(context).oopsSomethingWentWrong, - textAlign: TextAlign.center, - )); - } - if (!snapshot.hasData) { - return Center(child: CircularProgressIndicator()); - } else { - controller.archive = snapshot.data; - return ListView.builder( - itemCount: controller.archive.length, - itemBuilder: (BuildContext context, int i) => ChatListItem( - controller.archive[i], - onForget: controller.forgetAction, - ), - ); - } - }, + return FutureBuilder>( + future: controller.getArchive(context), + builder: (BuildContext context, snapshot) => Scaffold( + appBar: AppBar( + leading: BackButton(), + title: Text(L10n.of(context).archive), + actions: [ + if (snapshot.hasData && + controller.archive != null && + controller.archive.isNotEmpty) + TextButton( + onPressed: controller.forgetAllAction, + child: Text(L10n.of(context).clearArchive), + ) + ], + ), + body: Builder( + builder: (BuildContext context) { + if (snapshot.hasError) { + return Center( + child: Text( + L10n.of(context).oopsSomethingWentWrong, + textAlign: TextAlign.center, + )); + } + if (!snapshot.hasData) { + return Center(child: CircularProgressIndicator()); + } else { + controller.archive = snapshot.data; + if (controller.archive.isEmpty) { + return Center(child: Icon(Icons.archive_outlined, size: 80)); + } + return ListView.builder( + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int i) => ChatListItem( + controller.archive[i], + onForget: controller.forgetAction, + ), + ); + } + }, + ), ), ); }