chore: Nicer invite selection view

pull/1437/head
Krille 10 months ago
parent cb32608674
commit 41782c497e
No known key found for this signature in database
GPG Key ID: E067ECD60F1A0652

@ -2,12 +2,10 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import '../../utils/localized_exception_extension.dart'; import '../../utils/localized_exception_extension.dart';
@ -54,21 +52,7 @@ class InvitationSelectionController extends State<InvitationSelection> {
void inviteAction(BuildContext context, String id, String displayname) async { void inviteAction(BuildContext context, String id, String displayname) async {
final room = Matrix.of(context).client.getRoomById(roomId!)!; final room = Matrix.of(context).client.getRoomById(roomId!)!;
if (OkCancelResult.ok !=
await showOkCancelAlertDialog(
context: context,
title: L10n.of(context).inviteContact,
message: L10n.of(context).inviteContactToGroupQuestion(
displayname,
room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)),
),
),
okLabel: L10n.of(context).invite,
cancelLabel: L10n.of(context).cancel,
)) {
return;
}
final success = await showFutureLoadingDialog( final success = await showFutureLoadingDialog(
context: context, context: context,
future: () => room.invite(id), future: () => room.invite(id),

@ -4,6 +4,8 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart';
import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
@ -87,12 +89,7 @@ class InvitationSelectionView extends StatelessWidget {
itemCount: controller.foundProfiles.length, itemCount: controller.foundProfiles.length,
itemBuilder: (BuildContext context, int i) => itemBuilder: (BuildContext context, int i) =>
_InviteContactListTile( _InviteContactListTile(
avatarUrl: controller.foundProfiles[i].avatarUrl, profile: controller.foundProfiles[i],
displayname: controller
.foundProfiles[i].displayName ??
controller.foundProfiles[i].userId.localpart ??
L10n.of(context).user,
userId: controller.foundProfiles[i].userId,
isMember: participants isMember: participants
.contains(controller.foundProfiles[i].userId), .contains(controller.foundProfiles[i].userId),
onTap: () => controller.inviteAction( onTap: () => controller.inviteAction(
@ -121,11 +118,14 @@ class InvitationSelectionView extends StatelessWidget {
itemCount: contacts.length, itemCount: contacts.length,
itemBuilder: (BuildContext context, int i) => itemBuilder: (BuildContext context, int i) =>
_InviteContactListTile( _InviteContactListTile(
avatarUrl: contacts[i].avatarUrl, user: contacts[i],
displayname: contacts[i].displayName ?? profile: Profile(
contacts[i].id.localpart ?? avatarUrl: contacts[i].avatarUrl,
L10n.of(context).user, displayName: contacts[i].displayName ??
userId: contacts[i].id, contacts[i].id.localpart ??
L10n.of(context).user,
userId: contacts[i].id,
),
isMember: participants.contains(contacts[i].id), isMember: participants.contains(contacts[i].id),
onTap: () => controller.inviteAction( onTap: () => controller.inviteAction(
context, context,
@ -148,16 +148,14 @@ class InvitationSelectionView extends StatelessWidget {
} }
class _InviteContactListTile extends StatelessWidget { class _InviteContactListTile extends StatelessWidget {
final String userId; final Profile profile;
final String displayname; final User? user;
final Uri? avatarUrl;
final bool isMember; final bool isMember;
final void Function() onTap; final void Function() onTap;
const _InviteContactListTile({ const _InviteContactListTile({
required this.userId, required this.profile,
required this.displayname, this.user,
required this.avatarUrl,
required this.isMember, required this.isMember,
required this.onTap, required this.onTap,
}); });
@ -165,32 +163,39 @@ class _InviteContactListTile extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = Theme.of(context); final theme = Theme.of(context);
final l10n = L10n.of(context);
return Opacity( return ListTile(
opacity: isMember ? 0.5 : 1, leading: Avatar(
child: ListTile( mxContent: profile.avatarUrl,
leading: Avatar( name: profile.displayName,
mxContent: avatarUrl, presenceUserId: profile.userId,
name: displayname, onTap: () => showAdaptiveBottomSheet(
presenceUserId: userId, context: context,
), builder: (c) => UserBottomSheet(
title: Text( user: user,
displayname, profile: profile,
maxLines: 1, outerContext: context,
overflow: TextOverflow.ellipsis,
),
subtitle: Text(
userId,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: theme.colorScheme.secondary,
), ),
), ),
onTap: isMember ? null : onTap, ),
trailing: isMember title: Text(
? Text(L10n.of(context).participant) profile.displayName ?? profile.userId.localpart ?? l10n.user,
: const Icon(Icons.person_add_outlined), maxLines: 1,
overflow: TextOverflow.ellipsis,
),
subtitle: Text(
profile.userId,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: theme.colorScheme.secondary,
),
),
trailing: TextButton.icon(
onPressed: isMember ? null : onTap,
label: Text(isMember ? l10n.participant : l10n.invite),
icon: Icon(isMember ? Icons.check : Icons.add),
), ),
); );
} }

Loading…
Cancel
Save