Return homepage if is already logined when visit login page.

Store cookies information to cookies subdirectory on Windows
This commit is contained in:
2023-08-31 13:15:08 +08:00
parent 6f3a400ed8
commit f0ff06fb3e
4 changed files with 52 additions and 5 deletions

View File

@@ -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<void> getServerStatus() async {
_status = (await api.getStatus()).unwrap();
@@ -21,6 +23,7 @@ class AuthInfo {
} else {
_user = null;
}
_checked = true;
await getServerStatus();
return re.ok;
}

View File

@@ -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<void> prepareJar() async {
Future<String> _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<void> prepareJar() async {
final jar = PersistCookieJar(storage: FileStorage(await _getJarPath()));
dio.interceptors.add(CookieManager(jar));
}

View File

@@ -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<LoginPage> {
bool _passwordVisible = false;
bool _isValid = false;
bool _isLogin = false;
bool _checkAuth = false;
@override
void initState() {
@@ -68,9 +73,32 @@ class _LoginPageState extends State<LoginPage> {
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<LoginPage> {
});
}
}).catchError((e) {
_log.severe("Failed to login:", e);
setState(() {
_isLogin = false;
});

View File

@@ -36,7 +36,9 @@ Future<void> 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;
}