Skip to content

Commit

Permalink
feat(settings): Support test proxy connection in proxy settings dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
realth000 committed Aug 29, 2024
1 parent 2e3e754 commit 5a7d785
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- 当网页链接形式为`tid=THREAD_ID&page=PAGE#pidPOST_ID`时,忽视“倒序浏览楼层”的设置以保证加载指定的页数。
- 消息:现在来源于帖子中的消息会直接跳转到帖子的相应楼层,而不经过消息详情页。
- app:支持设置和使用代理。
- 默认关闭,可在设置 -> 高级 -> 启用代理中打开。
- 在设置 -> 高级 -> 代理设置中设置代理的参数,可测试代理是否连通。

### Fixed

Expand Down
71 changes: 71 additions & 0 deletions lib/features/settings/widgets/proxy_settings_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
Expand Down Expand Up @@ -25,12 +26,65 @@ class ProxySettingsDialog extends StatefulWidget {
State<ProxySettingsDialog> createState() => _ProxySettingsDialogState();
}

/// Status of testing proxy target connection.
enum _TestConnStatus {
/// Waiting for a new test.
waiting,

/// Testing.
testing,

/// Connected to proxy target.
connected,

/// Disconnected to proxy target.
disconnected,
}

class _ProxySettingsDialogState extends State<ProxySettingsDialog> {
late TextEditingController hostController;
late TextEditingController portController;

final formKey = GlobalKey<FormState>();

_TestConnStatus connStatus = _TestConnStatus.waiting;

Future<void> testConnection() async {
// Do not run test if proxy settings is illegal.
if (!formKey.currentState!.validate()) {
return;
}

setState(() {
connStatus = _TestConnStatus.testing;
});
try {
final _ = await Dio().getUri<dynamic>(
Uri.http('${hostController.text.trim()}'
':${portController.text.trim()}'),
options: Options(sendTimeout: const Duration(seconds: 3)),
);
setState(() {
connStatus = _TestConnStatus.connected;
});
} on DioException catch (e, _) {
setState(() {
connStatus = _TestConnStatus.connected;
});
setState(() {
if (e.response == null) {
// No response, maybe proxy is not running.
connStatus = _TestConnStatus.disconnected;
} else {
// Proxy returns reply, no matter what status code is, proxy
// is running.
connStatus = _TestConnStatus.connected;
}
});
return;
}
}

@override
void initState() {
super.initState();
Expand All @@ -54,6 +108,7 @@ class _ProxySettingsDialogState extends State<ProxySettingsDialog> {
content: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextFormField(
controller: hostController,
Expand Down Expand Up @@ -87,6 +142,22 @@ class _ProxySettingsDialogState extends State<ProxySettingsDialog> {
return null;
},
),
sizedBoxW16H16,
TextButton.icon(
label: Text(
switch (connStatus) {
_TestConnStatus.waiting => tr.testConnection.waiting,
_TestConnStatus.testing => tr.testConnection.testing,
_TestConnStatus.connected => tr.testConnection.connected,
_TestConnStatus.disconnected =>
tr.testConnection.disconnected,
},
),
icon: const Icon(Icons.refresh_outlined),
onPressed: connStatus == _TestConnStatus.testing
? null
: () async => testConnection(),
),
],
),
),
Expand Down
8 changes: 7 additions & 1 deletion lib/i18n/strings.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,13 @@
"port": "Port",
"disabled": "Proxy is disabled",
"invalidHostOrIp": "Invalid host or IP",
"invalidPort": "Invalid port"
"invalidPort": "Invalid port",
"testConnection": {
"waiting": "Test connection",
"testing": "Testing...",
"connected": "Proxy is running",
"disconnected": "Proxy may not running"
}
}
},
"othersSection": {
Expand Down
8 changes: 7 additions & 1 deletion lib/i18n/strings_zh-CN.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,13 @@
"port": "端口",
"disabled": "已禁用代理",
"invalidHostOrIp": "无效的host或IP",
"invalidPort": "无效的端口"
"invalidPort": "无效的端口",
"testConnection": {
"waiting": "测试连接",
"testing": "测试中。。。",
"connected": "代理正在运行",
"disconnected": "代理可能未运行"
}
}
},
"othersSection": {
Expand Down
8 changes: 7 additions & 1 deletion lib/i18n/strings_zh-TW.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,13 @@
"port": "連接埠",
"disabled": "已停用代理",
"invalidHostOrIp": "無效的host或IP",
"invalidPort": "無效的連接埠"
"invalidPort": "無效的連接埠",
"testConnection": {
"waiting": "測試連線",
"testing": "測試中。。。",
"connected": "代理正在運行",
"disconnected": "代理程式可能未執行"
}
}
},
"othersSection": {
Expand Down

0 comments on commit 5a7d785

Please sign in to comment.