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.autoDispose (EditSettingData.new); var indexersProvider = AsyncNotifierProvider.autoDispose>( IndexerSetting.new); var dwonloadClientsProvider = AsyncNotifierProvider.autoDispose< DownloadClientSetting, List>(DownloadClientSetting.new); var storageSettingProvider = AsyncNotifierProvider.autoDispose>( StorageSettingData.new); class EditSettingData extends AutoDisposeAsyncNotifier { @override FutureOr build() async { final dio = await APIs.getDio(); var resp = await dio.get(APIs.settingsGeneralUrl); var rrr = ServerResponse.fromJson(resp.data); if (rrr.code != 0) { throw rrr.message; } final ss = GeneralSetting.fromJson(rrr.data); return ss; } Future updateSettings(GeneralSetting gs) async { final dio = await APIs.getDio(); var resp = await dio.post(APIs.settingsGeneralUrl, data: gs.toJson()); var sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } ref.invalidateSelf(); } } class GeneralSetting { String? tmdbApiKey; String? downloadDIr; GeneralSetting({this.tmdbApiKey, this.downloadDIr}); factory GeneralSetting.fromJson(Map json) { return GeneralSetting( tmdbApiKey: json["tmdb_api_key"], downloadDIr: json["download_dir"]); } Map toJson() { final Map data = {}; data['tmdb_api_key'] = tmdbApiKey; data['download_dir'] = downloadDIr; return data; } } class IndexerSetting extends AutoDisposeAsyncNotifier> { @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 = {}; data['name'] = name; data['url'] = url; data['api_key'] = apiKey; return data; } } class DownloadClientSetting extends AutoDisposeAsyncNotifier> { @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 = {}; data['id'] = id; data['enable'] = enable; data['name'] = name; data['implementation'] = implementation; data['url'] = url; data['remove_completed_downloads'] = removeCompletedDownloads; data['remove_failed_downloads'] = removeFailedDownloads; return data; } } class StorageSettingData extends AutoDisposeAsyncNotifier> { @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, }; }