321 lines
11 KiB
Dart
321 lines
11 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||
import 'package:hive/hive.dart';
|
||
import 'package:pilipala/http/member.dart';
|
||
import 'package:pilipala/models/common/dynamics_type.dart';
|
||
import 'package:pilipala/models/common/rcmd_type.dart';
|
||
import 'package:pilipala/models/common/reply_sort_type.dart';
|
||
import 'package:pilipala/pages/setting/widgets/select_dialog.dart';
|
||
import 'package:pilipala/utils/storage.dart';
|
||
|
||
import 'widgets/switch_item.dart';
|
||
|
||
class ExtraSetting extends StatefulWidget {
|
||
const ExtraSetting({super.key});
|
||
|
||
@override
|
||
State<ExtraSetting> createState() => _ExtraSettingState();
|
||
}
|
||
|
||
class _ExtraSettingState extends State<ExtraSetting> {
|
||
Box setting = GStrorage.setting;
|
||
static Box localCache = GStrorage.localCache;
|
||
late dynamic defaultRcmdType;
|
||
late dynamic defaultReplySort;
|
||
late dynamic defaultDynamicType;
|
||
late dynamic enableSystemProxy;
|
||
late String defaultSystemProxyHost;
|
||
late String defaultSystemProxyPort;
|
||
Box userInfoCache = GStrorage.userInfo;
|
||
var userInfo;
|
||
bool userLogin = false;
|
||
var accessKeyInfo;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
// 首页默认推荐类型
|
||
defaultRcmdType =
|
||
setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web');
|
||
// 默认优先显示最新评论
|
||
defaultReplySort =
|
||
setting.get(SettingBoxKey.replySortType, defaultValue: 0);
|
||
// 优先展示全部动态 all
|
||
defaultDynamicType =
|
||
setting.get(SettingBoxKey.defaultDynamicType, defaultValue: 0);
|
||
enableSystemProxy =
|
||
setting.get(SettingBoxKey.enableSystemProxy, defaultValue: false);
|
||
defaultSystemProxyHost =
|
||
localCache.get(LocalCacheKey.systemProxyHost, defaultValue: '');
|
||
defaultSystemProxyPort =
|
||
localCache.get(LocalCacheKey.systemProxyPort, defaultValue: '');
|
||
userInfo = userInfoCache.get('userInfoCache');
|
||
userLogin = userInfo != null;
|
||
accessKeyInfo = localCache.get(LocalCacheKey.accessKey, defaultValue: null);
|
||
}
|
||
|
||
// 设置代理
|
||
void twoFADialog() {
|
||
var systemProxyHost = '';
|
||
var systemProxyPort = '';
|
||
|
||
SmartDialog.show(
|
||
useSystem: true,
|
||
animationType: SmartAnimationType.centerFade_otherSlide,
|
||
builder: (BuildContext context) {
|
||
return AlertDialog(
|
||
title: const Text('设置代理'),
|
||
content: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
const SizedBox(height: 6),
|
||
TextField(
|
||
decoration: InputDecoration(
|
||
isDense: true,
|
||
labelText: defaultSystemProxyHost != ''
|
||
? defaultSystemProxyHost
|
||
: '请输入Host,使用 . 分割',
|
||
border: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(6.0),
|
||
),
|
||
hintText: defaultSystemProxyHost,
|
||
),
|
||
onChanged: (e) {
|
||
systemProxyHost = e;
|
||
},
|
||
),
|
||
const SizedBox(height: 10),
|
||
TextField(
|
||
keyboardType: TextInputType.number,
|
||
decoration: InputDecoration(
|
||
isDense: true,
|
||
labelText: defaultSystemProxyPort != ''
|
||
? defaultSystemProxyPort
|
||
: '请输入Port',
|
||
border: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(6.0),
|
||
),
|
||
hintText: defaultSystemProxyPort,
|
||
),
|
||
onChanged: (e) {
|
||
systemProxyPort = e;
|
||
},
|
||
),
|
||
],
|
||
),
|
||
actions: [
|
||
TextButton(
|
||
onPressed: () async {
|
||
SmartDialog.dismiss();
|
||
},
|
||
child: Text(
|
||
'取消',
|
||
style: TextStyle(color: Theme.of(context).colorScheme.outline),
|
||
),
|
||
),
|
||
TextButton(
|
||
onPressed: () async {
|
||
localCache.put(LocalCacheKey.systemProxyHost, systemProxyHost);
|
||
localCache.put(LocalCacheKey.systemProxyPort, systemProxyPort);
|
||
SmartDialog.dismiss();
|
||
// Request.dio;
|
||
},
|
||
child: const Text('确认'),
|
||
)
|
||
],
|
||
);
|
||
},
|
||
);
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
TextStyle titleStyle = Theme.of(context).textTheme.titleMedium!;
|
||
TextStyle subTitleStyle = Theme.of(context)
|
||
.textTheme
|
||
.labelMedium!
|
||
.copyWith(color: Theme.of(context).colorScheme.outline);
|
||
return Scaffold(
|
||
appBar: AppBar(
|
||
centerTitle: false,
|
||
titleSpacing: 0,
|
||
title: Text(
|
||
'其他设置',
|
||
style: Theme.of(context).textTheme.titleMedium,
|
||
),
|
||
),
|
||
body: ListView(
|
||
children: [
|
||
SetSwitchItem(
|
||
title: '大家都在搜',
|
||
subTitle: '是否展示「大家都在搜」',
|
||
setKey: SettingBoxKey.enableHotKey,
|
||
defaultVal: true,
|
||
callFn: (val) => {SmartDialog.showToast('下次启动时生效')},
|
||
),
|
||
const SetSwitchItem(
|
||
title: '搜索默认词',
|
||
subTitle: '是否展示搜索框默认词',
|
||
setKey: SettingBoxKey.enableSearchWord,
|
||
defaultVal: true,
|
||
),
|
||
const SetSwitchItem(
|
||
title: '推荐动态',
|
||
subTitle: '是否在推荐内容中展示动态',
|
||
setKey: SettingBoxKey.enableRcmdDynamic,
|
||
defaultVal: true,
|
||
),
|
||
const SetSwitchItem(
|
||
title: '快速收藏',
|
||
subTitle: '点按收藏至默认,长按选择文件夹',
|
||
setKey: SettingBoxKey.enableQuickFav,
|
||
defaultVal: false,
|
||
),
|
||
const SetSwitchItem(
|
||
title: '评论区搜索关键词',
|
||
subTitle: '展示评论区搜索关键词',
|
||
setKey: SettingBoxKey.enableWordRe,
|
||
defaultVal: false,
|
||
),
|
||
const SetSwitchItem(
|
||
title: '首页推荐刷新',
|
||
subTitle: '下拉刷新时保留上次内容',
|
||
setKey: SettingBoxKey.enableSaveLastData,
|
||
defaultVal: false,
|
||
),
|
||
ListTile(
|
||
dense: false,
|
||
title: Text('首页推荐类型', style: titleStyle),
|
||
subtitle: Text(
|
||
'当前使用「$defaultRcmdType端」推荐',
|
||
style: subTitleStyle,
|
||
),
|
||
onTap: () async {
|
||
String? result = await showDialog(
|
||
context: context,
|
||
builder: (context) {
|
||
return SelectDialog<String>(
|
||
title: '推荐类型',
|
||
value: defaultRcmdType,
|
||
values: RcmdType.values.map((e) {
|
||
return {'title': e.labels, 'value': e.values};
|
||
}).toList(),
|
||
);
|
||
},
|
||
);
|
||
if (result != null) {
|
||
if (result == 'app') {
|
||
// app端推荐需要access_key
|
||
if (accessKeyInfo == null) {
|
||
if (!userLogin) {
|
||
SmartDialog.showToast('请先登录');
|
||
return;
|
||
}
|
||
await MemberHttp.cookieToKey();
|
||
}
|
||
}
|
||
defaultRcmdType = result;
|
||
setting.put(SettingBoxKey.defaultRcmdType, result);
|
||
SmartDialog.showToast('下次启动时生效');
|
||
setState(() {});
|
||
}
|
||
},
|
||
),
|
||
const SetSwitchItem(
|
||
title: '启用ai总结',
|
||
subTitle: '视频详情页开启ai总结',
|
||
setKey: SettingBoxKey.enableAi,
|
||
defaultVal: true,
|
||
),
|
||
ListTile(
|
||
dense: false,
|
||
title: Text('评论展示', style: titleStyle),
|
||
subtitle: Text(
|
||
'当前优先展示「${ReplySortType.values[defaultReplySort].titles}」',
|
||
style: subTitleStyle,
|
||
),
|
||
onTap: () async {
|
||
int? result = await showDialog(
|
||
context: context,
|
||
builder: (context) {
|
||
return SelectDialog<int>(
|
||
title: '评论展示',
|
||
value: defaultReplySort,
|
||
values: ReplySortType.values.map((e) {
|
||
return {'title': e.titles, 'value': e.index};
|
||
}).toList());
|
||
},
|
||
);
|
||
if (result != null) {
|
||
defaultReplySort = result;
|
||
setting.put(SettingBoxKey.replySortType, result);
|
||
setState(() {});
|
||
}
|
||
},
|
||
),
|
||
ListTile(
|
||
dense: false,
|
||
title: Text('动态展示', style: titleStyle),
|
||
subtitle: Text(
|
||
'当前优先展示「${DynamicsType.values[defaultDynamicType].labels}」',
|
||
style: subTitleStyle,
|
||
),
|
||
onTap: () async {
|
||
int? result = await showDialog(
|
||
context: context,
|
||
builder: (context) {
|
||
return SelectDialog<int>(
|
||
title: '动态展示',
|
||
value: defaultDynamicType,
|
||
values: DynamicsType.values.map((e) {
|
||
return {'title': e.labels, 'value': e.index};
|
||
}).toList());
|
||
},
|
||
);
|
||
if (result != null) {
|
||
defaultDynamicType = result;
|
||
setting.put(SettingBoxKey.defaultDynamicType, result);
|
||
setState(() {});
|
||
}
|
||
},
|
||
),
|
||
ListTile(
|
||
enableFeedback: true,
|
||
onTap: () => twoFADialog(),
|
||
title: Text('设置代理', style: titleStyle),
|
||
subtitle: Text('设置代理 host:port', style: subTitleStyle),
|
||
trailing: Transform.scale(
|
||
alignment: Alignment.centerRight,
|
||
scale: 0.8,
|
||
child: Switch(
|
||
thumbIcon: MaterialStateProperty.resolveWith<Icon?>(
|
||
(Set<MaterialState> states) {
|
||
if (states.isNotEmpty &&
|
||
states.first == MaterialState.selected) {
|
||
return const Icon(Icons.done);
|
||
}
|
||
return null; // All other states will use the default thumbIcon.
|
||
}),
|
||
value: enableSystemProxy,
|
||
onChanged: (val) {
|
||
setting.put(
|
||
SettingBoxKey.enableSystemProxy, !enableSystemProxy);
|
||
setState(() {
|
||
enableSystemProxy = !enableSystemProxy;
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
const SetSwitchItem(
|
||
title: '检查更新',
|
||
subTitle: '每次启动时检查是否需要更新',
|
||
setKey: SettingBoxKey.autoUpdate,
|
||
defaultVal: false,
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|