refactor: Replace user bottom sheet with menu and small dialog
Signed-off-by: Krille <c.kussowski@famedly.com>
This commit is contained in:
parent
b6b1d6ddb1
commit
a12c48fae6
21 changed files with 734 additions and 851 deletions
296
lib/widgets/member_actions_popup_menu_button.dart
Normal file
296
lib/widgets/member_actions_popup_menu_button.dart
Normal file
|
|
@ -0,0 +1,296 @@
|
|||
import 'package:fluffychat/widgets/permission_slider_dialog.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'adaptive_dialogs/show_modal_action_popup.dart';
|
||||
import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
|
||||
import 'adaptive_dialogs/show_text_input_dialog.dart';
|
||||
import 'adaptive_dialogs/user_dialog.dart';
|
||||
import 'avatar.dart';
|
||||
import 'future_loading_dialog.dart';
|
||||
|
||||
class MemberActionsPopupMenuButton extends StatelessWidget {
|
||||
final Widget child;
|
||||
final User user;
|
||||
final void Function()? onMention;
|
||||
|
||||
const MemberActionsPopupMenuButton({
|
||||
required this.child,
|
||||
required this.user,
|
||||
this.onMention,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final displayname = user.calcDisplayname();
|
||||
final isMe = user.room.client.userID == user.id;
|
||||
return PopupMenuButton(
|
||||
onSelected: (action) async {
|
||||
switch (action) {
|
||||
case _MemberActions.mention:
|
||||
onMention?.call();
|
||||
return;
|
||||
case _MemberActions.setRole:
|
||||
final power = await showPermissionChooser(
|
||||
context,
|
||||
currentLevel: user.powerLevel,
|
||||
maxLevel: user.room.ownPowerLevel,
|
||||
);
|
||||
if (power == null) return;
|
||||
if (!context.mounted) return;
|
||||
if (power >= 100) {
|
||||
final consent = await showOkCancelAlertDialog(
|
||||
context: context,
|
||||
title: L10n.of(context).areYouSure,
|
||||
message: L10n.of(context).makeAdminDescription,
|
||||
);
|
||||
if (consent != OkCancelResult.ok) return;
|
||||
if (!context.mounted) return;
|
||||
}
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => user.setPower(power),
|
||||
);
|
||||
return;
|
||||
case _MemberActions.kick:
|
||||
if (await showOkCancelAlertDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context).areYouSure,
|
||||
okLabel: L10n.of(context).yes,
|
||||
cancelLabel: L10n.of(context).no,
|
||||
message: L10n.of(context).kickUserDescription,
|
||||
) ==
|
||||
OkCancelResult.ok) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => user.kick(),
|
||||
);
|
||||
}
|
||||
return;
|
||||
case _MemberActions.ban:
|
||||
if (await showOkCancelAlertDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context).areYouSure,
|
||||
okLabel: L10n.of(context).yes,
|
||||
cancelLabel: L10n.of(context).no,
|
||||
message: L10n.of(context).banUserDescription,
|
||||
) ==
|
||||
OkCancelResult.ok) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => user.ban(),
|
||||
);
|
||||
}
|
||||
return;
|
||||
case _MemberActions.report:
|
||||
final score = await showModalActionPopup<int>(
|
||||
context: context,
|
||||
title: L10n.of(context).reportUser,
|
||||
message: L10n.of(context).howOffensiveIsThisContent,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
actions: [
|
||||
AdaptiveModalAction(
|
||||
value: -100,
|
||||
label: L10n.of(context).extremeOffensive,
|
||||
),
|
||||
AdaptiveModalAction(
|
||||
value: -50,
|
||||
label: L10n.of(context).offensive,
|
||||
),
|
||||
AdaptiveModalAction(
|
||||
value: 0,
|
||||
label: L10n.of(context).inoffensive,
|
||||
),
|
||||
],
|
||||
);
|
||||
if (score == null) return;
|
||||
final reason = await showTextInputDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context).whyDoYouWantToReportThis,
|
||||
okLabel: L10n.of(context).ok,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
hintText: L10n.of(context).reason,
|
||||
);
|
||||
if (reason == null || reason.isEmpty) return;
|
||||
|
||||
final result = await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => user.room.client.reportEvent(
|
||||
user.room.id,
|
||||
user.id,
|
||||
reason: reason,
|
||||
score: score,
|
||||
),
|
||||
);
|
||||
if (result.error != null) return;
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(L10n.of(context).contentHasBeenReported)),
|
||||
);
|
||||
return;
|
||||
case _MemberActions.info:
|
||||
await UserDialog.show(
|
||||
context: context,
|
||||
profile: Profile(
|
||||
userId: user.id,
|
||||
displayName: user.displayName,
|
||||
avatarUrl: user.avatarUrl,
|
||||
),
|
||||
);
|
||||
return;
|
||||
case _MemberActions.unban:
|
||||
if (await showOkCancelAlertDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context).areYouSure,
|
||||
okLabel: L10n.of(context).yes,
|
||||
cancelLabel: L10n.of(context).no,
|
||||
message: L10n.of(context).unbanUserDescription,
|
||||
) ==
|
||||
OkCancelResult.ok) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => user.unban(),
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
},
|
||||
itemBuilder: (context) => <PopupMenuEntry<_MemberActions>>[
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.info,
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Avatar(
|
||||
name: displayname,
|
||||
mxContent: user.avatarUrl,
|
||||
presenceUserId: user.id,
|
||||
presenceBackgroundColor: theme.colorScheme.surfaceContainer,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
displayname,
|
||||
textAlign: TextAlign.center,
|
||||
style: theme.textTheme.labelLarge,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Text(
|
||||
user.id,
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(fontSize: 10),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const PopupMenuDivider(),
|
||||
if (onMention != null)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.mention,
|
||||
child: ListTile(
|
||||
leading: const Icon(Icons.alternate_email_outlined),
|
||||
title: Text(L10n.of(context).mention),
|
||||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
enabled:
|
||||
user.room.canChangePowerLevel && user.canChangeUserPowerLevel,
|
||||
value: _MemberActions.setRole,
|
||||
child: ListTile(
|
||||
leading: const Icon(Icons.admin_panel_settings_outlined),
|
||||
title: Text(L10n.of(context).chatPermissions),
|
||||
subtitle: Text(
|
||||
user.powerLevel < 50
|
||||
? L10n.of(context).userLevel(user.powerLevel)
|
||||
: user.powerLevel < 100
|
||||
? L10n.of(context).moderatorLevel(user.powerLevel)
|
||||
: L10n.of(context).adminLevel(user.powerLevel),
|
||||
style: const TextStyle(fontSize: 10),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (user.canKick)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.kick,
|
||||
child: ListTile(
|
||||
leading: Icon(
|
||||
Icons.person_remove_outlined,
|
||||
color: theme.colorScheme.onErrorContainer,
|
||||
),
|
||||
title: Text(
|
||||
L10n.of(context).kickFromChat,
|
||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (user.canBan)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.ban,
|
||||
child: ListTile(
|
||||
leading: Icon(
|
||||
Icons.block_outlined,
|
||||
color: theme.colorScheme.onErrorContainer,
|
||||
),
|
||||
title: Text(
|
||||
L10n.of(context).banFromChat,
|
||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (user.canBan && user.membership == Membership.ban)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.ban,
|
||||
child: ListTile(
|
||||
leading: const Icon(Icons.warning),
|
||||
title: Text(
|
||||
L10n.of(context).unbanFromChat,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (user.canBan && user.membership == Membership.ban)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.unban,
|
||||
child: ListTile(
|
||||
leading: const Icon(Icons.warning_outlined),
|
||||
title: Text(L10n.of(context).unbanFromChat),
|
||||
),
|
||||
),
|
||||
if (!isMe)
|
||||
PopupMenuItem(
|
||||
value: _MemberActions.report,
|
||||
child: ListTile(
|
||||
leading: Icon(
|
||||
Icons.gavel_outlined,
|
||||
color: theme.colorScheme.onErrorContainer,
|
||||
),
|
||||
title: Text(
|
||||
L10n.of(context).reportUser,
|
||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
enum _MemberActions {
|
||||
info,
|
||||
mention,
|
||||
setRole,
|
||||
kick,
|
||||
ban,
|
||||
unban,
|
||||
report,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue