diff --git a/lib/main.dart b/lib/main.dart index b1ca9130..7bf5881d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -37,7 +37,7 @@ void main() async { Zone.current.handleUncaughtError(details.exception, details.stack); final clients = await ClientManager.getClients(); - Logs().level = kReleaseMode ? Level.debug : Level.verbose; + Logs().level = kReleaseMode ? Level.warning : Level.verbose; if (PlatformInfos.isMobile) { BackgroundPush.clientOnly(clients.first); diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index e8702ddd..ab42c8c9 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -182,8 +182,8 @@ class _BootstrapDialogState extends State { TextField( minLines: 4, maxLines: 4, - autofocus: true, autocorrect: false, + readOnly: _recoveryKeyInputLoading, autofillHints: _recoveryKeyInputLoading ? null : [AutofillHints.password], @@ -196,31 +196,39 @@ class _BootstrapDialogState extends State { ), const SizedBox(height: 16), ElevatedButton.icon( - icon: const Icon(Icons.lock_open_outlined), + icon: _recoveryKeyInputLoading + ? const CircularProgressIndicator.adaptive() + : const Icon(Icons.lock_open_outlined), label: Text(L10n.of(context).unlockChatBackup), - onPressed: () async { - setState(() { - _recoveryKeyInputError = null; - _recoveryKeyInputLoading = true; - }); - try { - final key = _recoveryKeyTextEditingController.text; - await bootstrap.newSsssKey.unlock( - keyOrPassphrase: key, - ); - await bootstrap.client.encryption.crossSigning - .selfSign( - keyOrPassphrase: key, - ); - await bootstrap.openExistingSsss(); - } catch (e, s) { - Logs().w('Unable to unlock SSSS', e, s); - setState(() => _recoveryKeyInputError = - L10n.of(context).oopsSomethingWentWrong); - } finally { - setState(() => _recoveryKeyInputLoading = false); - } - }), + onPressed: _recoveryKeyInputLoading + ? null + : () async { + setState(() { + _recoveryKeyInputError = null; + _recoveryKeyInputLoading = true; + }); + try { + final key = + _recoveryKeyTextEditingController.text; + await bootstrap.newSsssKey.unlock( + keyOrPassphrase: key, + ); + Logs().d('SSSS unlocked'); + await bootstrap.client.encryption.crossSigning + .selfSign( + keyOrPassphrase: key, + ); + Logs().d('Successful elfsigned'); + await bootstrap.openExistingSsss(); + } catch (e, s) { + Logs().w('Unable to unlock SSSS', e, s); + setState(() => _recoveryKeyInputError = + L10n.of(context).oopsSomethingWentWrong); + } finally { + setState( + () => _recoveryKeyInputLoading = false); + } + }), const SizedBox(height: 16), Row(children: [ const Expanded(child: Divider()), @@ -239,18 +247,20 @@ class _BootstrapDialogState extends State { icon: const Icon(Icons.transfer_within_a_station_outlined), label: Text(L10n.of(context).transferFromAnotherDevice), - onPressed: () async { - final req = await showFutureLoadingDialog( - context: context, - future: () => widget - .client.userDeviceKeys[widget.client.userID] - .startVerification(), - ); - if (req.error != null) return; - await KeyVerificationDialog(request: req.result) - .show(context); - Navigator.of(context, rootNavigator: false).pop(); - }, + onPressed: _recoveryKeyInputLoading + ? null + : () async { + final req = await showFutureLoadingDialog( + context: context, + future: () => widget + .client.userDeviceKeys[widget.client.userID] + .startVerification(), + ); + if (req.error != null) return; + await KeyVerificationDialog(request: req.result) + .show(context); + Navigator.of(context, rootNavigator: false).pop(); + }, ), const SizedBox(height: 16), ElevatedButton.icon( @@ -260,20 +270,22 @@ class _BootstrapDialogState extends State { ), icon: const Icon(Icons.delete_outlined), label: Text(L10n.of(context).securityKeyLost), - onPressed: () async { - if (OkCancelResult.ok == - await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context).securityKeyLost, - message: L10n.of(context).wipeChatBackup, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - isDestructiveAction: true, - )) { - setState(() => _createBootstrap(true)); - } - }, + onPressed: _recoveryKeyInputLoading + ? null + : () async { + if (OkCancelResult.ok == + await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).securityKeyLost, + message: L10n.of(context).wipeChatBackup, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructiveAction: true, + )) { + setState(() => _createBootstrap(true)); + } + }, ) ], ), diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 2214d152..5a49f342 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -15,7 +15,6 @@ import 'matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart'; abstract class ClientManager { static const String clientNamespace = 'im.fluffychat.store.clients'; static Future> getClients() async { - Logs().level = Level.warning; if (PlatformInfos.isLinux) { Hive.init((await getApplicationSupportDirectory()).path); } else { diff --git a/pubspec.lock b/pubspec.lock index 658c4cfd..f6a61965 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -775,7 +775,7 @@ packages: description: path: "." ref: "krille/idb" - resolved-ref: "60b2b6b5fcc45a5bedbe6eafee19258784e1a329" + resolved-ref: "74037fb8ae0f4c4e1ac946d7c2057bf6e2da7aaf" url: "https://gitlab.com/famedly/company/frontend/famedlysdk.git" source: git version: "0.7.0-nullsafety.6"