From e7b851dda2f9224edb2c38d96904b6a0f7e1f9a3 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sat, 30 Jul 2022 08:36:17 +0200 Subject: [PATCH] fix: Permission chooser dialog on iOS --- assets/l10n/intl_en.arb | 4 +- .../chat_permissions_settings.dart | 7 +- .../user_bottom_sheet/user_bottom_sheet.dart | 7 +- lib/widgets/contacts_list.dart | 119 ---------------- lib/widgets/permission_slider_dialog.dart | 133 ++++++++---------- 5 files changed, 66 insertions(+), 204 deletions(-) delete mode 100644 lib/widgets/contacts_list.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 89f884316..fc0170ba0 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2875,5 +2875,7 @@ "placeholders": { "count": {} } - } + }, + "user": "User", + "custom": "Custom" } diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index 372edc5f4..32fbb9d4c 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -30,9 +30,10 @@ class ChatPermissionsSettingsController extends State { SnackBar(content: Text(L10n.of(context)!.noPermission))); return; } - final newLevel = - await PermissionSliderDialog(initialPermission: currentLevel) - .show(context); + final newLevel = await showPermissionChooser( + context, + currentLevel: currentLevel, + ); if (newLevel == null) return; final content = Map.from( room.getState(EventTypes.RoomPowerLevels)!.content); diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart index 4316b62ba..bb769617e 100644 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart +++ b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart @@ -115,9 +115,10 @@ class UserBottomSheetController extends State { } break; case 'permission': - final newPermission = await PermissionSliderDialog( - initialPermission: widget.user.powerLevel) - .show(context); + final newPermission = await showPermissionChooser( + context, + currentLevel: widget.user.powerLevel, + ); if (newPermission != null) { if (newPermission == 100 && await _askConfirmation() == false) break; await showFutureLoadingDialog( diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart deleted file mode 100644 index a021d2aca..000000000 --- a/lib/widgets/contacts_list.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/matrix_sdk_extensions.dart/client_presence_extension.dart'; -import '../utils/matrix_sdk_extensions.dart/presence_extension.dart'; - -class ContactsList extends StatefulWidget { - final TextEditingController searchController; - - const ContactsList({ - Key? key, - required this.searchController, - }) : super(key: key); - @override - _ContactsState createState() => _ContactsState(); -} - -class _ContactsState extends State { - StreamSubscription? _onSync; - - @override - void dispose() { - _onSync?.cancel(); - super.dispose(); - } - - DateTime _lastSetState = DateTime.now(); - Timer? _coolDown; - - void _updateView() { - _lastSetState = DateTime.now(); - setState(() {}); - } - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - _onSync ??= client.onSync.stream.listen((_) { - if (DateTime.now().millisecondsSinceEpoch - - _lastSetState.millisecondsSinceEpoch < - 1000) { - _coolDown?.cancel(); - _coolDown = Timer(const Duration(seconds: 1), _updateView); - } else { - _updateView(); - } - }); - final contactList = Matrix.of(context) - .client - .contactList - .where((p) => p.userid - .toLowerCase() - .contains(widget.searchController.text.toLowerCase())) - .toList(); - return ListView.builder( - itemCount: contactList.length, - itemBuilder: (_, i) => _ContactListTile(contact: contactList[i]), - ); - } -} - -class _ContactListTile extends StatelessWidget { - final CachedPresence contact; - - const _ContactListTile({Key? key, required this.contact}) : super(key: key); - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: Matrix.of(context).client.getProfileFromUserId(contact.userid), - builder: (context, snapshot) { - final displayname = snapshot.data?.displayName ?? - contact.userid.localpart ?? - 'No valid MXID'; - final avatarUrl = snapshot.data?.avatarUrl; - return ListTile( - leading: SizedBox( - width: Avatar.defaultSize, - height: Avatar.defaultSize, - child: Stack( - children: [ - Center( - child: Avatar( - mxContent: avatarUrl, - name: displayname, - ), - ), - Align( - alignment: Alignment.bottomRight, - child: Icon( - Icons.circle, - color: contact.color, - size: 12, - ), - ), - ], - ), - ), - title: Text(displayname), - subtitle: Text(contact.getLocalizedStatusMessage(context), - style: contact.statusMsg?.isNotEmpty ?? false - ? TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ) - : null), - onTap: () => VRouter.of(context).toSegments([ - 'rooms', - Matrix.of(context).client.getDirectChatFromUserId(contact.userid)! - ]), - ); - }); - } -} diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index 47733e1b0..d2b1991b7 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -1,91 +1,68 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_flat_button.dart'; - -class PermissionSliderDialog extends StatefulWidget { - const PermissionSliderDialog({ - Key? key, - this.initialPermission = 0, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ); - - final int initialPermission; - @override - _PermissionSliderDialogState createState() => _PermissionSliderDialogState(); +enum PermissionLevel { + user, + moderator, + admin, + custom, } -class _PermissionSliderDialogState extends State { - late int _permission; - @override - void initState() { - _permission = widget.initialPermission; - super.initState(); +extension on PermissionLevel { + String toLocalizedString(BuildContext context) { + switch (this) { + case PermissionLevel.user: + return L10n.of(context)!.user; + case PermissionLevel.moderator: + return L10n.of(context)!.moderator; + case PermissionLevel.admin: + return L10n.of(context)!.admin; + case PermissionLevel.custom: + default: + return L10n.of(context)!.custom; + } } +} - @override - Widget build(BuildContext context) { - final title = Text( - L10n.of(context)!.setPermissionsLevel, - textAlign: TextAlign.center, - ); - final content = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Level: ' + - (_permission == 100 - ? '$_permission (${L10n.of(context)!.admin})' - : _permission >= 50 - ? '$_permission (${L10n.of(context)!.moderator})' - : _permission.toString())), - SizedBox( - height: 56, - child: Slider.adaptive( - value: _permission.toDouble(), - onChanged: (d) => setState(() => _permission = d.round()), - max: 100.0, - min: 0.0, +Future showPermissionChooser(BuildContext context, + {int currentLevel = 0}) async { + final permissionLevel = await showModalActionSheet( + context: context, + title: L10n.of(context)!.setPermissionsLevel, + actions: PermissionLevel.values + .map( + (level) => SheetAction( + key: level, + label: level.toLocalizedString(context), ), - ), - ], - ); - final buttons = [ - AdaptiveFlatButton( - label: L10n.of(context)!.cancel, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(null), - ), - AdaptiveFlatButton( - label: L10n.of(context)!.confirm, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(_permission), - ), - ]; - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: content, - actions: buttons, + ) + .toList(), + ); + if (permissionLevel == null) return null; + + switch (permissionLevel) { + case PermissionLevel.user: + return 0; + case PermissionLevel.moderator: + return 50; + case PermissionLevel.admin: + return 100; + case PermissionLevel.custom: + final customLevel = await showTextInputDialog( + context: context, + title: L10n.of(context)!.setPermissionsLevel, + textFields: [ + DialogTextField( + initialText: currentLevel.toString(), + keyboardType: TextInputType.number, + autocorrect: false, + ) + ], ); - } - return AlertDialog( - title: title, - content: content, - actions: buttons, - ); + if (customLevel == null) return null; + return int.tryParse(customLevel.first); } }