diff --git a/lib/auth.dart b/lib/auth.dart index 26f6eb9..787b494 100644 --- a/lib/auth.dart +++ b/lib/auth.dart @@ -9,6 +9,8 @@ class AuthInfo { ServerStatus? _status; ServerStatus? get status => _status; bool get isAuthed => (_user != null); + bool _checked = false; + bool get checked => _checked; Future getServerStatus() async { _status = (await api.getStatus()).unwrap(); @@ -21,6 +23,7 @@ class AuthInfo { } else { _user = null; } + _checked = true; await getServerStatus(); return re.ok; } diff --git a/lib/globals.dart b/lib/globals.dart index 831545d..61f8e99 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -5,6 +5,7 @@ import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:go_router/go_router.dart'; +import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'api/client.dart'; @@ -23,12 +24,24 @@ final dio = Dio() Config? _prefs; EHApi? _api; -Future prepareJar() async { +Future _getJarPath() async { + if (isWindows) { + try { + final p = await platformPath.getCurrentExe(); + if (p != null) { + return path.join(path.dirname(p), "cookies"); + } + } catch (e) { + // Do nothing + } + } final Directory appDocDir = await getApplicationDocumentsDirectory(); final String appDocPath = appDocDir.path; - final jar = PersistCookieJar( - storage: FileStorage('$appDocPath/.eh-cookies/'), - ); + return '$appDocPath/.eh-cookies/'; +} + +Future prepareJar() async { + final jar = PersistCookieJar(storage: FileStorage(await _getJarPath())); dio.interceptors.add(CookieManager(jar)); } diff --git a/lib/login.dart b/lib/login.dart index 9c2f48a..21fb997 100644 --- a/lib/login.dart +++ b/lib/login.dart @@ -1,8 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; +import 'package:logging/logging.dart'; import 'globals.dart'; +final _log = Logger("LoginPage"); + class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @@ -19,6 +23,7 @@ class _LoginPageState extends State { bool _passwordVisible = false; bool _isValid = false; bool _isLogin = false; + bool _checkAuth = false; @override void initState() { @@ -68,9 +73,32 @@ class _LoginPageState extends State { return re.ok; } + void _checkStatus(BuildContext build) { + if (auth.isAuthed) { + SchedulerBinding.instance.addPostFrameCallback((_) { + build.go("/"); + }); + return; + } + if (!auth.checked) { + if (_checkAuth) return; + _checkAuth = true; + auth.checkAuth().then((re) { + _checkAuth = false; + if (re) { + build.go("/"); + } + }).catchError((e) { + _log.severe("Failed to check auth info:", e); + _checkAuth = false; + }); + } + } + @override Widget build(BuildContext context) { tryInitApi(context); + _checkStatus(context); return Scaffold( body: Container( padding: const EdgeInsets.symmetric(horizontal: 100), @@ -124,6 +152,7 @@ class _LoginPageState extends State { }); } }).catchError((e) { + _log.severe("Failed to login:", e); setState(() { _isLogin = false; }); diff --git a/lib/main.dart b/lib/main.dart index ae5135b..3654d8c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,7 +36,9 @@ Future initLogger() async { Logger.root.level = Level(logLevelName, logLevel); } Logger.root.onRecord.listen((record) { - print('${record.level.name}: ${record.time}: ${record.message}'); + final stack = record.stackTrace != null ? '\n${record.stackTrace}' : ''; + print( + '${record.level.name}: ${record.time}: ${record.message}${record.error}$stack'); }); return; }