From c12e815ff1b0e1fb2671fc69caa9dcd76126b45d Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 13 Apr 2021 16:25:08 +0200 Subject: [PATCH] refactor: MVC invitation selection --- lib/config/routes.dart | 2 +- .../invitation_selection_controller.dart} | 84 +++--------------- lib/views/invitation_selection_view.dart | 86 +++++++++++++++++++ 3 files changed, 99 insertions(+), 73 deletions(-) rename lib/{views/invitation_selection.dart => controllers/invitation_selection_controller.dart} (52%) create mode 100644 lib/views/invitation_selection_view.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d3455742..19b4e2f4 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -2,6 +2,7 @@ import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/controllers/archive_controller.dart'; import 'package:fluffychat/controllers/homeserver_picker_controller.dart'; +import 'package:fluffychat/controllers/invitation_selection_controller.dart'; import 'package:fluffychat/controllers/sign_up_controller.dart'; import 'package:fluffychat/controllers/sign_up_password_controller.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; @@ -11,7 +12,6 @@ import 'package:fluffychat/views/chat_encryption_settings.dart'; import 'package:fluffychat/views/chat_list.dart'; import 'package:fluffychat/views/chat_permissions_settings.dart'; import 'package:fluffychat/views/empty_page.dart'; -import 'package:fluffychat/views/invitation_selection.dart'; import 'package:fluffychat/views/loading_view.dart'; import 'package:fluffychat/views/log_view.dart'; import 'package:fluffychat/views/login.dart'; diff --git a/lib/views/invitation_selection.dart b/lib/controllers/invitation_selection_controller.dart similarity index 52% rename from lib/views/invitation_selection.dart rename to lib/controllers/invitation_selection_controller.dart index e2f79af3..1a38a087 100644 --- a/lib/views/invitation_selection.dart +++ b/lib/controllers/invitation_selection_controller.dart @@ -1,11 +1,9 @@ import 'dart:async'; import 'package:adaptive_page_layout/adaptive_page_layout.dart'; -import 'package:fluffychat/views/widgets/default_app_bar_search_field.dart'; import 'package:famedlysdk/famedlysdk.dart'; -import 'package:fluffychat/views/widgets/avatar.dart'; -import 'package:fluffychat/views/widgets/max_width_body.dart'; +import 'package:fluffychat/views/invitation_selection_view.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; import 'package:flutter/material.dart'; @@ -18,20 +16,20 @@ class InvitationSelection extends StatefulWidget { const InvitationSelection(this.roomId, {Key key}) : super(key: key); @override - _InvitationSelectionState createState() => _InvitationSelectionState(); + InvitationSelectionController createState() => + InvitationSelectionController(); } -class _InvitationSelectionState extends State { +class InvitationSelectionController extends State { TextEditingController controller = TextEditingController(); String currentSearchTerm; bool loading = false; List foundProfiles = []; Timer coolDown; - Room room; Future> getContacts(BuildContext context) async { - var client2 = Matrix.of(context).client; - final client = client2; + var client = Matrix.of(context).client; + final room = client.getRoomById(widget.roomId); var participants = await room.requestParticipants(); participants.removeWhere( (u) => ![Membership.join, Membership.invite].contains(u.membership), @@ -58,6 +56,7 @@ class _InvitationSelectionState extends State { } void inviteAction(BuildContext context, String id) async { + final room = Matrix.of(context).client.getRoomById(widget.roomId); final success = await showFutureLoadingDialog( context: context, future: () => room.invite(id), @@ -68,7 +67,7 @@ class _InvitationSelectionState extends State { } } - void searchUserWithCoolDown(BuildContext context, String text) async { + void searchUserWithCoolDown(String text) async { coolDown?.cancel(); coolDown = Timer( Duration(seconds: 1), @@ -104,7 +103,9 @@ class _InvitationSelectionState extends State { Profile.fromJson({'user_id': text}), ]); } - final participants = room + final participants = Matrix.of(context) + .client + .getRoomById(widget.roomId) .getParticipants() .where((user) => [Membership.join, Membership.invite].contains(user.membership)) @@ -115,66 +116,5 @@ class _InvitationSelectionState extends State { } @override - Widget build(BuildContext context) { - room ??= Matrix.of(context).client.getRoomById(widget.roomId); - final groupName = - room.name?.isEmpty ?? false ? L10n.of(context).group : room.name; - return Scaffold( - appBar: AppBar( - leading: BackButton(), - titleSpacing: 0, - title: DefaultAppBarSearchField( - autofocus: true, - hintText: L10n.of(context).inviteContactToGroup(groupName), - onChanged: (String text) => searchUserWithCoolDown(context, text), - ), - ), - body: MaxWidthBody( - withScrolling: true, - child: foundProfiles.isNotEmpty - ? ListView.builder( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: foundProfiles.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - foundProfiles[i].avatarUrl, - foundProfiles[i].displayname ?? foundProfiles[i].userId, - ), - title: Text( - foundProfiles[i].displayname ?? - foundProfiles[i].userId.localpart, - ), - subtitle: Text(foundProfiles[i].userId), - onTap: () => inviteAction(context, foundProfiles[i].userId), - ), - ) - : FutureBuilder>( - future: getContacts(context), - builder: (BuildContext context, snapshot) { - if (!snapshot.hasData) { - return Center( - child: CircularProgressIndicator(), - ); - } - var contacts = snapshot.data; - return ListView.builder( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: contacts.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - contacts[i].avatarUrl, - contacts[i].calcDisplayname(), - ), - title: Text(contacts[i].calcDisplayname()), - subtitle: Text(contacts[i].id), - onTap: () => inviteAction(context, contacts[i].id), - ), - ); - }, - ), - ), - ); - } + Widget build(BuildContext context) => InvitationSelectionView(this); } diff --git a/lib/views/invitation_selection_view.dart b/lib/views/invitation_selection_view.dart new file mode 100644 index 00000000..1f7cc3b5 --- /dev/null +++ b/lib/views/invitation_selection_view.dart @@ -0,0 +1,86 @@ +import 'package:fluffychat/controllers/invitation_selection_controller.dart'; +import 'package:fluffychat/views/widgets/default_app_bar_search_field.dart'; + +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/views/widgets/avatar.dart'; +import 'package:fluffychat/views/widgets/max_width_body.dart'; +import 'package:fluffychat/views/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class InvitationSelectionView extends StatelessWidget { + final InvitationSelectionController controller; + + const InvitationSelectionView( + this.controller, { + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final room = + Matrix.of(context).client.getRoomById(controller.widget.roomId); + final groupName = + room.name?.isEmpty ?? false ? L10n.of(context).group : room.name; + return Scaffold( + appBar: AppBar( + leading: BackButton(), + titleSpacing: 0, + title: DefaultAppBarSearchField( + autofocus: true, + hintText: L10n.of(context).inviteContactToGroup(groupName), + onChanged: controller.searchUserWithCoolDown, + ), + ), + body: MaxWidthBody( + withScrolling: true, + child: controller.foundProfiles.isNotEmpty + ? ListView.builder( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: controller.foundProfiles.length, + itemBuilder: (BuildContext context, int i) => ListTile( + leading: Avatar( + controller.foundProfiles[i].avatarUrl, + controller.foundProfiles[i].displayname ?? + controller.foundProfiles[i].userId, + ), + title: Text( + controller.foundProfiles[i].displayname ?? + controller.foundProfiles[i].userId.localpart, + ), + subtitle: Text(controller.foundProfiles[i].userId), + onTap: () => controller.inviteAction( + context, controller.foundProfiles[i].userId), + ), + ) + : FutureBuilder>( + future: controller.getContacts(context), + builder: (BuildContext context, snapshot) { + if (!snapshot.hasData) { + return Center( + child: CircularProgressIndicator(), + ); + } + var contacts = snapshot.data; + return ListView.builder( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: contacts.length, + itemBuilder: (BuildContext context, int i) => ListTile( + leading: Avatar( + contacts[i].avatarUrl, + contacts[i].calcDisplayname(), + ), + title: Text(contacts[i].calcDisplayname()), + subtitle: Text(contacts[i].id), + onTap: () => + controller.inviteAction(context, contacts[i].id), + ), + ); + }, + ), + ), + ); + } +}