import 'dart:async'; import 'dart:convert'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:quiver/strings.dart'; import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/server_response.dart'; var settingProvider = AsyncNotifierProvider.family( EditSettingData.new); var indexersProvider = AsyncNotifierProvider>(IndexerSetting.new); var dwonloadClientsProvider = AsyncNotifierProvider>( DownloadClientSetting.new); var storageSettingProvider = AsyncNotifierProvider>( StorageSettingData.new); class EditSettingData extends FamilyAsyncNotifier { String? key; @override FutureOr build(String arg) async { final dio = await APIs.getDio(); key = arg; var resp = await dio.get(APIs.settingsUrl, queryParameters: {"key": arg}); var rrr = ServerResponse.fromJson(resp.data); if (rrr.code != 0) { throw rrr.message; } var data = rrr.data as Map; var value = data[arg] as String; return value; } Future updateSettings(String v) async { final dio = await APIs.getDio(); var resp = await dio.post(APIs.settingsUrl, data: { "key": key, "value": v, }); var sp = ServerResponse.fromJson(resp.data as Map); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } } class IndexerSetting extends AsyncNotifier> { @override FutureOr> build() async { final dio = await APIs.getDio(); var resp = await dio.get(APIs.allIndexersUrl); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } List indexers = List.empty(growable: true); if (sp.data == null) { return indexers; } for (final item in sp.data as List) { indexers.add(Indexer.fromJson(item)); } return indexers; } Future addIndexer(Indexer indexer) async { if (isBlank(indexer.name) || isBlank(indexer.url) || isBlank(indexer.apiKey)) { return; } final dio = await APIs.getDio(); var resp = await dio.post(APIs.addIndexerUrl, data: indexer.toJson()); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } Future deleteIndexer(int id) async { final dio = await APIs.getDio(); var resp = await dio.delete("${APIs.delIndexerUrl}$id"); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } } class Indexer { String? name; String? url; String? apiKey; int? id; Indexer({this.name, this.url, this.apiKey}); Indexer.fromJson(Map json) { name = json['name']; url = json['url']; apiKey = json['api_key']; id = json["id"]; } Map toJson() { final Map data = new Map(); data['name'] = this.name; data['url'] = this.url; data['api_key'] = this.apiKey; return data; } } class DownloadClientSetting extends AsyncNotifier> { @override FutureOr> build() async { final dio = await APIs.getDio(); var resp = await dio.get(APIs.allDownloadClientsUrl); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } List indexers = List.empty(growable: true); if (sp.data == null) { return indexers; } for (final item in sp.data as List) { indexers.add(DownloadClient.fromJson(item)); } return indexers; } Future addDownloadClients(String name, String url) async { if (name.isEmpty || url.isEmpty) { return; } final dio = await APIs.getDio(); var resp = await dio.post(APIs.addDownloadClientUrl, data: { "name": name, "url": url, }); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } Future deleteDownloadClients(int id) async { final dio = await APIs.getDio(); var resp = await dio.delete("${APIs.delDownloadClientUrl}$id"); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } } class DownloadClient { int? id; bool? enable; String? name; String? implementation; String? url; bool? removeCompletedDownloads; bool? removeFailedDownloads; DownloadClient( {this.id, this.enable, this.name, this.implementation, this.url, this.removeCompletedDownloads, this.removeFailedDownloads}); DownloadClient.fromJson(Map json) { id = json['id']; enable = json['enable']; name = json['name']; implementation = json['implementation']; url = json['url']; removeCompletedDownloads = json['remove_completed_downloads']; removeFailedDownloads = json['remove_failed_downloads']; } Map toJson() { final Map data = new Map(); data['id'] = this.id; data['enable'] = this.enable; data['name'] = this.name; data['implementation'] = this.implementation; data['url'] = this.url; data['remove_completed_downloads'] = this.removeCompletedDownloads; data['remove_failed_downloads'] = this.removeFailedDownloads; return data; } } class StorageSettingData extends AsyncNotifier> { @override FutureOr> build() async { final dio = await APIs.getDio(); var resp = await dio.get(APIs.storageUrl); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } var data = sp.data as List; List list = List.empty(growable: true); for (final d in data) { list.add(Storage.fromJson(d)); } return list; } Future deleteStorage(int id) async { final dio = await APIs.getDio(); var resp = await dio.delete("${APIs.storageUrl}$id"); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } Future addStorage(Storage s) async { final dio = await APIs.getDio(); var resp = await dio.post(APIs.storageUrl, data: s.toJson()); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } } class Storage { Storage({this.id, this.name, this.implementation, this.settings, this.isDefault}); final int? id; final String? name; final String? implementation; final Map? settings; final bool? isDefault; factory Storage.fromJson(Map json1) { return Storage( id: json1["id"], name: json1["name"], implementation: json1["implementation"], settings: json.decode(json1["settings"]), isDefault: json1["default"] ); } Map toJson() => { "id": id, "name": name, "implementation": implementation, "settings": settings, "default": isDefault, }; }