chore: Nicer invite selection view

pull/1437/head
Krille 4 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:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.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/matrix.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 {
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(
context: context,
future: () => room.invite(id),

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