diff --git a/lib/home_page.dart b/lib/home_page.dart index fc2ef2a..5e37dc7 100644 --- a/lib/home_page.dart +++ b/lib/home_page.dart @@ -30,7 +30,7 @@ class _MyHomePageState extends State { Future> acquireSheets() async { final url = await _storageHelper.readSecure(SecureStorageKey.url); final jwt = await _storageHelper.readSecure(SecureStorageKey.jwt); - apiClient = ApiClient(baseUrl: url!, token: jwt); + apiClient = ApiClient(baseUrl: "${url!}/api", token: jwt); // TODO: check if really logged in final sheets = await apiClient!.fetchSheets(); log.info("${sheets.length} sheets fetched"); diff --git a/lib/login_page.dart b/lib/login_page.dart index 3b2ee5f..86228b0 100644 --- a/lib/login_page.dart +++ b/lib/login_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:logging/logging.dart'; import 'package:sheetless/api.dart'; import 'package:sheetless/home_page.dart'; import 'package:sheetless/storage_helper.dart'; @@ -12,6 +13,8 @@ class LoginPage extends StatefulWidget { } class _LoginPageState extends State { + final log = Logger("_LoginPageState"); + final TextEditingController _urlController = TextEditingController( text: "https://sheetable.julian-mutter.de", ); @@ -27,30 +30,26 @@ class _LoginPageState extends State { @override void initState() { super.initState(); - _checkJwtValidity(); + _restoreStoredValues(); } - Future _checkJwtValidity() async { + Future _restoreStoredValues() async { final jwt = await _storageHelper.readSecure(SecureStorageKey.jwt); - if (jwt != null) { - final isValid = await _validateJwt(jwt); - if (isValid) { - _navigateToMainPage(); - return; - } else { - final url = await _storageHelper.readSecure(SecureStorageKey.url); - final email = await _storageHelper.readSecure(SecureStorageKey.email); - final password = await _storageHelper.readSecure( - SecureStorageKey.password, - ); - if (url != null && email != null && password != null) { - _login(url, email, password); - } - } + if (jwt != null && await _isJwtValid(jwt)) { + await _navigateToMainPage(); + return; + } + final url = await _storageHelper.readSecure(SecureStorageKey.url); + final email = await _storageHelper.readSecure(SecureStorageKey.email); + if (url != null) { + _urlController.text = url; + } + if (email != null) { + _emailController.text = email; } } - Future _validateJwt(String jwt) async { + Future _isJwtValid(String jwt) async { try { bool expired = JwtDecoder.isExpired(jwt); return !expired; @@ -63,15 +62,13 @@ class _LoginPageState extends State { setState(() { _error = null; }); - serverUrl = "$serverUrl/api"; - final apiClient = ApiClient(baseUrl: serverUrl); + final apiClient = ApiClient(baseUrl: "$serverUrl/api"); final loginResult = await apiClient.login(email, password); if (loginResult.isOk()) { await _storageHelper.writeSecure(SecureStorageKey.url, serverUrl); await _storageHelper.writeSecure(SecureStorageKey.jwt, apiClient.token!); await _storageHelper.writeSecure(SecureStorageKey.email, email); - await _storageHelper.writeSecure(SecureStorageKey.password, password); - _navigateToMainPage(); + await _navigateToMainPage(); } else { setState(() { _error = "Login failed.\n${loginResult.error()}"; @@ -127,7 +124,6 @@ class _LoginPageState extends State { TextFormField( controller: _emailController, validator: validateNotEmpty, - autofocus: true, decoration: InputDecoration(labelText: 'Email'), textInputAction: TextInputAction.next, ), diff --git a/lib/storage_helper.dart b/lib/storage_helper.dart index ffc1e49..1fbb50a 100644 --- a/lib/storage_helper.dart +++ b/lib/storage_helper.dart @@ -1,7 +1,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hive/hive.dart'; -enum SecureStorageKey { url, jwt, email, password } +enum SecureStorageKey { url, jwt, email } enum ConfigKey { twoPageMode }