refactor: MVC invitation selection

This commit is contained in:
Christian Pauly 2021-04-13 16:25:08 +02:00
parent 3f854d6984
commit c12e815ff1
3 changed files with 99 additions and 73 deletions

View File

@ -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';

View File

@ -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<InvitationSelection> {
class InvitationSelectionController extends State<InvitationSelection> {
TextEditingController controller = TextEditingController();
String currentSearchTerm;
bool loading = false;
List<Profile> foundProfiles = [];
Timer coolDown;
Room room;
Future<List<User>> 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<InvitationSelection> {
}
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<InvitationSelection> {
}
}
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<InvitationSelection> {
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<InvitationSelection> {
}
@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<List<User>>(
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);
}

View File

@ -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<List<User>>(
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),
),
);
},
),
),
);
}
}