1 import 'package:flutter/material.dart';
2 import 'package:proxmox_login_manager/proxmox_general_settings_form.dart';
3 import 'package:proxmox_login_manager/proxmox_login_form.dart';
4 import 'package:proxmox_login_manager/proxmox_login_model.dart';
5 import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart'
7 import 'package:proxmox_login_manager/extension.dart';
9 typedef OnLoginCallback = Function(proxclient.ProxmoxApiClient client);
11 class ProxmoxLoginSelector extends StatefulWidget {
12 final OnLoginCallback onLogin;
14 const ProxmoxLoginSelector({Key key, this.onLogin}) : super(key: key);
17 _ProxmoxLoginSelectorState createState() => _ProxmoxLoginSelectorState();
20 class _ProxmoxLoginSelectorState extends State<ProxmoxLoginSelector> {
21 Future<ProxmoxLoginStorage> loginStorage;
25 loginStorage = ProxmoxLoginStorage.fromLocalStorage();
29 Widget build(BuildContext context) {
34 crossAxisAlignment: CrossAxisAlignment.start,
43 'Virtual Environment',
52 icon: Icon(Icons.settings),
54 Navigator.of(context).push(MaterialPageRoute(
55 builder: (context) => ProxmoxGeneralSettingsForm(),
60 body: FutureBuilder<ProxmoxLoginStorage>(
62 builder: (context, snapshot) {
63 if (!snapshot.hasData) {
65 child: CircularProgressIndicator(),
68 if (snapshot.hasData && (snapshot.data.logins?.isEmpty ?? true)) {
70 child: Text('Add an account'),
73 var items = <Widget>[];
74 final logins = snapshot.data?.logins;
76 final activeSessions =
77 logins.rebuild((b) => b.where((b) => b.activeSession));
79 if (activeSessions.isNotEmpty) {
82 padding: const EdgeInsets.all(12.0),
87 fontWeight: FontWeight.bold,
91 ...activeSessions.map((s) => ListTile(
92 title: Text(s.fullHostname),
93 subtitle: Text(s.fullUsername),
94 trailing: Icon(Icons.navigate_next),
95 leading: PopupMenuButton(
96 icon: Icon(Icons.more_vert, color: Colors.green),
97 itemBuilder: (context) => [
101 leading: Icon(Icons.logout),
102 title: Text('Logout'),
105 .rebuild((b) => b.logins
106 .rebuildWhere((m) => s == m,
107 (b) => b..ticket = ''))
109 refreshFromStorage();
110 Navigator.of(context).pop();
115 onTap: () => _login(user: s),
121 padding: const EdgeInsets.all(12.0),
126 fontWeight: FontWeight.bold,
130 ...logins.where((b) => !b.activeSession)?.map((l) => ListTile(
131 title: Text(l.fullHostname),
132 subtitle: Text(l.fullUsername),
133 trailing: Icon(Icons.navigate_next),
134 leading: PopupMenuButton(
135 itemBuilder: (context) => [
139 leading: Icon(Icons.delete),
140 title: Text('Delete'),
143 .rebuild((b) => b.logins.remove(l))
145 refreshFromStorage();
146 Navigator.of(context).pop();
151 onTap: () => _login(user: l),
158 floatingActionButton: FloatingActionButton.extended(
159 onPressed: () => _login(isCreate: true),
161 icon: Icon(Icons.account_circle),
167 Future<void> _login({ProxmoxLoginModel user, bool isCreate = false}) async {
168 final client = await Navigator.of(context).push(MaterialPageRoute(
169 builder: (context) => ProxmoxLoginPage(
172 ticket: user?.ticket,
174 refreshFromStorage();
175 if (client != null) {
176 widget.onLogin(client);
180 void refreshFromStorage() {
182 loginStorage = ProxmoxLoginStorage.fromLocalStorage();