fix: 登录按钮对认不出的输入给出提示,不再静默无反应
- SGWCMAID 前缀改成按粘贴原文判断:令牌取的是内容的后 64 位,粘贴内容一旦超过 64 位,前缀就被截掉了,原先对截取结果做 startsWith 会直接 return, 点按钮看着能点却一声不响 - 补 test/login_page_test.dart 覆盖两条输入路径:不认识的令牌给提示, 连接信息把按钮切成「恢复会话」
This commit is contained in:
1 parent
5d16984e4e
commit
e74bb792bd
3 files changed
+80
-32
No files matched your search
@@ -21,6 +21,7 @@ class AppStrings {
|
||||
static const qrScanError = '解析失败';
|
||||
static const forcePreviewApi = '强制使用 Preview API';
|
||||
static const loginFailed = '登录失败';
|
||||
static const qrTokenUnrecognized = '没认出 QR 令牌(内容里应当含 SGWCMAID),也可以粘贴「连接信息」。';
|
||||
static const requestFailed = '请求失败';
|
||||
static const settingsTooltip = '设置';
|
||||
|
||||
|
||||
+39
-32
@@ -23,6 +23,7 @@ class LoginPage extends StatefulWidget {
|
||||
class _LoginPageState extends State<LoginPage> {
|
||||
final _qrController = TextEditingController();
|
||||
String _qrCode = '';
|
||||
String _rawInput = '';
|
||||
SessionShare? _share;
|
||||
bool _loading = false;
|
||||
bool _forcePreviewApi = false;
|
||||
@@ -36,6 +37,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
void _onQRContentChanged(String value) {
|
||||
final text = value.trim();
|
||||
setState(() {
|
||||
_rawInput = text;
|
||||
_qrCode = SessionModel.extractQRCode(text);
|
||||
_share = SessionShare.tryDecode(text);
|
||||
});
|
||||
@@ -51,6 +53,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
if (result != null && result.isNotEmpty) {
|
||||
_qrController.text = result;
|
||||
setState(() {
|
||||
_rawInput = result.trim();
|
||||
_qrCode = SessionModel.extractQRCode(result);
|
||||
_share = SessionShare.tryDecode(result);
|
||||
});
|
||||
@@ -78,43 +81,47 @@ class _LoginPageState extends State<LoginPage> {
|
||||
Future<void> _onLogin() async {
|
||||
if (_qrCode.isEmpty) return;
|
||||
|
||||
if (_qrCode.startsWith("SGWCMAID")) {
|
||||
setState(() => _loading = true);
|
||||
// 令牌是粘贴内容的后 64 位,前缀可能在截取之后就没了,所以要拿原文判断;
|
||||
// 认不出来时必须给提示,否则点了按钮一声不响,像是坏了。
|
||||
if (!_rawInput.contains('SGWCMAID')) {
|
||||
context.showSnack(AppStrings.qrTokenUnrecognized);
|
||||
return;
|
||||
}
|
||||
setState(() => _loading = true);
|
||||
|
||||
try {
|
||||
final result = await SessionModel.instance.loginWithQr(_qrCode);
|
||||
try {
|
||||
final result = await SessionModel.instance.loginWithQr(_qrCode);
|
||||
|
||||
if (!mounted) return;
|
||||
if (!mounted) return;
|
||||
|
||||
if (result.success) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => HomePage(
|
||||
userId: result.userId,
|
||||
token: result.token,
|
||||
forcePreviewApi: _forcePreviewApi,
|
||||
),
|
||||
if (result.success) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => HomePage(
|
||||
userId: result.userId,
|
||||
token: result.token,
|
||||
forcePreviewApi: _forcePreviewApi,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
'${AppStrings.loginFailed} (errorID: ${result.errorId})',
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
'${AppStrings.loginFailed} (errorID: ${result.errorId})',
|
||||
),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('${AppStrings.requestFailed}: $e')),
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() => _loading = false);
|
||||
}
|
||||
),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('${AppStrings.requestFailed}: $e')),
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() => _loading = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user