fix: Bootstrap hint
This commit is contained in:
parent
e0716f643c
commit
0c3612868d
6 changed files with 102 additions and 61 deletions
|
|
@ -91,6 +91,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
wordSpacing: 38,
|
||||
fontFamily: 'monospace',
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
@ -129,8 +130,8 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||
_recoveryKeyInputError ?? L10n.of(context).pleaseEnterSecurityKey;
|
||||
body = PlatformInfos.isCupertinoStyle
|
||||
? CupertinoTextField(
|
||||
minLines: 2,
|
||||
maxLines: 2,
|
||||
minLines: 1,
|
||||
maxLines: 1,
|
||||
autofocus: true,
|
||||
autocorrect: false,
|
||||
autofillHints: _recoveryKeyInputLoading
|
||||
|
|
@ -139,46 +140,22 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||
controller: _recoveryKeyTextEditingController,
|
||||
)
|
||||
: TextField(
|
||||
minLines: 2,
|
||||
maxLines: 2,
|
||||
minLines: 1,
|
||||
maxLines: 1,
|
||||
autofocus: true,
|
||||
autocorrect: false,
|
||||
autofillHints: _recoveryKeyInputLoading
|
||||
? null
|
||||
: [AutofillHints.password],
|
||||
controller: _recoveryKeyTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
border: UnderlineInputBorder(),
|
||||
filled: false,
|
||||
hintText: L10n.of(context).securityKey,
|
||||
),
|
||||
);
|
||||
buttons.add(AdaptiveFlatButton(
|
||||
textColor: Colors.red,
|
||||
label: 'Lost security key',
|
||||
onPressed: () async {
|
||||
if (OkCancelResult.ok ==
|
||||
await showOkCancelAlertDialog(
|
||||
context: context,
|
||||
useRootNavigator: false,
|
||||
title: L10n.of(context).securityKeyLost,
|
||||
message: L10n.of(context).wipeChatBackup,
|
||||
okLabel: L10n.of(context).ok,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
isDestructiveAction: true,
|
||||
)) {
|
||||
_createBootstrap(true);
|
||||
}
|
||||
},
|
||||
));
|
||||
buttons.add(AdaptiveFlatButton(
|
||||
label: L10n.of(context).transferFromAnotherDevice,
|
||||
onPressed: () async {
|
||||
final req = await Matrix.of(context)
|
||||
.client
|
||||
.userDeviceKeys[Matrix.of(context).client.userID]
|
||||
.startVerification();
|
||||
await KeyVerificationDialog(request: req).show(context);
|
||||
Navigator.of(context, rootNavigator: false).pop();
|
||||
},
|
||||
));
|
||||
buttons.add(AdaptiveFlatButton(
|
||||
label: L10n.of(context).next,
|
||||
label: L10n.of(context).unlockChatBackup,
|
||||
onPressed: () async {
|
||||
setState(() {
|
||||
_recoveryKeyInputError = null;
|
||||
|
|
@ -197,6 +174,35 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||
setState(() => _recoveryKeyInputLoading = false);
|
||||
}
|
||||
}));
|
||||
buttons.add(AdaptiveFlatButton(
|
||||
label: L10n.of(context).transferFromAnotherDevice,
|
||||
onPressed: () async {
|
||||
final req = await Matrix.of(context)
|
||||
.client
|
||||
.userDeviceKeys[Matrix.of(context).client.userID]
|
||||
.startVerification();
|
||||
await KeyVerificationDialog(request: req).show(context);
|
||||
Navigator.of(context, rootNavigator: false).pop();
|
||||
},
|
||||
));
|
||||
buttons.add(AdaptiveFlatButton(
|
||||
textColor: Colors.red,
|
||||
label: L10n.of(context).securityKeyLost,
|
||||
onPressed: () async {
|
||||
if (OkCancelResult.ok ==
|
||||
await showOkCancelAlertDialog(
|
||||
context: context,
|
||||
useRootNavigator: false,
|
||||
title: L10n.of(context).securityKeyLost,
|
||||
message: L10n.of(context).wipeChatBackup,
|
||||
okLabel: L10n.of(context).ok,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
isDestructiveAction: true,
|
||||
)) {
|
||||
_createBootstrap(true);
|
||||
}
|
||||
},
|
||||
));
|
||||
break;
|
||||
case BootstrapState.askWipeCrossSigning:
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
|
|
|
|||
|
|
@ -98,33 +98,44 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
|||
StreamSubscription<html.Event> onFocusSub;
|
||||
StreamSubscription<html.Event> onBlurSub;
|
||||
|
||||
String _cachedPassword;
|
||||
String get cachedPassword {
|
||||
final tmp = _cachedPassword;
|
||||
_cachedPassword = null;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
set cachedPassword(String p) => _cachedPassword = p;
|
||||
|
||||
void _onUiaRequest(UiaRequest uiaRequest) async {
|
||||
if (uiaRequest.state != UiaRequestState.waitForUser ||
|
||||
uiaRequest.nextStages.isEmpty) return;
|
||||
final stage = uiaRequest.nextStages.first;
|
||||
switch (stage) {
|
||||
case AuthenticationTypes.password:
|
||||
final input = await showTextInputDialog(
|
||||
context: context,
|
||||
title: L10n.of(context).pleaseEnterYourPassword,
|
||||
okLabel: L10n.of(context).ok,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
useRootNavigator: false,
|
||||
textFields: [
|
||||
DialogTextField(
|
||||
minLines: 1,
|
||||
maxLines: 1,
|
||||
obscureText: true,
|
||||
hintText: '******',
|
||||
)
|
||||
],
|
||||
);
|
||||
final input = cachedPassword ??
|
||||
(await showTextInputDialog(
|
||||
context: context,
|
||||
title: L10n.of(context).pleaseEnterYourPassword,
|
||||
okLabel: L10n.of(context).ok,
|
||||
cancelLabel: L10n.of(context).cancel,
|
||||
useRootNavigator: false,
|
||||
textFields: [
|
||||
DialogTextField(
|
||||
minLines: 1,
|
||||
maxLines: 1,
|
||||
obscureText: true,
|
||||
hintText: '******',
|
||||
)
|
||||
],
|
||||
))
|
||||
?.single;
|
||||
if (input?.isEmpty ?? true) return;
|
||||
return uiaRequest.completeStage(
|
||||
AuthenticationPassword(
|
||||
session: uiaRequest.session,
|
||||
user: client.userID,
|
||||
password: input.single,
|
||||
password: input,
|
||||
identifier: AuthenticationUserIdentifier(user: client.userID),
|
||||
),
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue