add auth to transmission

This commit is contained in:
Simon Ding
2024-07-18 15:37:55 +08:00
parent af7a7ba469
commit 7a3d93ec8e
2 changed files with 53 additions and 20 deletions

View File

@@ -6,8 +6,9 @@ import 'package:quiver/strings.dart';
import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/APIs.dart';
import 'package:ui/providers/server_response.dart'; import 'package:ui/providers/server_response.dart';
var settingProvider = AsyncNotifierProvider.autoDispose var settingProvider =
<EditSettingData, GeneralSetting>(EditSettingData.new); AsyncNotifierProvider.autoDispose<EditSettingData, GeneralSetting>(
EditSettingData.new);
var indexersProvider = var indexersProvider =
AsyncNotifierProvider.autoDispose<IndexerSetting, List<Indexer>>( AsyncNotifierProvider.autoDispose<IndexerSetting, List<Indexer>>(
@@ -152,15 +153,12 @@ class DownloadClientSetting
return indexers; return indexers;
} }
Future<void> addDownloadClients(String name, String url) async { Future<void> addDownloadClients(DownloadClient client) async {
if (name.isEmpty || url.isEmpty) { if (isBlank(client.name) || isBlank(client.url)) {
return; return;
} }
final dio = await APIs.getDio(); final dio = await APIs.getDio();
var resp = await dio.post(APIs.addDownloadClientUrl, data: { var resp = await dio.post(APIs.addDownloadClientUrl, data: client.toJson());
"name": name,
"url": url,
});
var sp = ServerResponse.fromJson(resp.data); var sp = ServerResponse.fromJson(resp.data);
if (sp.code != 0) { if (sp.code != 0) {
throw sp.message; throw sp.message;
@@ -185,8 +183,8 @@ class DownloadClient {
String? name; String? name;
String? implementation; String? implementation;
String? url; String? url;
bool? removeCompletedDownloads; String? user;
bool? removeFailedDownloads; String? password;
DownloadClient( DownloadClient(
{this.id, {this.id,
@@ -194,8 +192,8 @@ class DownloadClient {
this.name, this.name,
this.implementation, this.implementation,
this.url, this.url,
this.removeCompletedDownloads, this.user,
this.removeFailedDownloads}); this.password});
DownloadClient.fromJson(Map<String, dynamic> json) { DownloadClient.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@@ -203,8 +201,8 @@ class DownloadClient {
name = json['name']; name = json['name'];
implementation = json['implementation']; implementation = json['implementation'];
url = json['url']; url = json['url'];
removeCompletedDownloads = json['remove_completed_downloads']; user = json['user'];
removeFailedDownloads = json['remove_failed_downloads']; password = json['password'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -214,8 +212,8 @@ class DownloadClient {
data['name'] = name; data['name'] = name;
data['implementation'] = implementation; data['implementation'] = implementation;
data['url'] = url; data['url'] = url;
data['remove_completed_downloads'] = removeCompletedDownloads; data['user'] = user;
data['remove_failed_downloads'] = removeFailedDownloads; data['password'] = password;
return data; return data;
} }
} }

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:quiver/strings.dart';
import 'package:ui/providers/login.dart'; import 'package:ui/providers/login.dart';
import 'package:ui/providers/settings.dart'; import 'package:ui/providers/settings.dart';
import 'package:ui/utils.dart'; import 'package:ui/utils.dart';
@@ -303,7 +304,10 @@ class _SystemSettingsPageState extends ConsumerState<SystemSettingsPage> {
Future<void> showDownloadClientDetails(DownloadClient client) { Future<void> showDownloadClientDetails(DownloadClient client) {
var nameController = TextEditingController(text: client.name); var nameController = TextEditingController(text: client.name);
var urlController = TextEditingController(text: client.url); var urlController = TextEditingController(text: client.url);
var userController = TextEditingController(text: client.user);
var passController = TextEditingController(text: client.password);
var _enableAuth = isNotBlank(client.user);
String selectImpl = "transmission"; String selectImpl = "transmission";
var body = <Widget>[ var body = <Widget>[
DropdownMenu( DropdownMenu(
@@ -326,7 +330,34 @@ class _SystemSettingsPageState extends ConsumerState<SystemSettingsPage> {
decoration: Commons.requiredTextFieldStyle(text: "地址"), decoration: Commons.requiredTextFieldStyle(text: "地址"),
controller: urlController, controller: urlController,
), ),
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return Column(
children: [
SwitchListTile(
title: const Text("开启认证"),
value: _enableAuth,
onChanged: (v) {
setState(() {
_enableAuth = v;
});
}),
_enableAuth
? Column(
children: [
TextField(
decoration: Commons.requiredTextFieldStyle(text: "用户"),
controller: userController,
),
TextField(
decoration: Commons.requiredTextFieldStyle(text: "密码"),
controller: passController,
),
],
)
: Container()
],
);
})
]; ];
onDelete() async { onDelete() async {
return ref return ref
@@ -335,9 +366,13 @@ class _SystemSettingsPageState extends ConsumerState<SystemSettingsPage> {
} }
onSubmit() async { onSubmit() async {
return ref return ref.read(dwonloadClientsProvider.notifier).addDownloadClients(
.read(dwonloadClientsProvider.notifier) DownloadClient(
.addDownloadClients(nameController.text, urlController.text); name: nameController.text,
implementation: "transmission",
url: urlController.text,
user: _enableAuth ? userController.text : null,
password: _enableAuth ? passController.text : null));
} }
return showSettingDialog( return showSettingDialog(