]> git.proxmox.com Git - flutter/proxmox_login_manager.git/blob - lib/proxmox_login_selector.dart
change proxmox logo styles
[flutter/proxmox_login_manager.git] / lib / proxmox_login_selector.dart
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'
6 as proxclient;
7
8 typedef OnLoginCallback = Function(proxclient.ProxmoxApiClient client);
9
10 class ProxmoxLoginSelector extends StatefulWidget {
11 final OnLoginCallback onLogin;
12
13 const ProxmoxLoginSelector({Key key, this.onLogin}) : super(key: key);
14
15 @override
16 _ProxmoxLoginSelectorState createState() => _ProxmoxLoginSelectorState();
17 }
18
19 class _ProxmoxLoginSelectorState extends State<ProxmoxLoginSelector> {
20 Future<ProxmoxLoginStorage> loginStorage;
21 @override
22 void initState() {
23 super.initState();
24 loginStorage = ProxmoxLoginStorage.fromLocalStorage();
25 }
26
27 @override
28 Widget build(BuildContext context) {
29 return SafeArea(
30 child: Scaffold(
31 appBar: AppBar(
32 title: Column(
33 crossAxisAlignment: CrossAxisAlignment.start,
34 children: [
35 Text(
36 'Proxmox',
37 style: TextStyle(
38 fontSize: 14,
39 ),
40 ),
41 Text(
42 'Virtual Environment',
43 style: TextStyle(
44 fontSize: 14,
45 ),
46 )
47 ],
48 ),
49 actions: [
50 IconButton(
51 icon: Icon(Icons.settings),
52 onPressed: () {
53 Navigator.of(context).push(MaterialPageRoute(
54 builder: (context) => ProxmoxGeneralSettingsForm(),
55 ));
56 })
57 ],
58 ),
59 body: FutureBuilder<ProxmoxLoginStorage>(
60 future: loginStorage,
61 builder: (context, snapshot) {
62 if (snapshot.hasData && (snapshot.data.logins?.isEmpty ?? true)) {
63 return Center(
64 child: Text('Add an account'),
65 );
66 }
67
68 return ListView(
69 children: snapshot.data?.logins
70 ?.map((l) => ListTile(
71 title: Text(l.origin.host),
72 subtitle: Text(l.fullUsername),
73 trailing: Icon(Icons.navigate_next),
74 leading: PopupMenuButton(
75 itemBuilder: (context) => [
76 PopupMenuItem(
77 child: ListTile(
78 dense: true,
79 leading: Icon(Icons.delete),
80 title: Text('Delete'),
81 onTap: () {
82 snapshot.data
83 .rebuild(
84 (b) => b.logins.remove(l))
85 .saveToDisk();
86 refreshFromStorage();
87 Navigator.of(context).pop();
88 },
89 ),
90 )
91 ]),
92 onTap: () => _login(user: l),
93 ))
94 ?.toList() ??
95 [],
96 );
97 }),
98 floatingActionButton: FloatingActionButton.extended(
99 onPressed: () => _login(isCreate: true),
100 label: Text('Add'),
101 icon: Icon(Icons.account_circle),
102 ),
103 ),
104 );
105 }
106
107 Future<void> _login({ProxmoxLoginModel user, bool isCreate = false}) async {
108 final client = await Navigator.of(context).push(MaterialPageRoute(
109 builder: (context) => ProxmoxLoginPage(
110 userModel: user,
111 isCreate: isCreate,
112 )));
113 refreshFromStorage();
114 if (client != null) {
115 widget.onLogin(client);
116 }
117 }
118
119 void refreshFromStorage() {
120 setState(() {
121 loginStorage = ProxmoxLoginStorage.fromLocalStorage();
122 });
123 }
124 }