Implement missing account settings

This commit is contained in:
Christian Pauly 2020-09-21 17:50:01 +02:00
parent 9d3f272c2a
commit 165c64ce36
6 changed files with 106 additions and 1 deletions

View file

@ -5,6 +5,8 @@
- Display messages with up to 10 emotes or emoji bigger
- New design for the chat list and message bubbles
- Implement reactions
- Implement password change
- Implement deactivate user account
### Fixes
- Timeline randomly resorting while more history is being fetched
- Automatically request history if the "load more" button is on the screen

View file

@ -79,6 +79,7 @@ class SimpleDialogs {
String contentText,
String confirmText,
String cancelText,
bool dangerous = false,
}) async {
var confirmed = false;
await showDialog(
@ -98,6 +99,7 @@ class SimpleDialogs {
child: Text(
confirmText?.toUpperCase() ??
L10n.of(context).confirm.toUpperCase(),
style: TextStyle(color: dangerous ? Colors.red : null),
),
onPressed: () {
confirmed = true;

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2020-09-19T15:27:28.862887",
"@@last_modified": "2020-09-21T17:49:17.725032",
"About": "About",
"@About": {
"type": "text",
@ -453,6 +453,16 @@
"type": "text",
"placeholders": {}
},
"This will deactivate your user account. This can not be undone! Are you sure?": "This will deactivate your user account. This can not be undone! Are you sure?",
"@This will deactivate your user account. This can not be undone! Are you sure?": {
"type": "text",
"placeholders": {}
},
"Delete account": "Delete account",
"@Delete account": {
"type": "text",
"placeholders": {}
},
"Delete message": "Delete message",
"@Delete message": {
"type": "text",
@ -1006,6 +1016,11 @@
"type": "text",
"placeholders": {}
},
"Password has been changed": "Password has been changed",
"@Password has been changed": {
"type": "text",
"placeholders": {}
},
"Pick image": "Pick image",
"@Pick image": {
"type": "text",
@ -1617,6 +1632,11 @@
"type": "text",
"placeholders": {}
},
"Warning!": "Warning!",
"@Warning!": {
"type": "text",
"placeholders": {}
},
"Wallpaper": "Wallpaper",
"@Wallpaper": {
"type": "text",

View file

@ -342,6 +342,11 @@ class L10n extends MatrixLocalizations {
String get delete => Intl.message("Delete");
String get deactivateAccountWarning => Intl.message(
'This will deactivate your user account. This can not be undone! Are you sure?');
String get deleteAccount => Intl.message('Delete account');
String get deleteMessage => Intl.message("Delete message");
String get deny => Intl.message("Deny");
@ -636,6 +641,9 @@ class L10n extends MatrixLocalizations {
String get password => Intl.message("Password");
String get passwordHasBeenChanged =>
Intl.message('Password has been changed');
String get pickImage => Intl.message('Pick image');
String get pin => Intl.message('Pin');
@ -988,6 +996,8 @@ class L10n extends MatrixLocalizations {
Intl.message("Waiting for partner to accept the numbers...",
name: "waitingPartnerNumbers");
String get warning => Intl.message('Warning!');
String get wallpaper => Intl.message("Wallpaper");
String get warningEncryptionInBeta => Intl.message(

View file

@ -239,6 +239,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Currently active"),
"Dark": MessageLookupByLibrary.simpleMessage("Dark"),
"Delete": MessageLookupByLibrary.simpleMessage("Delete"),
"Delete account":
MessageLookupByLibrary.simpleMessage("Delete account"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Delete message"),
"Deny": MessageLookupByLibrary.simpleMessage("Deny"),
@ -362,6 +364,8 @@ class MessageLookup extends MessageLookupByLibrary {
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Participating user devices"),
"Password": MessageLookupByLibrary.simpleMessage("Password"),
"Password has been changed":
MessageLookupByLibrary.simpleMessage("Password has been changed"),
"Pick image": MessageLookupByLibrary.simpleMessage("Pick image"),
"Pin": MessageLookupByLibrary.simpleMessage("Pin"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
@ -438,6 +442,9 @@ class MessageLookup extends MessageLookupByLibrary {
"They Match": MessageLookupByLibrary.simpleMessage("They Match"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"This room has been archived."),
"This will deactivate your user account. This can not be undone! Are you sure?":
MessageLookupByLibrary.simpleMessage(
"This will deactivate your user account. This can not be undone! Are you sure?"),
"Thursday": MessageLookupByLibrary.simpleMessage("Thursday"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Try to send again"),
@ -464,6 +471,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Visible for everyone"),
"Voice message": MessageLookupByLibrary.simpleMessage("Voice message"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Wallpaper"),
"Warning!": MessageLookupByLibrary.simpleMessage("Warning!"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Wednesday"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(

View file

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/settings_themes.dart';
import 'package:fluffychat/config/app_config.dart';
@ -55,6 +56,52 @@ class _SettingsState extends State<Settings> {
.tryRequestWithLoadingDialog(matrix.client.logout());
}
void _changePasswordAccountAction(BuildContext context) async {
final oldPassword = await SimpleDialogs(context).enterText(
password: true,
titleText: L10n.of(context).pleaseEnterYourPassword,
);
if (oldPassword == null) return;
final newPassword = await SimpleDialogs(context).enterText(
password: true,
titleText: L10n.of(context).chooseAStrongPassword,
);
if (newPassword == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context)
.client
.changePassword(newPassword, oldPassword: oldPassword),
);
BotToast.showText(text: L10n.of(context).passwordHasBeenChanged);
}
void _deleteAccountAction(BuildContext context) async {
if (await SimpleDialogs(context).askConfirmation(
titleText: L10n.of(context).warning,
contentText: L10n.of(context).deactivateAccountWarning,
dangerous: true,
) ==
false) {
return;
}
if (await SimpleDialogs(context).askConfirmation(dangerous: true) ==
false) {
return;
}
final password = await SimpleDialogs(context).enterText(
password: true,
titleText: L10n.of(context).pleaseEnterYourPassword,
);
if (password == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context).client.deactivateAccount(auth: {
'type': 'm.login.password',
'user': Matrix.of(context).client.userID,
'password': password,
}),
);
}
void setJitsiInstanceAction(BuildContext context) async {
var jitsi = await SimpleDialogs(context).enterText(
titleText: L10n.of(context).editJitsiInstance,
@ -359,11 +406,27 @@ class _SettingsState extends State<Settings> {
title: Text(L10n.of(context).sendBugReports),
onTap: () => SentryController.toggleSentryAction(context),
),
Divider(thickness: 1),
ListTile(
trailing: Icon(Icons.vpn_key),
title: Text(
'Change password',
),
onTap: () => _changePasswordAccountAction(context),
),
ListTile(
trailing: Icon(Icons.exit_to_app),
title: Text(L10n.of(context).logout),
onTap: () => logoutAction(context),
),
ListTile(
trailing: Icon(Icons.delete_forever),
title: Text(
L10n.of(context).deleteAccount,
style: TextStyle(color: Colors.red),
),
onTap: () => _deleteAccountAction(context),
),
Divider(thickness: 1),
ListTile(
title: Text(