feat: Add chat permissions settings

This commit is contained in:
Christian Pauly 2020-12-05 13:03:57 +01:00
commit 4c8744f027
7 changed files with 466 additions and 81 deletions

View file

@ -0,0 +1,32 @@
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class AdaptiveFlatButton extends StatelessWidget {
final Widget child;
final Color textColor;
final Function onPressed;
const AdaptiveFlatButton({
Key key,
this.child,
this.textColor,
this.onPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
if (PlatformInfos.isCupertinoStyle) {
return CupertinoDialogAction(
child: child,
onPressed: onPressed,
textStyle: textColor != null ? TextStyle(color: textColor) : null,
);
}
return FlatButton(
child: child,
textColor: textColor,
onPressed: onPressed,
);
}
}

View file

@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../avatar.dart';
import 'adaptive_flat_button.dart';
import 'simple_dialogs.dart';
import '../../utils/string_color.dart';
@ -121,14 +122,14 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
mainAxisSize: MainAxisSize.min,
),
);
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).submit),
onPressed: () {
input = textEditingController.text;
checkInput();
},
));
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).skip),
onPressed: () => widget.request.openSSSS(skip: true),
));
@ -140,11 +141,11 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
style: TextStyle(fontSize: 20)),
margin: EdgeInsets.only(left: 8.0, right: 8.0),
);
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).accept),
onPressed: () => widget.request.acceptVerification(),
));
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).reject),
onPressed: () {
widget.request.rejectVerification().then((_) {
@ -204,11 +205,11 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
],
mainAxisSize: MainAxisSize.min,
);
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).theyMatch),
onPressed: () => widget.request.acceptSas(),
));
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
textColor: Colors.red,
child: Text(L10n.of(context).theyDontMatch),
onPressed: () => widget.request.rejectSas(),
@ -244,7 +245,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
],
mainAxisSize: MainAxisSize.min,
);
buttons.add(_AdaptiveFlatButton(
buttons.add(AdaptiveFlatButton(
child: Text(L10n.of(context).close),
onPressed: () => Navigator.of(context).pop(),
));
@ -359,32 +360,3 @@ class _Emoji extends StatelessWidget {
);
}
}
class _AdaptiveFlatButton extends StatelessWidget {
final Widget child;
final Color textColor;
final Function onPressed;
const _AdaptiveFlatButton({
Key key,
this.child,
this.textColor,
this.onPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
if (PlatformInfos.isCupertinoStyle) {
return CupertinoDialogAction(
child: child,
onPressed: onPressed,
textStyle: textColor != null ? TextStyle(color: textColor) : null,
);
}
return FlatButton(
child: child,
textColor: textColor,
onPressed: onPressed,
);
}
}

View file

@ -0,0 +1,85 @@
import 'package:fluffychat/components/dialogs/adaptive_flat_button.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
class PermissionSliderDialog extends StatefulWidget {
const PermissionSliderDialog({Key key, this.initialPermission = 0})
: super(key: key);
Future<int> show(BuildContext context) => PlatformInfos.isCupertinoStyle
? showCupertinoDialog<int>(context: context, builder: (context) => this)
: showDialog<int>(context: context, builder: (context) => this);
final int initialPermission;
@override
_PermissionSliderDialogState createState() => _PermissionSliderDialogState();
}
class _PermissionSliderDialogState extends State<PermissionSliderDialog> {
int _permission;
@override
void initState() {
_permission = widget.initialPermission;
super.initState();
}
@override
Widget build(BuildContext context) {
final slider = PlatformInfos.isCupertinoStyle
? CupertinoSlider(
value: _permission.toDouble(),
onChanged: (d) => setState(() => _permission = d.round()),
max: 100.0,
min: 0.0,
)
: Slider(
value: _permission.toDouble(),
onChanged: (d) => setState(() => _permission = d.round()),
max: 100.0,
min: 0.0,
);
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())),
Container(
height: 56,
child: slider,
),
],
);
final buttons = [
AdaptiveFlatButton(
child: Text(L10n.of(context).cancel),
onPressed: () => Navigator.of(context).pop<int>(null),
),
AdaptiveFlatButton(
child: Text(L10n.of(context).confirm),
onPressed: () => Navigator.of(context).pop<int>(_permission),
),
];
if (PlatformInfos.isCupertinoStyle) {
return CupertinoAlertDialog(
title: title,
content: content,
actions: buttons,
);
}
return AlertDialog(
title: title,
content: content,
actions: buttons,
);
}
}

View file

@ -3,6 +3,7 @@ import 'dart:math';
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/dialogs/permission_slider_dialog.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/fluffy_share.dart';
import 'package:fluffychat/views/chat.dart';
@ -52,24 +53,14 @@ class UserBottomSheet extends StatelessWidget {
Navigator.of(context).pop();
}
break;
case 'admin':
if (await _askConfirmation()) {
case 'permission':
final newPermission =
await PermissionSliderDialog(initialPermission: user.powerLevel)
.show(context);
if (newPermission != null) {
if (newPermission == 100 && await _askConfirmation() == false) break;
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(100));
Navigator.of(context).pop();
}
break;
case 'moderator':
if (await _askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(50));
Navigator.of(context).pop();
}
break;
case 'user':
if (await _askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(0));
.tryRequestWithLoadingDialog(user.setPower(newPermission));
Navigator.of(context).pop();
}
break;
@ -119,38 +110,14 @@ class UserBottomSheet extends StatelessWidget {
value: 'message'),
);
}
if (user.canChangePowerLevel &&
user.room.ownPowerLevel == 100 &&
user.powerLevel != 100) {
if (user.canChangePowerLevel) {
items.add(
PopupMenuItem(
child: _TextWithIcon(
L10n.of(context).makeAnAdmin,
Icons.arrow_upward,
L10n.of(context).setPermissionsLevel,
Icons.edit_attributes_outlined,
),
value: 'admin'),
);
}
if (user.canChangePowerLevel &&
user.room.ownPowerLevel >= 50 &&
user.powerLevel != 50) {
items.add(
PopupMenuItem(
child: _TextWithIcon(
L10n.of(context).makeAModerator,
Icons.arrow_upward_outlined,
),
value: 'moderator'),
);
}
if (user.canChangePowerLevel && user.powerLevel != 0) {
items.add(
PopupMenuItem(
child: _TextWithIcon(
L10n.of(context).revokeAllPermissions,
Icons.arrow_downward_outlined,
),
value: 'user'),
value: 'permission'),
);
}
if (user.canKick) {