feat: support prowlarr connection

This commit is contained in:
Simon Ding
2024-10-20 16:21:58 +08:00
parent 0e6465593b
commit b317636a8a
15 changed files with 281 additions and 12 deletions

View File

@@ -40,6 +40,7 @@ class APIs {
static final addImportlistUrl = "$_baseUrl/api/v1/importlist/add";
static final deleteImportlistUrl = "$_baseUrl/api/v1/importlist/delete";
static final getAllImportlists = "$_baseUrl/api/v1/importlist/";
static final prowlarrUrl = "$_baseUrl/api/v1/setting/prowlarr";
static final notifierAllUrl = "$_baseUrl/api/v1/notifier/all";
static final notifierDeleteUrl = "$_baseUrl/api/v1/notifier/id/";

View File

@@ -25,6 +25,10 @@ var importlistProvider =
AsyncNotifierProvider.autoDispose<ImportListData, List<ImportList>>(
ImportListData.new);
var prowlarrSettingDataProvider =
AsyncNotifierProvider.autoDispose<ProwlarrSettingData, ProwlarrSetting>(
ProwlarrSettingData.new);
class EditSettingData extends AutoDisposeAsyncNotifier<GeneralSetting> {
@override
FutureOr<GeneralSetting> build() async {
@@ -503,3 +507,38 @@ class ImportListData extends AutoDisposeAsyncNotifier<List<ImportList>> {
ref.invalidateSelf();
}
}
class ProwlarrSetting {
final String apiKey;
final String url;
ProwlarrSetting({required this.apiKey, required this.url});
factory ProwlarrSetting.fromJson(Map<String, dynamic> json) {
return ProwlarrSetting(apiKey: json["api_key"], url: json["url"]);
}
Map<String, dynamic> tojson() => {"api_key": apiKey, "url": url};
}
class ProwlarrSettingData extends AutoDisposeAsyncNotifier<ProwlarrSetting> {
@override
FutureOr<ProwlarrSetting> build() async {
final dio = APIs.getDio();
var resp = await dio.get(APIs.prowlarrUrl);
var sp = ServerResponse.fromJson(resp.data);
if (sp.code != 0) {
throw sp.message;
}
var se = ProwlarrSetting.fromJson(sp.data);
return se;
}
Future<void> save(ProwlarrSetting ps) async {
final dio = APIs.getDio();
var resp = await dio.post(APIs.prowlarrUrl, data: ps.tojson());
var sp = ServerResponse.fromJson(resp.data);
if (sp.code != 0) {
throw sp.message;
}
ref.invalidateSelf();
}
}

View File

@@ -0,0 +1,72 @@
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:ui/providers/settings.dart';
import 'package:ui/widgets/progress_indicator.dart';
import 'package:ui/widgets/utils.dart';
import 'package:ui/widgets/widgets.dart';
class ProwlarrSettingPage extends ConsumerStatefulWidget {
const ProwlarrSettingPage({super.key});
@override
ConsumerState<ConsumerStatefulWidget> createState() {
return ProwlarrSettingState();
}
}
class ProwlarrSettingState extends ConsumerState<ProwlarrSettingPage> {
final _formKey = GlobalKey<FormBuilderState>();
@override
Widget build(BuildContext context) {
var ps = ref.watch(prowlarrSettingDataProvider);
return ps.when(
data: (v) => FormBuilder(
key: _formKey, //设置globalKey用于后面获取FormState
autovalidateMode: AutovalidateMode.onUserInteraction,
initialValue: {"api_key": v.apiKey, "url": v.url},
child: Column(
children: [
FormBuilderTextField(
name: "url",
decoration: const InputDecoration(
labelText: "Prowlarr URL",
icon: Icon(Icons.web),
hintText: "http://10.0.0.8:9696"),
validator: FormBuilderValidators.required(),
),
FormBuilderTextField(
name: "api_key",
decoration: const InputDecoration(
labelText: "API Key",
icon: Icon(Icons.web),
helperText: "Prowlarr 设置 -> 通用设置 -> 接口密钥"),
validator: FormBuilderValidators.required(),
),
Center(
child: Padding(
padding: const EdgeInsets.all(10),
child: ElevatedButton(
onPressed: () {
if (_formKey.currentState!.saveAndValidate()) {
var values = _formKey.currentState!.value;
var f = ref
.read(prowlarrSettingDataProvider.notifier)
.save(ProwlarrSetting(
apiKey: values["api_key"],
url: values["url"]))
.then((v) => showSnakeBar("更新成功"));
showLoadingWithFuture(f);
}
},
child: const Padding(padding: EdgeInsets.all(10), child: Text("保存"),)),
),
)
],
),
),
error: (err, trace) => Text("$err"),
loading: () => const MyProgressIndicator());
}
}

View File

@@ -6,6 +6,7 @@ import 'package:ui/settings/general.dart';
import 'package:ui/settings/importlist.dart';
import 'package:ui/settings/indexer.dart';
import 'package:ui/settings/notifier.dart';
import 'package:ui/settings/prowlarr.dart';
import 'package:ui/settings/storage.dart';
class SystemSettingsPage extends ConsumerStatefulWidget {
@@ -25,6 +26,7 @@ class _SystemSettingsPageState extends ConsumerState<SystemSettingsPage> {
children: [
getExpansionTile("常规", const GeneralSettings()),
getExpansionTile("索引器", const IndexerSettings()),
getExpansionTile("Prowlarr 设置", const ProwlarrSettingPage()),
getExpansionTile("下载器", const DownloaderSettings()),
getExpansionTile("存储", const StorageSettings()),
getExpansionTile("通知客户端", const NotifierSettings()),