ente/lib/onboarding/view/setup_enter_secret_key_page.dart

153 lines
5.1 KiB
Dart
Raw Normal View History

2022-11-01 06:13:06 +00:00
import "package:ente_auth/l10n/l10n.dart";
import 'package:ente_auth/models/code.dart';
2022-11-22 07:19:39 +00:00
// ignore: import_of_legacy_library_into_null_safe
2022-11-01 06:13:06 +00:00
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:ente_auth/utils/totp_util.dart';
import "package:flutter/material.dart";
class SetupEnterSecretKeyPage extends StatefulWidget {
2022-11-22 07:19:39 +00:00
final Code? code;
SetupEnterSecretKeyPage({this.code, Key? key}) : super(key: key);
2022-11-01 06:13:06 +00:00
@override
State<SetupEnterSecretKeyPage> createState() =>
_SetupEnterSecretKeyPageState();
}
class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
late TextEditingController _issuerController;
2022-11-22 07:19:39 +00:00
late TextEditingController _accountController;
late TextEditingController _secretController;
@override
void initState() {
_issuerController = TextEditingController(
text: widget.code != null
? Uri.decodeFull(widget.code!.issuer).trim()
: null,
);
2022-11-22 07:19:39 +00:00
_accountController = TextEditingController(
text: widget.code != null
? Uri.decodeFull(widget.code!.account).trim()
2022-11-22 07:19:39 +00:00
: null,
);
_secretController = TextEditingController(
text: widget.code != null ? widget.code!.secret : null,
);
super.initState();
}
2022-11-01 06:13:06 +00:00
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
return Scaffold(
appBar: AppBar(
title: Text(l10n.importAccountPageTitle),
),
body: SafeArea(
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 40.0, horizontal: 40),
child: Column(
children: [
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeIssuerHint,
2022-11-01 06:13:06 +00:00
),
controller: _issuerController,
2022-11-01 06:13:06 +00:00
autofocus: true,
),
const SizedBox(
height: 20,
),
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeSecretKeyHint,
2022-11-01 06:13:06 +00:00
),
controller: _secretController,
),
const SizedBox(
height: 20,
),
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeAccountHint,
),
controller: _accountController,
),
2022-11-01 06:13:06 +00:00
const SizedBox(
height: 40,
),
SizedBox(
width: 400,
child: OutlinedButton(
onPressed: () {
if (_accountController.text.trim().isEmpty ||
_secretController.text.trim().isEmpty) {
_showIncorrectDetailsDialog(context);
return;
}
try {
final code = Code.fromAccountAndSecret(
_accountController.text.trim(),
_issuerController.text.trim(),
_secretController.text.trim().replaceAll(' ', ''),
2022-11-01 06:13:06 +00:00
);
// Verify the validity of the code
getTotp(code);
2022-11-22 07:19:39 +00:00
if (widget.code != null) {
2022-11-22 08:07:09 +00:00
code.generatedID = widget.code!.generatedID;
2022-11-22 07:19:39 +00:00
}
2022-11-01 06:13:06 +00:00
Navigator.of(context).pop(code);
} catch (e) {
_showIncorrectDetailsDialog(context);
}
},
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 4,
),
child: Text(l10n.saveAction),
2022-11-01 06:13:06 +00:00
),
),
)
],
),
),
),
),
);
}
void _showIncorrectDetailsDialog(BuildContext context) {
showErrorDialog(
context,
"Incorrect details",
"Please verify the entered details",
);
}
}