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(DownloadClient client) async { if (isBlank(client.name) || isBlank(client.url)) { return; } final dio = await APIs.getDio(); var resp = await dio.post(APIs.addDownloadClientUrl, data: client.toJson()); 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; String? user; String? password; DownloadClient( {this.id, this.enable, this.name, this.implementation, this.url, this.user, this.password}); DownloadClient.fromJson(Map json) { id = json['id']; enable = json['enable']; name = json['name']; implementation = json['implementation']; url = json['url']; user = json['user']; password = json['password']; } Map toJson() { final Map data = {}; data['id'] = id; data['enable'] = enable; data['name'] = name; data['implementation'] = implementation; data['url'] = url; data['user'] = user; data['password'] = password; 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, }; }