added logout feature

This commit is contained in:
Adrian Baumgart 2023-07-09 23:15:15 +02:00
parent 622496174c
commit 0357a4db6b
No known key found for this signature in database
6 changed files with 58 additions and 20 deletions

View File

@ -27,6 +27,12 @@ class ServerManager {
return (_server_url != null); return (_server_url != null);
} }
Future<void> logOut() async {
const storage = FlutterSecureStorage();
await storage.delete(key: "shlink_url");
await storage.delete(key: "shlink_apikey");
}
Future<void> _loadCredentials() async { Future<void> _loadCredentials() async {
const storage = FlutterSecureStorage(); const storage = FlutterSecureStorage();
_server_url = await storage.read(key: "shlink_url"); _server_url = await storage.read(key: "shlink_url");

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shlink_app/API/Classes/ShlinkStats/ShlinkStats.dart'; import 'package:shlink_app/API/Classes/ShlinkStats/ShlinkStats.dart';
import 'package:shlink_app/API/ServerManager.dart'; import 'package:shlink_app/API/ServerManager.dart';
import 'package:shlink_app/LoginView.dart';
import 'package:shlink_app/ShortURLEditView.dart'; import 'package:shlink_app/ShortURLEditView.dart';
import 'globals.dart' as globals; import 'globals.dart' as globals;
@ -57,6 +58,25 @@ class _HomeViewState extends State<HomeView> {
Text(globals.serverManager.getServerUrl(), style: TextStyle(fontSize: 16, color: Colors.grey[600])) Text(globals.serverManager.getServerUrl(), style: TextStyle(fontSize: 16, color: Colors.grey[600]))
], ],
), ),
actions: [
PopupMenuButton(
itemBuilder: (context) {
return [
PopupMenuItem(
value: 0,
child: Text("Log out...", style: TextStyle(color: Colors.red)),
)
];
},
onSelected: (value) {
if (value == 0) {
globals.serverManager.logOut().then((value) => Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => const LoginView())
));
}
},
)
],
), ),
SliverToBoxAdapter( SliverToBoxAdapter(
child: Wrap( child: Wrap(

View File

@ -62,7 +62,7 @@ class _LoginViewState extends State<LoginView> {
body: CustomScrollView( body: CustomScrollView(
slivers: [ slivers: [
SliverAppBar.medium( SliverAppBar.medium(
title: const Text("Add server") title: const Text("Add server", style: TextStyle(fontWeight: FontWeight.bold))
), ),
SliverFillRemaining( SliverFillRemaining(
child: Padding( child: Padding(
@ -73,26 +73,38 @@ class _LoginViewState extends State<LoginView> {
children: [ children: [
const Padding(padding: EdgeInsets.only(bottom: 8), const Padding(padding: EdgeInsets.only(bottom: 8),
child: Text("Server URL", style: TextStyle(fontWeight: FontWeight.bold),)), child: Text("Server URL", style: TextStyle(fontWeight: FontWeight.bold),)),
TextField( Row(
controller: _server_url_controller, children: [
keyboardType: TextInputType.url, Icon(Icons.dns_outlined),
decoration: const InputDecoration( SizedBox(width: 8),
border: OutlineInputBorder(), Expanded(child: TextField(
labelText: "https://shlink.example.com" controller: _server_url_controller,
), keyboardType: TextInputType.url,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "https://shlink.example.com"
),
))
],
), ),
const Padding( const Padding(
padding: EdgeInsets.only(top: 8, bottom: 8), padding: EdgeInsets.only(top: 8, bottom: 8),
child: Text("API Key", style: TextStyle(fontWeight: FontWeight.bold)), child: Text("API Key", style: TextStyle(fontWeight: FontWeight.bold)),
), ),
TextField( Row(
controller: _apikey_controller, children: [
keyboardType: TextInputType.text, Icon(Icons.key),
obscureText: true, SizedBox(width: 8),
decoration: const InputDecoration( Expanded(child: TextField(
border: OutlineInputBorder(), controller: _apikey_controller,
labelText: "..." keyboardType: TextInputType.text,
), obscureText: true,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "..."
),
))
],
), ),
Padding( Padding(
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),

View File

@ -169,7 +169,7 @@ class _ShortURLEditViewState extends State<ShortURLEditView> with SingleTickerPr
}); });
}, },
icon: Icon(randomSlug ? Icons.casino : Icons.casino_outlined, color: randomSlug ? Colors.green : Theme.of(context).primaryColor,) icon: Icon(randomSlug ? Icons.casino : Icons.casino_outlined, color: randomSlug ? Colors.green : Colors.grey)
), ),
) )
], ],

View File

@ -160,7 +160,7 @@ class _ListCellState extends State<_ListCell> {
padding: EdgeInsets.only(right: 4), padding: EdgeInsets.only(right: 4),
child: SizedBox( child: SizedBox(
width: 20, width: 20,
height: 8, height: 6,
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
@ -182,7 +182,7 @@ class _ListCellState extends State<_ListCell> {
else if (widget.content is DateTime) else if (widget.content is DateTime)
Text(DateFormat('yyyy-MM-dd - HH:mm').format(widget.content)) Text(DateFormat('yyyy-MM-dd - HH:mm').format(widget.content))
else else
Text("N/A") const Text("N/A")
], ],
), ),
), ),

View File

@ -37,7 +37,7 @@ class MyApp extends StatelessWidget {
foregroundColor: Colors.white, foregroundColor: Colors.white,
elevation: 0, elevation: 0,
), ),
colorScheme: darkColorScheme?.copyWith(background: Colors.black, primary: Colors.blue) ?? _defaultDarkColorScheme, colorScheme: darkColorScheme?.copyWith(background: Colors.black) ?? _defaultDarkColorScheme,
useMaterial3: true, useMaterial3: true,
), ),
/*theme: ThemeData( /*theme: ThemeData(