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: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…
Add table
Add a link
Reference in a new issue