1 import 'package:flutter/material.dart';
2 import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart';
3 import 'package:proxmox_login_manager/proxmox_login_form.dart';
5 class ProxmoxTfaForm extends StatefulWidget {
6 final ProxmoxApiClient? apiClient;
8 const ProxmoxTfaForm({Key? key, this.apiClient}) : super(key: key);
11 _ProxmoxTfaFormState createState() => _ProxmoxTfaFormState();
14 class _ProxmoxTfaFormState extends State<ProxmoxTfaForm> {
15 final TextEditingController _codeController = TextEditingController();
16 bool _isLoading = false;
18 Widget build(BuildContext context) {
20 data: ThemeData.dark().copyWith(
21 colorScheme: ColorScheme.dark().copyWith(
22 secondary: ProxmoxColors.orange,
23 onSecondary: ProxmoxColors.supportGrey)),
25 backgroundColor: ProxmoxColors.supportBlue,
26 extendBodyBehindAppBar: true,
29 backgroundColor: Colors.transparent,
31 icon: Icon(Icons.close),
32 onPressed: () => Navigator.of(context).pop(),
36 alignment: Alignment.center,
38 SingleChildScrollView(
39 child: ConstrainedBox(
40 constraints: BoxConstraints.tightFor(
41 height: MediaQuery.of(context).size.height),
43 padding: const EdgeInsets.all(8.0),
45 mainAxisAlignment: MainAxisAlignment.start,
46 crossAxisAlignment: CrossAxisAlignment.center,
49 padding: const EdgeInsets.fromLTRB(0, 100.0, 0, 30.0),
60 fontWeight: FontWeight.bold),
63 'Check your second factor provider',
65 color: Colors.white38, fontWeight: FontWeight.bold),
68 padding: const EdgeInsets.fromLTRB(0, 50.0, 0, 8.0),
72 controller: _codeController,
73 textAlign: TextAlign.center,
74 decoration: InputDecoration(labelText: 'Code'),
76 onSubmitted: (value) => _submitTfaCode()),
81 alignment: Alignment.bottomCenter,
83 width: MediaQuery.of(context).size.width,
85 onPressed: () => _submitTfaCode(),
86 color: Color(0xFFE47225),
87 child: Text('Continue'),
88 disabledColor: Colors.grey,
99 ProxmoxProgressOverlay(
100 message: 'Verify One-Time password...',
108 Future<void> _submitTfaCode() async {
114 await widget.apiClient!.finishTfaChallenge(_codeController.text);
115 Navigator.of(context).pop(client);
116 } on ProxmoxApiException catch (e) {
119 builder: (context) => ProxmoxApiErrorDialog(
128 builder: (context) => AlertDialog(
129 title: Text('Connection error'),
130 content: Text('Could not establish connection.'),
133 onPressed: () => Navigator.of(context).pop(),
134 child: Text('Close'),