chore: Follow up dialog themes

Signed-off-by: Krille <c.kussowski@famedly.com>
pull/1752/head
Krille 7 months ago
parent 8db9a05071
commit eeb630b5fc
No known key found for this signature in database
GPG Key ID: E067ECD60F1A0652

@ -1,12 +1,5 @@
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart';
import 'package:swipe_to_action/swipe_to_action.dart';
import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat/events/room_creation_state_event.dart'; import 'package:fluffychat/pages/chat/events/room_creation_state_event.dart';
import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/date_time_extension.dart';
@ -15,6 +8,12 @@ import 'package:fluffychat/utils/string_color.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart';
import 'package:swipe_to_action/swipe_to_action.dart';
import '../../../config/app_config.dart'; import '../../../config/app_config.dart';
import 'message_content.dart'; import 'message_content.dart';
import 'message_reactions.dart'; import 'message_reactions.dart';
@ -237,16 +236,17 @@ class Message extends StatelessWidget {
builder: (context, snapshot) { builder: (context, snapshot) {
final user = snapshot.data ?? final user = snapshot.data ??
event.senderFromMemoryOrFallback; event.senderFromMemoryOrFallback;
return MemberActionsPopupMenuButton( return Avatar(
onMention: onMention,
user: user,
child: Avatar(
mxContent: user.avatarUrl, mxContent: user.avatarUrl,
name: user.calcDisplayname(), name: user.calcDisplayname(),
onTap: () => showMemberActionsPopupMenu(
context: context,
user: user,
onMention: onMention,
),
presenceUserId: user.stateKey, presenceUserId: user.stateKey,
presenceBackgroundColor: presenceBackgroundColor:
wallpaperMode ? Colors.transparent : null, wallpaperMode ? Colors.transparent : null,
),
); );
}, },
), ),

@ -1,10 +1,9 @@
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/config/app_config.dart';
import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart';
import '../../widgets/avatar.dart'; import '../../widgets/avatar.dart';
class ParticipantListItem extends StatelessWidget { class ParticipantListItem extends StatelessWidget {
@ -32,9 +31,8 @@ class ParticipantListItem extends StatelessWidget {
return Opacity( return Opacity(
opacity: user.membership == Membership.join ? 1 : 0.5, opacity: user.membership == Membership.join ? 1 : 0.5,
child: MemberActionsPopupMenuButton(
user: user,
child: ListTile( child: ListTile(
onTap: () => showMemberActionsPopupMenu(context: context, user: user),
title: Row( title: Row(
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
@ -95,7 +93,6 @@ class ParticipantListItem extends StatelessWidget {
presenceUserId: user.stateKey, presenceUserId: user.stateKey,
), ),
), ),
),
); );
} }
} }

@ -23,6 +23,7 @@ class UserDialog extends StatelessWidget {
}) => }) =>
showAdaptiveDialog( showAdaptiveDialog(
context: context, context: context,
barrierDismissible: true,
builder: (context) => UserDialog( builder: (context) => UserDialog(
profile, profile,
noProfileWarning: noProfileWarning, noProfileWarning: noProfileWarning,
@ -49,9 +50,8 @@ class UserDialog extends StatelessWidget {
child: Center(child: Text(displayname, textAlign: TextAlign.center)), child: Center(child: Text(displayname, textAlign: TextAlign.center)),
), ),
content: ConstrainedBox( content: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 256), constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256),
child: SelectionArea( child: SelectionArea(
child: Center(
child: PresenceBuilder( child: PresenceBuilder(
userId: profile.userId, userId: profile.userId,
client: Matrix.of(context).client, client: Matrix.of(context).client,
@ -66,17 +66,19 @@ class UserDialog extends StatelessWidget {
lastActiveTimestamp.localizedTimeShort(context), lastActiveTimestamp.localizedTimeShort(context),
) )
: null; : null;
return Column( return SingleChildScrollView(
child: Column(
spacing: 8, spacing: 8,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
HoverBuilder( HoverBuilder(
builder: (context, hovered) => StatefulBuilder( builder: (context, hovered) => StatefulBuilder(
builder: (context, setState) => GestureDetector( builder: (context, setState) => GestureDetector(
onTap: () { onTap: () {
Clipboard.setData( Clipboard.setData(
ClipboardData(text: profile.userId)); ClipboardData(text: profile.userId),
);
setState(() { setState(() {
copied = true; copied = true;
}); });
@ -115,15 +117,18 @@ class UserDialog extends StatelessWidget {
), ),
), ),
), ),
Avatar( Center(
child: Avatar(
mxContent: profile.avatarUrl, mxContent: profile.avatarUrl,
name: displayname, name: displayname,
size: Avatar.defaultSize * 2, size: Avatar.defaultSize * 2,
), ),
),
if (presenceText != null) if (presenceText != null)
Text( Text(
presenceText, presenceText,
style: const TextStyle(fontSize: 10), style: const TextStyle(fontSize: 10),
textAlign: TextAlign.center,
), ),
if (statusMsg != null) if (statusMsg != null)
Linkify( Linkify(
@ -139,14 +144,14 @@ class UserDialog extends StatelessWidget {
UrlLauncher(context, url.url).launchUrl(), UrlLauncher(context, url.url).launchUrl(),
), ),
], ],
),
); );
}, },
), ),
), ),
), ),
),
actions: [ actions: [
if (client.userID != profile.userId) ...[], if (client.userID != profile.userId) ...[
AdaptiveDialogAction( AdaptiveDialogAction(
bigButtons: true, bigButtons: true,
onPressed: () async { onPressed: () async {
@ -181,6 +186,7 @@ class UserDialog extends StatelessWidget {
style: TextStyle(color: theme.colorScheme.error), style: TextStyle(color: theme.colorScheme.error),
), ),
), ),
],
AdaptiveDialogAction( AdaptiveDialogAction(
bigButtons: true, bigButtons: true,
onPressed: Navigator.of(context).pop, onPressed: Navigator.of(context).pop,

@ -1,9 +1,8 @@
import 'package:fluffychat/widgets/permission_slider_dialog.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/widgets/permission_slider_dialog.dart';
import 'adaptive_dialogs/show_modal_action_popup.dart'; import 'adaptive_dialogs/show_modal_action_popup.dart';
import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'adaptive_dialogs/show_text_input_dialog.dart'; import 'adaptive_dialogs/show_text_input_dialog.dart';
@ -11,25 +10,155 @@ import 'adaptive_dialogs/user_dialog.dart';
import 'avatar.dart'; import 'avatar.dart';
import 'future_loading_dialog.dart'; import 'future_loading_dialog.dart';
class MemberActionsPopupMenuButton extends StatelessWidget { void showMemberActionsPopupMenu({
final Widget child; required BuildContext context,
final User user; required User user,
final void Function()? onMention; void Function()? onMention,
}) async {
const MemberActionsPopupMenuButton({
required this.child,
required this.user,
this.onMention,
super.key,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context); final theme = Theme.of(context);
final displayname = user.calcDisplayname(); final displayname = user.calcDisplayname();
final isMe = user.room.client.userID == user.id; final isMe = user.room.client.userID == user.id;
return PopupMenuButton(
onSelected: (action) async { final overlay = Overlay.of(context).context.findRenderObject() as RenderBox;
final button = context.findRenderObject() as RenderBox;
final position = RelativeRect.fromRect(
Rect.fromPoints(
button.localToGlobal(const Offset(0, -65), ancestor: overlay),
button.localToGlobal(
button.size.bottomRight(Offset.zero) + const Offset(-50, 0),
ancestor: overlay,
),
),
Offset.zero & overlay.size,
);
final action = await showMenu<_MemberActions>(
context: context,
position: position,
items: <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),
),
),
),
],
);
if (action == null) return;
if (!context.mounted) return;
switch (action) { switch (action) {
case _MemberActions.mention: case _MemberActions.mention:
onMention?.call(); onMention?.call();
@ -159,130 +288,6 @@ class MemberActionsPopupMenuButton extends StatelessWidget {
future: () => user.unban(), 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,
);
} }
} }

@ -1,8 +1,10 @@
import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart';
Future<int?> showPermissionChooser( Future<int?> showPermissionChooser(
BuildContext context, { BuildContext context, {
int currentLevel = 0, int currentLevel = 0,

Loading…
Cancel
Save