Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-30 13:53:37 +08:00
parent b5b15dbed6
commit c4c0852dea
105 changed files with 2063 additions and 1360 deletions

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/scaffold/simple_scaffold.dart';
import 'package:PiliPlus/pages/webdav/webdav.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
@@ -38,121 +39,117 @@ class _WebDavSettingPageState extends State<WebDavSettingPage> {
Widget build(BuildContext context) {
final showAppBar = widget.showAppBar;
final padding = MediaQuery.viewPaddingOf(context);
return Scaffold(
final viewInsets = MediaQuery.viewInsetsOf(context).bottom;
return SimpleScaffold(
appBar: showAppBar ? AppBar(title: const Text('WebDAV 设置')) : null,
body: Stack(
clipBehavior: Clip.none,
body: ListView(
padding: padding.copyWith(
top: 20,
left: 20 + (showAppBar ? padding.left : 0),
right: 20 + (showAppBar ? padding.right : 0),
bottom: padding.bottom + viewInsets + 100,
),
children: [
ListView(
padding: padding.copyWith(
top: 20,
left: 20 + (showAppBar ? padding.left : 0),
right: 20 + (showAppBar ? padding.right : 0),
bottom: padding.bottom + 100,
TextField(
controller: _uriCtr,
decoration: const InputDecoration(
labelText: '地址',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
TextField(
controller: _usernameCtr,
decoration: const InputDecoration(
labelText: '用户',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
TextField(
controller: _passwordCtr,
autofillHints: const [AutofillHints.password],
decoration: InputDecoration(
labelText: '密码',
border: const OutlineInputBorder(),
suffixIcon: IconButton(
onPressed: () => setState(() => _obscureText = !_obscureText),
icon: _obscureText
? const Icon(Icons.visibility)
: const Icon(Icons.visibility_off),
),
),
obscureText: _obscureText,
),
const SizedBox(height: 20),
TextField(
controller: _directoryCtr,
decoration: const InputDecoration(
labelText: '路径',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
Row(
children: [
TextField(
controller: _uriCtr,
decoration: const InputDecoration(
labelText: '地址',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
TextField(
controller: _usernameCtr,
decoration: const InputDecoration(
labelText: '用户',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
TextField(
controller: _passwordCtr,
autofillHints: const [AutofillHints.password],
decoration: InputDecoration(
labelText: '密码',
border: const OutlineInputBorder(),
suffixIcon: IconButton(
onPressed: () =>
setState(() => _obscureText = !_obscureText),
icon: _obscureText
? const Icon(Icons.visibility)
: const Icon(Icons.visibility_off),
),
),
obscureText: _obscureText,
),
const SizedBox(height: 20),
TextField(
controller: _directoryCtr,
decoration: const InputDecoration(
labelText: '路径',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 20),
Row(
children: [
Expanded(
child: FilledButton.tonal(
style: FilledButton.styleFrom(
shape: const RoundedRectangleBorder(
borderRadius: Style.mdRadius,
),
),
onPressed: WebDav().backup,
child: const Text('备份设置'),
Expanded(
child: FilledButton.tonal(
style: FilledButton.styleFrom(
shape: const RoundedRectangleBorder(
borderRadius: Style.mdRadius,
),
),
const SizedBox(width: 20),
Expanded(
child: FilledButton.tonal(
style: FilledButton.styleFrom(
shape: const RoundedRectangleBorder(
borderRadius: Style.mdRadius,
),
),
onPressed: WebDav().restore,
child: const Text('恢复设置'),
onPressed: WebDav().backup,
child: const Text('备份设置'),
),
),
const SizedBox(width: 20),
Expanded(
child: FilledButton.tonal(
style: FilledButton.styleFrom(
shape: const RoundedRectangleBorder(
borderRadius: Style.mdRadius,
),
),
],
onPressed: WebDav().restore,
child: const Text('恢复设置'),
),
),
],
),
Positioned(
right:
kFloatingActionButtonMargin + (showAppBar ? padding.right : 0),
bottom: kFloatingActionButtonMargin + padding.bottom,
child: FloatingActionButton(
child: const Icon(Icons.save),
onPressed: () async {
await GStorage.setting.putAll({
SettingBoxKey.webdavUri: _uriCtr.text,
SettingBoxKey.webdavUsername: _usernameCtr.text,
SettingBoxKey.webdavPassword: _passwordCtr.text,
SettingBoxKey.webdavDirectory: _directoryCtr.text,
});
if (_uriCtr.text.isEmpty) {
return;
}
try {
final res = await WebDav().init();
if (res.first) {
SmartDialog.showToast('配置成功');
} else {
SmartDialog.showToast('配置失败: ${res.second}');
}
} catch (e) {
SmartDialog.showToast('配置失败: ${e.toString()}');
return;
}
},
),
),
],
),
fab: Padding(
padding: .only(
right: kFloatingActionButtonMargin + (showAppBar ? padding.right : 0),
bottom: kFloatingActionButtonMargin + padding.bottom + viewInsets,
),
child: FloatingActionButton(
child: const Icon(Icons.save),
onPressed: () async {
await GStorage.setting.putAll({
SettingBoxKey.webdavUri: _uriCtr.text,
SettingBoxKey.webdavUsername: _usernameCtr.text,
SettingBoxKey.webdavPassword: _passwordCtr.text,
SettingBoxKey.webdavDirectory: _directoryCtr.text,
});
if (_uriCtr.text.isEmpty) {
return;
}
try {
final res = await WebDav().init();
if (res.first) {
SmartDialog.showToast('配置成功');
} else {
SmartDialog.showToast('配置失败: ${res.second}');
}
} catch (e) {
SmartDialog.showToast('配置失败: ${e.toString()}');
return;
}
},
),
),
);
}
}