chore: Nicer invite selection view
This commit is contained in:
parent
cb32608674
commit
41782c497e
2 changed files with 46 additions and 57 deletions
|
|
@ -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…
Add table
Reference in a new issue