From af83820b85082bf07d96da437609973591f6d756 Mon Sep 17 00:00:00 2001 From: Jagandeep Brar Date: Thu, 22 Sep 2022 09:28:17 -0400 Subject: [PATCH] chore(api): create stub APIs for remaining modules (#707) --- analysis_options.yaml | 2 + lib/api/lidarr/api.dart | 27 ++++++++ lib/api/nzbget/api.dart | 69 +++++++++++++++++++ lib/api/nzbget/models/status.dart | 37 ++++++++++ lib/api/nzbget/models/version.dart | 25 +++++++ .../overseerr/{overseerr.dart => api.dart} | 17 +++-- lib/api/sabnzbd/{sabnzbd.dart => api.dart} | 13 ++-- lib/api/sabnzbd/models/history.dart | 16 ++--- lib/api/sabnzbd/models/queue.dart | 16 ++--- lib/api/sabnzbd/models/status.dart | 8 +-- lib/core.dart | 2 +- lib/database/box.dart | 6 +- lib/database/table.dart | 9 ++- lib/extensions/string/string.dart | 5 ++ lib/main.dart | 2 +- lib/modules.dart | 2 +- lib/modules/dashboard/core/state.dart | 2 +- .../dashboard/routes/dashboard/route.dart | 2 +- .../dashboard/widgets/calendar_view.dart | 2 +- lib/modules/lidarr/core/dialogs.dart | 2 +- lib/modules/lidarr/routes/add_details.dart | 9 +-- lib/modules/overseerr.dart | 2 +- lib/modules/radarr/core/dialogs.dart | 10 +-- .../widgets/bottom_action_bar.dart | 2 +- lib/modules/search/core/dialogs.dart | 2 +- lib/modules/settings/core/banners.dart | 2 +- lib/modules/settings/core/pages/headers.dart | 2 +- .../settings/routes/configuration/route.dart | 2 +- .../configuration_appearance/route.dart | 6 +- .../pages/calendar_settings.dart | 18 ++--- .../pages/default_pages.dart | 2 +- .../routes/configuration_drawer/route.dart | 4 +- .../pages/edit_module.dart | 2 +- .../configuration_external_modules/route.dart | 2 +- .../pages/connection_details.dart | 2 +- .../pages/default_pages.dart | 2 +- .../routes/configuration_lidarr/route.dart | 2 +- .../configuration_localization/route.dart | 2 +- .../routes/configuration_network/route.dart | 2 +- .../pages/connection_details.dart | 2 +- .../pages/default_pages.dart | 2 +- .../routes/configuration_nzbget/route.dart | 2 +- .../pages/connection_details.dart | 2 +- .../routes/configuration_overseerr/route.dart | 2 +- .../configuration_quick_actions/route.dart | 2 +- .../pages/connection_details.dart | 2 +- .../pages/default_options.dart | 14 ++-- .../pages/default_pages.dart | 8 +-- .../routes/configuration_radarr/route.dart | 6 +- .../pages/connection_details.dart | 2 +- .../pages/default_pages.dart | 2 +- .../routes/configuration_sabnzbd/route.dart | 2 +- .../pages/edit_indexer.dart | 2 +- .../pages/edit_indexer_headers.dart | 2 +- .../routes/configuration_search/route.dart | 6 +- .../pages/connection_details.dart | 2 +- .../pages/default_options.dart | 14 ++-- .../pages/default_pages.dart | 6 +- .../routes/configuration_sonarr/route.dart | 4 +- .../pages/connection_details.dart | 2 +- .../pages/default_pages.dart | 10 +-- .../routes/configuration_tautulli/route.dart | 8 +-- .../configuration_wake_on_lan/route.dart | 2 +- .../settings/routes/notifications/route.dart | 2 +- .../settings/routes/profiles/route.dart | 2 +- .../routes/system_logs/pages/log_details.dart | 2 +- .../settings/routes/system_logs/route.dart | 2 +- lib/modules/sonarr/core/dialogs.dart | 12 ++-- lib/state/sabnzbd/api.dart | 27 ++++++++ lib/state/sabnzbd/config.dart | 32 +++++++++ lib/{system => state}/state.dart | 0 lib/system/localization.dart | 2 +- lib/utils/profile_tools.dart | 2 +- lib/vendor.dart | 1 + lib/widgets/sheets/changelog/sheet.dart | 2 +- lib/widgets/ui/bottom_modal_sheet.dart | 2 +- lib/widgets/ui/button.dart | 2 +- lib/widgets/ui/drawer/drawer.dart | 6 +- lib/widgets/ui/drawer/drawer_header.dart | 2 +- lib/widgets/ui/scaffold.dart | 2 +- 80 files changed, 396 insertions(+), 149 deletions(-) create mode 100644 lib/api/lidarr/api.dart create mode 100644 lib/api/nzbget/api.dart create mode 100644 lib/api/nzbget/models/status.dart create mode 100644 lib/api/nzbget/models/version.dart rename lib/api/overseerr/{overseerr.dart => api.dart} (70%) rename lib/api/sabnzbd/{sabnzbd.dart => api.dart} (96%) create mode 100644 lib/state/sabnzbd/api.dart create mode 100644 lib/state/sabnzbd/config.dart rename lib/{system => state}/state.dart (100%) diff --git a/analysis_options.yaml b/analysis_options.yaml index f3e27397..670d567c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,6 +2,8 @@ include: package:flutter_lints/flutter.yaml analyzer: exclude: - 'test/**' + - 'test.g.dart' + - 'lib/**/*.g.dart' linter: rules: diff --git a/lib/api/lidarr/api.dart b/lib/api/lidarr/api.dart new file mode 100644 index 00000000..d9929d6e --- /dev/null +++ b/lib/api/lidarr/api.dart @@ -0,0 +1,27 @@ +import 'package:lunasea/vendor.dart'; + +part 'api.g.dart'; + +String _baseUrl(String host) { + String base = host.endsWith('/') ? host.substring(0, host.length - 1) : host; + return '$base/api/v3/'; +} + +@RestApi() +abstract class LidarrAPI { + factory LidarrAPI({ + required String host, + required String apiKey, + Map headers = const {}, + }) { + Dio dio = Dio(BaseOptions( + headers: headers, + followRedirects: true, + maxRedirects: 5, + queryParameters: { + if (apiKey.isNotEmpty) 'apikey': apiKey, + }, + )); + return _LidarrAPI(dio, baseUrl: _baseUrl(host)); + } +} diff --git a/lib/api/nzbget/api.dart b/lib/api/nzbget/api.dart new file mode 100644 index 00000000..72be1c24 --- /dev/null +++ b/lib/api/nzbget/api.dart @@ -0,0 +1,69 @@ +import 'dart:convert'; +import 'package:dio/dio.dart'; +import 'package:lunasea/api/nzbget/models/status.dart'; +import 'package:lunasea/api/nzbget/models/version.dart'; +import 'package:retrofit/retrofit.dart'; + +part 'api.g.dart'; + +String _baseUrl(String host, String user, String password) { + String base = host.endsWith('/') ? host.substring(0, host.length - 1) : host; + + if (user.isNotEmpty && password.isNotEmpty) { + return '$base/$user:$password/jsonrpc/'; + } + return '$base/jsonrpc/'; +} + +void _attachInterceptor(Dio dio) { + dio.interceptors.add(InterceptorsWrapper( + onRequest: (options, handler) { + options.data = json.encode({ + 'jsonrpc': '2.0', + 'method': options.queryParameters['method'], + 'params': options.queryParameters['params'] ?? [], + 'id': 1, + }); + options.queryParameters = const {}; + return handler.next(options); + }, + )); +} + +void _setResponseTransformer(Dio dio) { + (dio.transformer as DefaultTransformer).jsonDecodeCallback = (data) { + final parsed = json.decode(data); + final result = parsed['result']; + if (result is Map) return result; + return {'result': result}; + }; +} + +@RestApi() +abstract class NZBGetAPI { + factory NZBGetAPI({ + required String host, + required String username, + required String password, + Map headers = const {}, + }) { + Dio dio = Dio(BaseOptions( + headers: headers, + followRedirects: true, + maxRedirects: 5, + )); + _attachInterceptor(dio); + _setResponseTransformer(dio); + return _NZBGetAPI(dio, baseUrl: _baseUrl(host, username, password)); + } + + @POST('') + Future getVersion({ + @Query('method') String method = 'version', + }); + + @POST('') + Future getStatus({ + @Query('method') String method = 'status', + }); +} diff --git a/lib/api/nzbget/models/status.dart b/lib/api/nzbget/models/status.dart new file mode 100644 index 00000000..1d36544a --- /dev/null +++ b/lib/api/nzbget/models/status.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; +import 'package:json_annotation/json_annotation.dart'; + +part 'status.g.dart'; + +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class NZBGetStatus { + @JsonKey(name: 'DownloadPaused') + bool paused; + + @JsonKey(name: 'DownloadRate') + int speed; + + @JsonKey(name: 'DownloadLimit') + int speedLimit; + + @JsonKey(name: 'RemainingSizeMB') + int remainingSize; + + NZBGetStatus({ + required this.paused, + required this.speed, + required this.speedLimit, + required this.remainingSize, + }); + + @override + String toString() => json.encode(this.toJson()); + + factory NZBGetStatus.fromJson(Map json) { + return _$NZBGetStatusFromJson(json); + } + + Map toJson() { + return _$NZBGetStatusToJson(this); + } +} diff --git a/lib/api/nzbget/models/version.dart b/lib/api/nzbget/models/version.dart new file mode 100644 index 00000000..226c2820 --- /dev/null +++ b/lib/api/nzbget/models/version.dart @@ -0,0 +1,25 @@ +import 'dart:convert'; +import 'package:json_annotation/json_annotation.dart'; + +part 'version.g.dart'; + +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class NZBGetVersion { + @JsonKey(name: 'result') + String version; + + NZBGetVersion({ + required this.version, + }); + + @override + String toString() => json.encode(this.toJson()); + + factory NZBGetVersion.fromJson(Map json) { + return _$NZBGetVersionFromJson(json); + } + + Map toJson() { + return _$NZBGetVersionToJson(this); + } +} diff --git a/lib/api/overseerr/overseerr.dart b/lib/api/overseerr/api.dart similarity index 70% rename from lib/api/overseerr/overseerr.dart rename to lib/api/overseerr/api.dart index a924856d..762f89ca 100644 --- a/lib/api/overseerr/overseerr.dart +++ b/lib/api/overseerr/api.dart @@ -1,8 +1,17 @@ -import 'package:dio/dio.dart'; -import 'package:retrofit/retrofit.dart'; -import 'package:lunasea/api/overseerr/models.dart'; +import 'package:lunasea/api/overseerr/models/content/movie.dart'; +import 'package:lunasea/api/overseerr/models/content/series.dart'; +import 'package:lunasea/api/overseerr/models/issues/issue.dart'; +import 'package:lunasea/api/overseerr/models/issues/issue_page.dart'; +import 'package:lunasea/api/overseerr/models/requests/request.dart'; +import 'package:lunasea/api/overseerr/models/requests/request_count.dart'; +import 'package:lunasea/api/overseerr/models/requests/request_page.dart'; +import 'package:lunasea/api/overseerr/models/status/status.dart'; +import 'package:lunasea/api/overseerr/models/status/status_appdata.dart'; +import 'package:lunasea/api/overseerr/models/users/user_page.dart'; +import 'package:lunasea/api/overseerr/models/users/user_quota.dart'; +import 'package:lunasea/vendor.dart'; -part 'overseerr.g.dart'; +part 'api.g.dart'; @RestApi() abstract class OverseerrAPI { diff --git a/lib/api/sabnzbd/sabnzbd.dart b/lib/api/sabnzbd/api.dart similarity index 96% rename from lib/api/sabnzbd/sabnzbd.dart rename to lib/api/sabnzbd/api.dart index 5434284c..76c9df1f 100644 --- a/lib/api/sabnzbd/sabnzbd.dart +++ b/lib/api/sabnzbd/api.dart @@ -1,4 +1,4 @@ -import 'package:dio/dio.dart'; +import 'package:lunasea/vendor.dart'; import 'package:lunasea/api/sabnzbd/models/action_result.dart'; import 'package:lunasea/api/sabnzbd/models/categories.dart'; import 'package:lunasea/api/sabnzbd/models/history.dart'; @@ -13,9 +13,13 @@ import 'package:lunasea/api/sabnzbd/types/post_processing.dart'; import 'package:lunasea/api/sabnzbd/types/priority.dart'; import 'package:lunasea/api/sabnzbd/types/sort_category.dart'; import 'package:lunasea/api/sabnzbd/types/sort_direction.dart'; -import 'package:retrofit/retrofit.dart'; -part 'sabnzbd.g.dart'; +part 'api.g.dart'; + +String _baseUrl(String host) { + String base = host.endsWith('/') ? host.substring(0, host.length - 1) : host; + return '$base/api/'; +} @RestApi() abstract class SABnzbdAPI { @@ -24,7 +28,6 @@ abstract class SABnzbdAPI { required String apiKey, Map headers = const {}, }) { - String baseUrl = host.endsWith('/') ? '${host}api/' : '$host/api/'; Dio dio = Dio(BaseOptions( headers: headers, followRedirects: true, @@ -34,7 +37,7 @@ abstract class SABnzbdAPI { 'output': 'json', }, )); - return _SABnzbdAPI(dio, baseUrl: baseUrl); + return _SABnzbdAPI(dio, baseUrl: _baseUrl(host)); } @GET('') diff --git a/lib/api/sabnzbd/models/history.dart b/lib/api/sabnzbd/models/history.dart index 37012ff6..5bb9a009 100644 --- a/lib/api/sabnzbd/models/history.dart +++ b/lib/api/sabnzbd/models/history.dart @@ -6,7 +6,7 @@ part 'history.g.dart'; @JsonSerializable(explicitToJson: true, includeIfNull: false) class SABnzbdHistory { - SABnzbdHistoryResult history; + _SABnzbdHistoryResult history; SABnzbdHistory({ required this.history, @@ -25,8 +25,8 @@ class SABnzbdHistory { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class SABnzbdHistoryResult { - List slots; +class _SABnzbdHistoryResult { + List<_SABnzbdHistorySlot> slots; @JsonKey(name: 'day_size') String dailySize; @@ -40,7 +40,7 @@ class SABnzbdHistoryResult { @JsonKey(name: 'total_size') String totalSize; - SABnzbdHistoryResult({ + _SABnzbdHistoryResult({ required this.slots, required this.dailySize, required this.weeklySize, @@ -51,7 +51,7 @@ class SABnzbdHistoryResult { @override String toString() => json.encode(this.toJson()); - factory SABnzbdHistoryResult.fromJson(Map json) { + factory _SABnzbdHistoryResult.fromJson(Map json) { return _$SABnzbdHistoryResultFromJson(json); } @@ -61,7 +61,7 @@ class SABnzbdHistoryResult { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class SABnzbdHistorySlot { +class _SABnzbdHistorySlot { String name; String status; String script; @@ -89,7 +89,7 @@ class SABnzbdHistorySlot { @JsonKey(name: 'stage_log') List stageLog; - SABnzbdHistorySlot({ + _SABnzbdHistorySlot({ required this.name, required this.status, required this.script, @@ -107,7 +107,7 @@ class SABnzbdHistorySlot { @override String toString() => json.encode(this.toJson()); - factory SABnzbdHistorySlot.fromJson(Map json) { + factory _SABnzbdHistorySlot.fromJson(Map json) { return _$SABnzbdHistorySlotFromJson(json); } diff --git a/lib/api/sabnzbd/models/queue.dart b/lib/api/sabnzbd/models/queue.dart index 901e784c..bc51a61d 100644 --- a/lib/api/sabnzbd/models/queue.dart +++ b/lib/api/sabnzbd/models/queue.dart @@ -5,7 +5,7 @@ part 'queue.g.dart'; @JsonSerializable(explicitToJson: true, includeIfNull: false) class SABnzbdQueue { - SABnzbdQueueResult queue; + _SABnzbdQueueResult queue; SABnzbdQueue({ required this.queue, @@ -24,10 +24,10 @@ class SABnzbdQueue { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class SABnzbdQueueResult { +class _SABnzbdQueueResult { String status; bool paused; - List slots; + List<_SABnzbdQueueSlot> slots; @JsonKey(name: 'kbpersec') String speed; @@ -41,7 +41,7 @@ class SABnzbdQueueResult { @JsonKey(name: 'mbleft') String sizeLeft; - SABnzbdQueueResult({ + _SABnzbdQueueResult({ required this.status, required this.paused, required this.speed, @@ -54,7 +54,7 @@ class SABnzbdQueueResult { @override String toString() => json.encode(this.toJson()); - factory SABnzbdQueueResult.fromJson(Map json) { + factory _SABnzbdQueueResult.fromJson(Map json) { return _$SABnzbdQueueResultFromJson(json); } @@ -64,7 +64,7 @@ class SABnzbdQueueResult { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class SABnzbdQueueSlot { +class _SABnzbdQueueSlot { String filename; String status; String script; @@ -85,7 +85,7 @@ class SABnzbdQueueSlot { @JsonKey(name: 'cat') String category; - SABnzbdQueueSlot({ + _SABnzbdQueueSlot({ required this.filename, required this.status, required this.script, @@ -100,7 +100,7 @@ class SABnzbdQueueSlot { @override String toString() => json.encode(this.toJson()); - factory SABnzbdQueueSlot.fromJson(Map json) { + factory _SABnzbdQueueSlot.fromJson(Map json) { return _$SABnzbdQueueSlotFromJson(json); } diff --git a/lib/api/sabnzbd/models/status.dart b/lib/api/sabnzbd/models/status.dart index 430dfc71..a4c3717e 100644 --- a/lib/api/sabnzbd/models/status.dart +++ b/lib/api/sabnzbd/models/status.dart @@ -5,7 +5,7 @@ part 'status.g.dart'; @JsonSerializable(explicitToJson: true, includeIfNull: false) class SABnzbdStatus { - SABnzbdStatusResult status; + _SABnzbdStatusResult status; SABnzbdStatus({ required this.status, @@ -24,7 +24,7 @@ class SABnzbdStatus { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class SABnzbdStatusResult { +class _SABnzbdStatusResult { String uptime; String version; bool paused; @@ -41,7 +41,7 @@ class SABnzbdStatusResult { @JsonKey(name: 'speedlimit') String speedLimitPercentage; - SABnzbdStatusResult({ + _SABnzbdStatusResult({ required this.uptime, required this.version, required this.paused, @@ -54,7 +54,7 @@ class SABnzbdStatusResult { @override String toString() => json.encode(this.toJson()); - factory SABnzbdStatusResult.fromJson(Map json) { + factory _SABnzbdStatusResult.fromJson(Map json) { return _$SABnzbdStatusResultFromJson(json); } diff --git a/lib/core.dart b/lib/core.dart index f6d31d7d..9413f56f 100644 --- a/lib/core.dart +++ b/lib/core.dart @@ -1,7 +1,7 @@ /// This file is deprecated and should no longer be actively used. /// All imports should happen directly and canonical export files will not be used anymore. -export 'system/state.dart'; +export 'state/state.dart'; export 'types/loading_state.dart'; export 'database/box.dart'; export 'database/models/profile.dart'; diff --git a/lib/database/box.dart b/lib/database/box.dart index 90111131..ef307148 100644 --- a/lib/database/box.dart +++ b/lib/database/box.dart @@ -63,11 +63,15 @@ enum LunaBox { return Hive.openBox(key); } + Stream watch([dynamic key]) { + return _instance.watch(key: key); + } + ValueListenable> listenable([List? keys]) { return _instance.listenable(keys: keys); } - ValueListenableBuilder watch({ + ValueListenableBuilder listenableBuilder({ required Widget Function(BuildContext, Widget?) builder, List? selectKeys, List? selectItems, diff --git a/lib/database/table.dart b/lib/database/table.dart index 92461939..c180b3c3 100644 --- a/lib/database/table.dart +++ b/lib/database/table.dart @@ -12,6 +12,7 @@ import 'package:lunasea/database/tables/sabnzbd.dart'; import 'package:lunasea/database/tables/search.dart'; import 'package:lunasea/database/tables/sonarr.dart'; import 'package:lunasea/database/tables/tautulli.dart'; +import 'package:lunasea/vendor.dart'; enum LunaTable { bios('bios', items: BIOSDatabase.values), @@ -94,12 +95,16 @@ mixin LunaTableMixin on Enum { return update(value as T); } - ValueListenableBuilder watch({ + Stream watch() { + return box.watch(this.key); + } + + ValueListenableBuilder listenableBuilder({ required Widget Function(BuildContext, Widget?) builder, Key? key, Widget? child, }) { - return box.watch( + return box.listenableBuilder( key: key, selectItems: [this], builder: (context, widget) => builder(context, widget), diff --git a/lib/extensions/string/string.dart b/lib/extensions/string/string.dart index 0a1795fe..e125edc6 100644 --- a/lib/extensions/string/string.dart +++ b/lib/extensions/string/string.dart @@ -65,4 +65,9 @@ extension StringExtension on String { }) { return '${bullet.pad(count: padCount)}$this'; } + + /// Returns the string without any trailing slash. + String noTrailingSlash() { + return this.endsWith('/') ? this.substring(0, this.length - 1) : this; + } } diff --git a/lib/main.dart b/lib/main.dart index 69e511fb..cc83e75c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -61,7 +61,7 @@ class LunaOS extends StatelessWidget { fallbackLocale: LunaLocalization.fallbackLocale, startLocale: LunaLocalization.fallbackLocale, useFallbackTranslations: true, - child: LunaBox.lunasea.watch( + child: LunaBox.lunasea.listenableBuilder( selectItems: [ LunaSeaDatabase.THEME_AMOLED, LunaSeaDatabase.THEME_AMOLED_BORDER, diff --git a/lib/modules.dart b/lib/modules.dart index 0a29ef82..d096f9b6 100644 --- a/lib/modules.dart +++ b/lib/modules.dart @@ -495,7 +495,7 @@ extension LunaModuleExtension on LunaModule { String key = 'LUNASEA_MODULE_INFORMATION_${this.key}'; void markSeen() => LunaBox.alerts.update(key, false); - return LunaBox.alerts.watch( + return LunaBox.alerts.listenableBuilder( selectKeys: [key], builder: (context, _) { if (LunaBox.alerts.read(key, fallback: true)) { diff --git a/lib/modules/dashboard/core/state.dart b/lib/modules/dashboard/core/state.dart index 9b5ea44c..5f5d31b6 100644 --- a/lib/modules/dashboard/core/state.dart +++ b/lib/modules/dashboard/core/state.dart @@ -2,7 +2,7 @@ import 'package:lunasea/database/tables/dashboard.dart'; import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_type.dart'; import 'package:lunasea/modules/dashboard/core/api/api.dart'; import 'package:lunasea/modules/dashboard/core/api/data/abstract.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; class ModuleState extends LunaModuleState { ModuleState() { diff --git a/lib/modules/dashboard/routes/dashboard/route.dart b/lib/modules/dashboard/routes/dashboard/route.dart index eb748290..6110b860 100644 --- a/lib/modules/dashboard/routes/dashboard/route.dart +++ b/lib/modules/dashboard/routes/dashboard/route.dart @@ -53,7 +53,7 @@ class _State extends State { } Widget _body() { - return LunaSeaDatabase.ENABLED_PROFILE.watch( + return LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder( builder: (context, _) => LunaPageView( controller: _pageController, children: [ diff --git a/lib/modules/dashboard/routes/dashboard/widgets/calendar_view.dart b/lib/modules/dashboard/routes/dashboard/widgets/calendar_view.dart index 1e51613a..e613526b 100644 --- a/lib/modules/dashboard/routes/dashboard/widgets/calendar_view.dart +++ b/lib/modules/dashboard/routes/dashboard/widgets/calendar_view.dart @@ -122,7 +122,7 @@ class _State extends State { } Widget _calendar() { - return LunaBox.lunasea.watch( + return LunaBox.lunasea.listenableBuilder( selectItems: [ DashboardDatabase.CALENDAR_STARTING_DAY, DashboardDatabase.CALENDAR_STARTING_SIZE, diff --git a/lib/modules/lidarr/core/dialogs.dart b/lib/modules/lidarr/core/dialogs.dart index 50bebcd4..8cf21ba0 100644 --- a/lib/modules/lidarr/core/dialogs.dart +++ b/lib/modules/lidarr/core/dialogs.dart @@ -319,7 +319,7 @@ class LidarrDialogs { ], showCancelButton: false, content: [ - LidarrDatabase.ADD_ARTIST_SEARCH_FOR_MISSING.watch( + LidarrDatabase.ADD_ARTIST_SEARCH_FOR_MISSING.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'lidarr.StartSearchForMissingAlbums'.tr(), value: LidarrDatabase.ADD_ARTIST_SEARCH_FOR_MISSING.read(), diff --git a/lib/modules/lidarr/routes/add_details.dart b/lib/modules/lidarr/routes/add_details.dart index e80fd131..8fb55294 100644 --- a/lib/modules/lidarr/routes/add_details.dart +++ b/lib/modules/lidarr/routes/add_details.dart @@ -165,7 +165,7 @@ class _State extends State widget.data?.discogsLink?.openLink(); }, ), - LidarrDatabase.ADD_ROOT_FOLDER.watch( + LidarrDatabase.ADD_ROOT_FOLDER.listenableBuilder( builder: (context, _) { final _rootfolder = LidarrDatabase.ADD_ROOT_FOLDER.read(); return LunaBlock( @@ -183,7 +183,8 @@ class _State extends State ); }, ), - LidarrDatabase.ADD_MONITORED_STATUS.watch(builder: (context, _) { + LidarrDatabase.ADD_MONITORED_STATUS.listenableBuilder( + builder: (context, _) { const _db = LidarrDatabase.ADD_MONITORED_STATUS; final _status = LidarrMonitorStatus.ALL.fromKey(_db.read()) ?? LidarrMonitorStatus.ALL; @@ -199,7 +200,7 @@ class _State extends State }, ); }), - LidarrDatabase.ADD_QUALITY_PROFILE.watch( + LidarrDatabase.ADD_QUALITY_PROFILE.listenableBuilder( builder: (context, _) { final _profile = LidarrDatabase.ADD_QUALITY_PROFILE.read(); return LunaBlock( @@ -217,7 +218,7 @@ class _State extends State ); }, ), - LidarrDatabase.ADD_METADATA_PROFILE.watch( + LidarrDatabase.ADD_METADATA_PROFILE.listenableBuilder( builder: (context, _) { final _profile = LidarrDatabase.ADD_METADATA_PROFILE.read(); return LunaBlock( diff --git a/lib/modules/overseerr.dart b/lib/modules/overseerr.dart index 56b702e6..13dd80a1 100644 --- a/lib/modules/overseerr.dart +++ b/lib/modules/overseerr.dart @@ -1,4 +1,4 @@ -export '../api/overseerr/overseerr.dart'; +export '../api/overseerr/api.dart'; export '../api/overseerr/models.dart'; export '../api/overseerr/types.dart'; export 'overseerr/core.dart'; diff --git a/lib/modules/radarr/core/dialogs.dart b/lib/modules/radarr/core/dialogs.dart index c4264a8d..4bbbff12 100644 --- a/lib/modules/radarr/core/dialogs.dart +++ b/lib/modules/radarr/core/dialogs.dart @@ -467,7 +467,7 @@ class RadarrDialogs { ), ], content: [ - RadarrDatabase.QUEUE_REMOVE_FROM_CLIENT.watch( + RadarrDatabase.QUEUE_REMOVE_FROM_CLIENT.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'Remove From Client', value: RadarrDatabase.QUEUE_REMOVE_FROM_CLIENT.read(), @@ -475,7 +475,7 @@ class RadarrDialogs { RadarrDatabase.QUEUE_REMOVE_FROM_CLIENT.update(selected!), ), ), - RadarrDatabase.QUEUE_BLACKLIST.watch( + RadarrDatabase.QUEUE_BLACKLIST.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'Blacklist Release', value: RadarrDatabase.QUEUE_BLACKLIST.read(), @@ -610,7 +610,7 @@ class RadarrDialogs { ), ], content: [ - RadarrDatabase.REMOVE_MOVIE_IMPORT_LIST.watch( + RadarrDatabase.REMOVE_MOVIE_IMPORT_LIST.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'Add to Exclusion List', value: RadarrDatabase.REMOVE_MOVIE_IMPORT_LIST.read(), @@ -618,7 +618,7 @@ class RadarrDialogs { RadarrDatabase.REMOVE_MOVIE_IMPORT_LIST.update(value!), ), ), - RadarrDatabase.REMOVE_MOVIE_DELETE_FILES.watch( + RadarrDatabase.REMOVE_MOVIE_DELETE_FILES.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'Delete Files', value: RadarrDatabase.REMOVE_MOVIE_DELETE_FILES.read(), @@ -690,7 +690,7 @@ class RadarrDialogs { ], showCancelButton: false, content: [ - RadarrDatabase.ADD_MOVIE_SEARCH_FOR_MISSING.watch( + RadarrDatabase.ADD_MOVIE_SEARCH_FOR_MISSING.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'radarr.StartSearchForMissingMovie'.tr(), value: RadarrDatabase.ADD_MOVIE_SEARCH_FOR_MISSING.read(), diff --git a/lib/modules/radarr/routes/manual_import_details/widgets/bottom_action_bar.dart b/lib/modules/radarr/routes/manual_import_details/widgets/bottom_action_bar.dart index 60a1cb53..916d0ee8 100644 --- a/lib/modules/radarr/routes/manual_import_details/widgets/bottom_action_bar.dart +++ b/lib/modules/radarr/routes/manual_import_details/widgets/bottom_action_bar.dart @@ -11,7 +11,7 @@ class RadarrManualImportDetailsBottomActionBar extends StatelessWidget { Widget build(BuildContext context) { return LunaBottomActionBar( actions: [ - RadarrDatabase.MANUAL_IMPORT_DEFAULT_MODE.watch( + RadarrDatabase.MANUAL_IMPORT_DEFAULT_MODE.listenableBuilder( builder: (context, _) => LunaActionBarCard( title: 'radarr.ImportMode'.tr(), subtitle: RadarrImportMode.COPY diff --git a/lib/modules/search/core/dialogs.dart b/lib/modules/search/core/dialogs.dart index 272f901a..cc797cf9 100644 --- a/lib/modules/search/core/dialogs.dart +++ b/lib/modules/search/core/dialogs.dart @@ -19,7 +19,7 @@ class SearchDialogs { await LunaDialog.dialog( context: context, title: 'search.Download'.tr(), - customContent: LunaSeaDatabase.ENABLED_PROFILE.watch( + customContent: LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder( builder: (context, _) => LunaDialog.content( children: [ Padding( diff --git a/lib/modules/settings/core/banners.dart b/lib/modules/settings/core/banners.dart index 2c301a95..4fbb9842 100644 --- a/lib/modules/settings/core/banners.dart +++ b/lib/modules/settings/core/banners.dart @@ -73,7 +73,7 @@ extension SettingsBannersExtension on SettingsBanners { Color headerColor = Colors.white, Color bodyColor = LunaColours.grey, }) { - return LunaBox.alerts.watch( + return LunaBox.alerts.listenableBuilder( selectKeys: [key], builder: (context, _) { if (shouldShow!) diff --git a/lib/modules/settings/core/pages/headers.dart b/lib/modules/settings/core/pages/headers.dart index a8716f8c..f0b66902 100644 --- a/lib/modules/settings/core/pages/headers.dart +++ b/lib/modules/settings/core/pages/headers.dart @@ -53,7 +53,7 @@ class _State extends State with LunaScrollControllerMixin { } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration/route.dart b/lib/modules/settings/routes/configuration/route.dart index 07e753cd..d78a2bb3 100644 --- a/lib/modules/settings/routes/configuration/route.dart +++ b/lib/modules/settings/routes/configuration/route.dart @@ -36,7 +36,7 @@ class _State extends State with LunaScrollControllerMixin { } Widget _enabledProfile() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) { if (LunaBox.profiles.size < 2) return const SizedBox(); return LunaIconButton( diff --git a/lib/modules/settings/routes/configuration_appearance/route.dart b/lib/modules/settings/routes/configuration_appearance/route.dart index 53a9ebdf..d653ec8d 100644 --- a/lib/modules/settings/routes/configuration_appearance/route.dart +++ b/lib/modules/settings/routes/configuration_appearance/route.dart @@ -44,7 +44,7 @@ class _State extends State Widget _amoledTheme() { const _db = LunaSeaDatabase.THEME_AMOLED; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.AmoledTheme'.tr(), body: [ @@ -62,7 +62,7 @@ class _State extends State } Widget _amoledThemeBorders() { - return LunaBox.lunasea.watch( + return LunaBox.lunasea.listenableBuilder( selectItems: [ LunaSeaDatabase.THEME_AMOLED_BORDER, LunaSeaDatabase.THEME_AMOLED, @@ -84,7 +84,7 @@ class _State extends State Widget _imageBackgroundOpacity() { const _db = LunaSeaDatabase.THEME_IMAGE_BACKGROUND_OPACITY; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.BackgroundImageOpacity'.tr(), body: [ diff --git a/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart b/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart index 85e5eb04..11cc4551 100644 --- a/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart +++ b/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart @@ -60,7 +60,7 @@ class _State extends State Widget _pastDaysInSchedule() { const _db = DashboardDatabase.CALENDAR_SHOW_PAST_DAYS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.PastDaysInScheduleView'.tr(), trailing: LunaSwitch( @@ -73,7 +73,7 @@ class _State extends State Widget _pastDays() { const _db = DashboardDatabase.CALENDAR_DAYS_PAST; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.PastDays'.tr(), body: [ @@ -95,7 +95,7 @@ class _State extends State Widget _futureDays() { const _db = DashboardDatabase.CALENDAR_DAYS_FUTURE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.FutureDays'.tr(), body: [ @@ -117,7 +117,7 @@ class _State extends State Widget _modulesLidarr() { const _db = DashboardDatabase.CALENDAR_ENABLE_LIDARR; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: LunaModule.LIDARR.title, body: [ @@ -137,7 +137,7 @@ class _State extends State Widget _modulesRadarr() { const _db = DashboardDatabase.CALENDAR_ENABLE_RADARR; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: LunaModule.RADARR.title, body: [ @@ -157,7 +157,7 @@ class _State extends State Widget _modulesSonarr() { const _db = DashboardDatabase.CALENDAR_ENABLE_SONARR; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: LunaModule.SONARR.title, body: [ @@ -177,7 +177,7 @@ class _State extends State Widget _startingView() { const _db = DashboardDatabase.CALENDAR_STARTING_TYPE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.StartingView'.tr(), body: [ @@ -195,7 +195,7 @@ class _State extends State Widget _startingDay() { const _db = DashboardDatabase.CALENDAR_STARTING_DAY; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.StartingDay'.tr(), body: [ @@ -213,7 +213,7 @@ class _State extends State Widget _startingSize() { const _db = DashboardDatabase.CALENDAR_STARTING_SIZE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.StartingSize'.tr(), body: [ diff --git a/lib/modules/settings/routes/configuration_dashboard/pages/default_pages.dart b/lib/modules/settings/routes/configuration_dashboard/pages/default_pages.dart index 8841d9d1..0ddc4393 100644 --- a/lib/modules/settings/routes/configuration_dashboard/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_dashboard/pages/default_pages.dart @@ -45,7 +45,7 @@ class _State extends State Widget _homePage() { const _db = DashboardDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'lunasea.Home'.tr(), body: [TextSpan(text: HomeNavigationBar.titles[_db.read()])], diff --git a/lib/modules/settings/routes/configuration_drawer/route.dart b/lib/modules/settings/routes/configuration_drawer/route.dart index 55b13a9b..9af21979 100644 --- a/lib/modules/settings/routes/configuration_drawer/route.dart +++ b/lib/modules/settings/routes/configuration_drawer/route.dart @@ -46,7 +46,7 @@ class _State extends State body: [ TextSpan(text: 'settings.AutomaticallyManageOrderDescription'.tr()), ], - trailing: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.watch( + trailing: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.listenableBuilder( builder: (context, _) => LunaSwitch( value: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.read(), onChanged: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.update, @@ -76,7 +76,7 @@ class _State extends State } Widget _reorderableModuleTile(int index) { - return LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.watch( + return LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.listenableBuilder( key: ObjectKey(_modules![index]), builder: (context, _) => LunaBlock( disabled: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.read(), diff --git a/lib/modules/settings/routes/configuration_external_modules/pages/edit_module.dart b/lib/modules/settings/routes/configuration_external_modules/pages/edit_module.dart index 7d8847db..ca98db32 100644 --- a/lib/modules/settings/routes/configuration_external_modules/pages/edit_module.dart +++ b/lib/modules/settings/routes/configuration_external_modules/pages/edit_module.dart @@ -68,7 +68,7 @@ class _State extends State } Widget _body() { - return LunaBox.externalModules.watch( + return LunaBox.externalModules.listenableBuilder( selectKeys: [widget.moduleId], builder: (context, dynamic _) { if (!LunaBox.externalModules.contains(widget.moduleId)) diff --git a/lib/modules/settings/routes/configuration_external_modules/route.dart b/lib/modules/settings/routes/configuration_external_modules/route.dart index c04ce7c1..79ddbb69 100644 --- a/lib/modules/settings/routes/configuration_external_modules/route.dart +++ b/lib/modules/settings/routes/configuration_external_modules/route.dart @@ -46,7 +46,7 @@ class _State extends State } Widget _body() { - return LunaBox.externalModules.watch( + return LunaBox.externalModules.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart b/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart index a61f286d..8d378da4 100644 --- a/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_lidarr/pages/default_pages.dart b/lib/modules/settings/routes/configuration_lidarr/pages/default_pages.dart index a2b032d0..3754d253 100644 --- a/lib/modules/settings/routes/configuration_lidarr/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_lidarr/pages/default_pages.dart @@ -42,7 +42,7 @@ class _State extends State Widget _homePage() { const _db = LidarrDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'lunasea.Home'.tr(), body: [TextSpan(text: LidarrNavigationBar.titles[_db.read()])], diff --git a/lib/modules/settings/routes/configuration_lidarr/route.dart b/lib/modules/settings/routes/configuration_lidarr/route.dart index 86e49c97..975d96f6 100644 --- a/lib/modules/settings/routes/configuration_lidarr/route.dart +++ b/lib/modules/settings/routes/configuration_lidarr/route.dart @@ -47,7 +47,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.EnableModule'.tr(args: [LunaModule.LIDARR.title]), trailing: LunaSwitch( diff --git a/lib/modules/settings/routes/configuration_localization/route.dart b/lib/modules/settings/routes/configuration_localization/route.dart index 71cc9308..0c5fa472 100644 --- a/lib/modules/settings/routes/configuration_localization/route.dart +++ b/lib/modules/settings/routes/configuration_localization/route.dart @@ -57,7 +57,7 @@ class _State extends State Widget _use24HourTime() { const _db = LunaSeaDatabase.USE_24_HOUR_TIME; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.Use24HourTime'.tr(), body: [TextSpan(text: 'settings.Use24HourTimeDescription'.tr())], diff --git a/lib/modules/settings/routes/configuration_network/route.dart b/lib/modules/settings/routes/configuration_network/route.dart index 974ad384..c511cf79 100644 --- a/lib/modules/settings/routes/configuration_network/route.dart +++ b/lib/modules/settings/routes/configuration_network/route.dart @@ -42,7 +42,7 @@ class _State extends State Widget _useTLSValidation() { const _db = LunaSeaDatabase.NETWORKING_TLS_VALIDATION; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.TLSCertificateValidation'.tr(), body: [ diff --git a/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart b/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart index 77804766..bc62e923 100644 --- a/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_nzbget/pages/default_pages.dart b/lib/modules/settings/routes/configuration_nzbget/pages/default_pages.dart index 559b76b5..4d77027f 100644 --- a/lib/modules/settings/routes/configuration_nzbget/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_nzbget/pages/default_pages.dart @@ -43,7 +43,7 @@ class _State extends State Widget _homePage() { const _db = NZBGetDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'lunasea.Home'.tr(), body: [TextSpan(text: NZBGetNavigationBar.titles[_db.read()])], diff --git a/lib/modules/settings/routes/configuration_nzbget/route.dart b/lib/modules/settings/routes/configuration_nzbget/route.dart index 19da9efb..dd53f2e3 100644 --- a/lib/modules/settings/routes/configuration_nzbget/route.dart +++ b/lib/modules/settings/routes/configuration_nzbget/route.dart @@ -47,7 +47,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.EnableModule'.tr(args: [LunaModule.NZBGET.title]), trailing: LunaSwitch( diff --git a/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart b/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart index 0356d0af..7f5ffd6e 100644 --- a/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_overseerr/route.dart b/lib/modules/settings/routes/configuration_overseerr/route.dart index 474a6c15..6fbf9bbe 100644 --- a/lib/modules/settings/routes/configuration_overseerr/route.dart +++ b/lib/modules/settings/routes/configuration_overseerr/route.dart @@ -44,7 +44,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Enable ${LunaModule.OVERSEERR.title}', trailing: LunaSwitch( diff --git a/lib/modules/settings/routes/configuration_quick_actions/route.dart b/lib/modules/settings/routes/configuration_quick_actions/route.dart index cadb6187..0fcc4d83 100644 --- a/lib/modules/settings/routes/configuration_quick_actions/route.dart +++ b/lib/modules/settings/routes/configuration_quick_actions/route.dart @@ -77,7 +77,7 @@ class _State extends State Widget _actionTile(String title, LunaSeaDatabase action) { return LunaBlock( title: title, - trailing: LunaBox.lunasea.watch( + trailing: LunaBox.lunasea.listenableBuilder( selectKeys: [action.key], builder: (context, _) => LunaSwitch( value: action.read(), diff --git a/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart b/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart index 1fb2b9ec..e3e76cba 100644 --- a/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_radarr/pages/default_options.dart b/lib/modules/settings/routes/configuration_radarr/pages/default_options.dart index b5a68ad4..01c94d82 100644 --- a/lib/modules/settings/routes/configuration_radarr/pages/default_options.dart +++ b/lib/modules/settings/routes/configuration_radarr/pages/default_options.dart @@ -52,7 +52,7 @@ class _State extends State Widget _viewMovies() { const _db = RadarrDatabase.DEFAULT_VIEW_MOVIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { return LunaBlock( title: 'lunasea.View'.tr(), @@ -86,7 +86,7 @@ class _State extends State Widget _sortingMovies() { const _db = RadarrDatabase.DEFAULT_SORTING_MOVIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -117,7 +117,7 @@ class _State extends State Widget _sortingMoviesDirection() { const _db = RadarrDatabase.DEFAULT_SORTING_MOVIES_ASCENDING; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortDirection'.tr(), body: [ @@ -142,7 +142,7 @@ class _State extends State Widget _filteringMovies() { const _db = RadarrDatabase.DEFAULT_FILTERING_MOVIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.FilterCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -171,7 +171,7 @@ class _State extends State Widget _sortingReleases() { const _db = RadarrDatabase.DEFAULT_SORTING_RELEASES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -199,7 +199,7 @@ class _State extends State Widget _sortingReleasesDirection() { const _db = RadarrDatabase.DEFAULT_SORTING_RELEASES_ASCENDING; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortDirection'.tr(), body: [ @@ -219,7 +219,7 @@ class _State extends State Widget _filteringReleases() { const _db = RadarrDatabase.DEFAULT_FILTERING_RELEASES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.FilterCategory'.tr(), body: [TextSpan(text: _db.read().readable)], diff --git a/lib/modules/settings/routes/configuration_radarr/pages/default_pages.dart b/lib/modules/settings/routes/configuration_radarr/pages/default_pages.dart index a3506739..3d6b2690 100644 --- a/lib/modules/settings/routes/configuration_radarr/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_radarr/pages/default_pages.dart @@ -45,7 +45,7 @@ class _State extends State Widget _homePage() { const _db = RadarrDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.Home'.tr(), body: [TextSpan(text: RadarrNavigationBar.titles[_db.read()])], @@ -64,7 +64,7 @@ class _State extends State Widget _movieDetailsPage() { const _db = RadarrDatabase.NAVIGATION_INDEX_MOVIE_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Movie Details', body: [ @@ -87,7 +87,7 @@ class _State extends State Widget _addMoviePage() { const _db = RadarrDatabase.NAVIGATION_INDEX_ADD_MOVIE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Add Movie', body: [TextSpan(text: RadarrAddMovieNavigationBar.titles[_db.read()])], @@ -107,7 +107,7 @@ class _State extends State Widget _systemStatusPage() { const _db = RadarrDatabase.NAVIGATION_INDEX_SYSTEM_STATUS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'System Status', body: [ diff --git a/lib/modules/settings/routes/configuration_radarr/route.dart b/lib/modules/settings/routes/configuration_radarr/route.dart index e4f79ef7..ddd8df4d 100644 --- a/lib/modules/settings/routes/configuration_radarr/route.dart +++ b/lib/modules/settings/routes/configuration_radarr/route.dart @@ -49,7 +49,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Enable ${LunaModule.RADARR.title}', trailing: LunaSwitch( @@ -93,7 +93,7 @@ class _State extends State Widget _discoverUseRadarrSuggestionsToggle() { const _db = RadarrDatabase.ADD_DISCOVER_USE_SUGGESTIONS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Discover Suggestions', body: const [TextSpan(text: 'Add Suggested Releases in Discover')], @@ -107,7 +107,7 @@ class _State extends State Widget _queueSize() { const _db = RadarrDatabase.QUEUE_PAGE_SIZE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Queue Size', body: [ diff --git a/lib/modules/settings/routes/configuration_sabnzbd/pages/connection_details.dart b/lib/modules/settings/routes/configuration_sabnzbd/pages/connection_details.dart index fab80376..20be3360 100644 --- a/lib/modules/settings/routes/configuration_sabnzbd/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_sabnzbd/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_sabnzbd/pages/default_pages.dart b/lib/modules/settings/routes/configuration_sabnzbd/pages/default_pages.dart index 8c705f2f..82b13489 100644 --- a/lib/modules/settings/routes/configuration_sabnzbd/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_sabnzbd/pages/default_pages.dart @@ -43,7 +43,7 @@ class _State extends State Widget _homePage() { const _db = SABnzbdDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'lunasea.Home'.tr(), body: [TextSpan(text: SABnzbdNavigationBar.titles[_db.read()])], diff --git a/lib/modules/settings/routes/configuration_sabnzbd/route.dart b/lib/modules/settings/routes/configuration_sabnzbd/route.dart index 8d086717..2f0bdf54 100644 --- a/lib/modules/settings/routes/configuration_sabnzbd/route.dart +++ b/lib/modules/settings/routes/configuration_sabnzbd/route.dart @@ -47,7 +47,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Enable ${LunaModule.SABNZBD.title}', trailing: LunaSwitch( diff --git a/lib/modules/settings/routes/configuration_search/pages/edit_indexer.dart b/lib/modules/settings/routes/configuration_search/pages/edit_indexer.dart index 46808e0b..2e7aed4d 100644 --- a/lib/modules/settings/routes/configuration_search/pages/edit_indexer.dart +++ b/lib/modules/settings/routes/configuration_search/pages/edit_indexer.dart @@ -67,7 +67,7 @@ class _State extends State } Widget _body() { - return LunaBox.indexers.watch( + return LunaBox.indexers.listenableBuilder( selectKeys: [widget.id], builder: (context, _) { if (!LunaBox.indexers.contains(widget.id)) return Container(); diff --git a/lib/modules/settings/routes/configuration_search/pages/edit_indexer_headers.dart b/lib/modules/settings/routes/configuration_search/pages/edit_indexer_headers.dart index fdc77fa2..72c0ae98 100644 --- a/lib/modules/settings/routes/configuration_search/pages/edit_indexer_headers.dart +++ b/lib/modules/settings/routes/configuration_search/pages/edit_indexer_headers.dart @@ -59,7 +59,7 @@ class _State extends State } Widget _body() { - return LunaBox.indexers.watch( + return LunaBox.indexers.listenableBuilder( selectKeys: [widget.id], builder: (context, _) { if (!LunaBox.indexers.contains(widget.id)) return Container(); diff --git a/lib/modules/settings/routes/configuration_search/route.dart b/lib/modules/settings/routes/configuration_search/route.dart index 4479d257..283fd02a 100644 --- a/lib/modules/settings/routes/configuration_search/route.dart +++ b/lib/modules/settings/routes/configuration_search/route.dart @@ -47,7 +47,7 @@ class _State extends State } Widget _body() { - return LunaBox.indexers.watch( + return LunaBox.indexers.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ @@ -101,7 +101,7 @@ class _State extends State Widget _hideAdultCategories() { const _db = SearchDatabase.HIDE_XXX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Hide Adult Categories', body: const [TextSpan(text: 'Hide Adult Content')], @@ -115,7 +115,7 @@ class _State extends State Widget _showLinks() { const _db = SearchDatabase.SHOW_LINKS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Show Links', body: const [TextSpan(text: 'Show Download and Comments Links')], diff --git a/lib/modules/settings/routes/configuration_sonarr/pages/connection_details.dart b/lib/modules/settings/routes/configuration_sonarr/pages/connection_details.dart index 21dab485..253f4892 100644 --- a/lib/modules/settings/routes/configuration_sonarr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_sonarr/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_sonarr/pages/default_options.dart b/lib/modules/settings/routes/configuration_sonarr/pages/default_options.dart index cd3170fc..bbe4a3df 100644 --- a/lib/modules/settings/routes/configuration_sonarr/pages/default_options.dart +++ b/lib/modules/settings/routes/configuration_sonarr/pages/default_options.dart @@ -52,7 +52,7 @@ class _State extends State Widget _viewSeries() { const _db = SonarrDatabase.DEFAULT_VIEW_SERIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { LunaListViewOption _view = _db.read(); return LunaBlock( @@ -87,7 +87,7 @@ class _State extends State Widget _sortingSeries() { const _db = SonarrDatabase.DEFAULT_SORTING_SERIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -118,7 +118,7 @@ class _State extends State Widget _sortingSeriesDirection() { const _db = SonarrDatabase.DEFAULT_SORTING_SERIES_ASCENDING; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortDirection'.tr(), body: [ @@ -138,7 +138,7 @@ class _State extends State Widget _filteringSeries() { const _db = SonarrDatabase.DEFAULT_FILTERING_SERIES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.FilterCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -166,7 +166,7 @@ class _State extends State Widget _sortingReleases() { const _db = SonarrDatabase.DEFAULT_SORTING_RELEASES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortCategory'.tr(), body: [TextSpan(text: _db.read().readable)], @@ -194,7 +194,7 @@ class _State extends State Widget _sortingReleasesDirection() { const _db = SonarrDatabase.DEFAULT_SORTING_RELEASES_ASCENDING; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SortDirection'.tr(), body: [ @@ -214,7 +214,7 @@ class _State extends State Widget _filteringReleases() { const _db = SonarrDatabase.DEFAULT_FILTERING_RELEASES; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.FilterCategory'.tr(), body: [TextSpan(text: _db.read().readable)], diff --git a/lib/modules/settings/routes/configuration_sonarr/pages/default_pages.dart b/lib/modules/settings/routes/configuration_sonarr/pages/default_pages.dart index 4d914e16..1e90dd09 100644 --- a/lib/modules/settings/routes/configuration_sonarr/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_sonarr/pages/default_pages.dart @@ -44,7 +44,7 @@ class _State extends State Widget _homePage() { const _db = SonarrDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { return LunaBlock( title: 'lunasea.Home'.tr(), @@ -65,7 +65,7 @@ class _State extends State Widget _seriesDetailsPage() { const _db = SonarrDatabase.NAVIGATION_INDEX_SERIES_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { return LunaBlock( title: 'sonarr.SeriesDetails'.tr(), @@ -89,7 +89,7 @@ class _State extends State Widget _seasonDetailsPage() { const _db = SonarrDatabase.NAVIGATION_INDEX_SEASON_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { return LunaBlock( title: 'sonarr.SeasonDetails'.tr(), diff --git a/lib/modules/settings/routes/configuration_sonarr/route.dart b/lib/modules/settings/routes/configuration_sonarr/route.dart index e3a3d0bd..f3cc220e 100644 --- a/lib/modules/settings/routes/configuration_sonarr/route.dart +++ b/lib/modules/settings/routes/configuration_sonarr/route.dart @@ -48,7 +48,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Enable ${LunaModule.SONARR.title}', trailing: LunaSwitch( @@ -100,7 +100,7 @@ class _State extends State Widget _queueSize() { const _db = SonarrDatabase.QUEUE_PAGE_SIZE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Queue Size', body: [ diff --git a/lib/modules/settings/routes/configuration_tautulli/pages/connection_details.dart b/lib/modules/settings/routes/configuration_tautulli/pages/connection_details.dart index 556fb94e..3462adc0 100644 --- a/lib/modules/settings/routes/configuration_tautulli/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_tautulli/pages/connection_details.dart @@ -43,7 +43,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/configuration_tautulli/pages/default_pages.dart b/lib/modules/settings/routes/configuration_tautulli/pages/default_pages.dart index 2c1f9cf8..9749b084 100644 --- a/lib/modules/settings/routes/configuration_tautulli/pages/default_pages.dart +++ b/lib/modules/settings/routes/configuration_tautulli/pages/default_pages.dart @@ -46,7 +46,7 @@ class _State extends State Widget _homePage() { const _db = TautulliDatabase.NAVIGATION_INDEX; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'lunasea.Home'.tr(), body: [TextSpan(text: TautulliNavigationBar.titles[_db.read()])], @@ -65,7 +65,7 @@ class _State extends State Widget _graphsPage() { const _db = TautulliDatabase.NAVIGATION_INDEX_GRAPHS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Graphs', body: [TextSpan(text: TautulliGraphsNavigationBar.titles[_db.read()])], @@ -85,7 +85,7 @@ class _State extends State Widget _libraryDetailsPage() { const _db = TautulliDatabase.NAVIGATION_INDEX_LIBRARIES_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Library Details', body: [ @@ -108,7 +108,7 @@ class _State extends State Widget _mediaDetailsPage() { const _db = TautulliDatabase.NAVIGATION_INDEX_MEDIA_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Media Details', body: [ @@ -130,7 +130,7 @@ class _State extends State Widget _userDetailsPage() { const _db = TautulliDatabase.NAVIGATION_INDEX_USER_DETAILS; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'User Details', body: [ diff --git a/lib/modules/settings/routes/configuration_tautulli/route.dart b/lib/modules/settings/routes/configuration_tautulli/route.dart index ba5575e5..4d50a3e3 100644 --- a/lib/modules/settings/routes/configuration_tautulli/route.dart +++ b/lib/modules/settings/routes/configuration_tautulli/route.dart @@ -49,7 +49,7 @@ class _State extends State } Widget _enabledToggle() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaBlock( title: 'Enable ${LunaModule.TAUTULLI.title}', trailing: LunaSwitch( @@ -86,7 +86,7 @@ class _State extends State Widget _defaultTerminationMessage() { const _db = TautulliDatabase.TERMINATION_MESSAGE; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { String message = _db.read(); return LunaBlock( @@ -105,7 +105,7 @@ class _State extends State Widget _activityRefreshRate() { const _db = TautulliDatabase.REFRESH_RATE; - return _db.watch(builder: (context, _) { + return _db.listenableBuilder(builder: (context, _) { String? refreshRate; if (_db.read() == 1) refreshRate = 'Every Second'; if (_db.read() != 1) refreshRate = 'Every ${_db.read()} Seconds'; @@ -123,7 +123,7 @@ class _State extends State Widget _statisticsItemCount() { const _db = TautulliDatabase.STATISTICS_STATS_COUNT; - return _db.watch( + return _db.listenableBuilder( builder: (context, _) { String? statisticsItems; if (_db.read() == 1) statisticsItems = '1 Item'; diff --git a/lib/modules/settings/routes/configuration_wake_on_lan/route.dart b/lib/modules/settings/routes/configuration_wake_on_lan/route.dart index b4e87702..6c656b51 100644 --- a/lib/modules/settings/routes/configuration_wake_on_lan/route.dart +++ b/lib/modules/settings/routes/configuration_wake_on_lan/route.dart @@ -32,7 +32,7 @@ class _State extends State } Widget _body() { - return LunaBox.profiles.watch( + return LunaBox.profiles.listenableBuilder( builder: (context, _) => LunaListView( controller: scrollController, children: [ diff --git a/lib/modules/settings/routes/notifications/route.dart b/lib/modules/settings/routes/notifications/route.dart index c3672539..4a7b20bb 100644 --- a/lib/modules/settings/routes/notifications/route.dart +++ b/lib/modules/settings/routes/notifications/route.dart @@ -69,7 +69,7 @@ class _State extends State with LunaScrollControllerMixin { const db = LunaSeaDatabase.ENABLE_IN_APP_NOTIFICATIONS; return LunaBlock( title: 'settings.EnableInAppNotifications'.tr(), - trailing: db.watch( + trailing: db.listenableBuilder( builder: (context, _) => LunaSwitch( value: db.read(), onChanged: db.update, diff --git a/lib/modules/settings/routes/profiles/route.dart b/lib/modules/settings/routes/profiles/route.dart index 0364df3f..be4c91d2 100644 --- a/lib/modules/settings/routes/profiles/route.dart +++ b/lib/modules/settings/routes/profiles/route.dart @@ -112,7 +112,7 @@ class _State extends State with LunaScrollControllerMixin { Widget _enabledProfile() { const db = LunaSeaDatabase.ENABLED_PROFILE; - return db.watch( + return db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.EnabledProfile'.tr(), body: [TextSpan(text: db.read())], diff --git a/lib/modules/settings/routes/system_logs/pages/log_details.dart b/lib/modules/settings/routes/system_logs/pages/log_details.dart index 8bbfb034..4563ea45 100644 --- a/lib/modules/settings/routes/system_logs/pages/log_details.dart +++ b/lib/modules/settings/routes/system_logs/pages/log_details.dart @@ -37,7 +37,7 @@ class _State extends State } Widget _body() { - return LunaBox.logs.watch(builder: (context, _) { + return LunaBox.logs.listenableBuilder(builder: (context, _) { List logs = filter(); if (logs.isEmpty) { return LunaMessage.goBack( diff --git a/lib/modules/settings/routes/system_logs/route.dart b/lib/modules/settings/routes/system_logs/route.dart index 7bf255f4..f2d6f04f 100644 --- a/lib/modules/settings/routes/system_logs/route.dart +++ b/lib/modules/settings/routes/system_logs/route.dart @@ -81,7 +81,7 @@ class _State extends State with LunaScrollControllerMixin { Widget _sentryLogging() { const db = BIOSDatabase.SENTRY_LOGGING; - return db.watch( + return db.listenableBuilder( builder: (context, _) => LunaBlock( title: 'settings.SentryLogging'.tr(), body: [TextSpan(text: 'settings.SentryLoggingDescription'.tr())], diff --git a/lib/modules/sonarr/core/dialogs.dart b/lib/modules/sonarr/core/dialogs.dart index 4f0e6195..da3c7a5c 100644 --- a/lib/modules/sonarr/core/dialogs.dart +++ b/lib/modules/sonarr/core/dialogs.dart @@ -557,7 +557,7 @@ class SonarrDialogs { ), ], content: [ - SonarrDatabase.REMOVE_SERIES_EXCLUSION_LIST.watch( + SonarrDatabase.REMOVE_SERIES_EXCLUSION_LIST.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.AddToExclusionList'.tr(), value: SonarrDatabase.REMOVE_SERIES_EXCLUSION_LIST.read(), @@ -565,7 +565,7 @@ class SonarrDialogs { SonarrDatabase.REMOVE_SERIES_EXCLUSION_LIST.update(value!), ), ), - SonarrDatabase.REMOVE_SERIES_DELETE_FILES.watch( + SonarrDatabase.REMOVE_SERIES_DELETE_FILES.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.DeleteFiles'.tr(), value: SonarrDatabase.REMOVE_SERIES_DELETE_FILES.read(), @@ -591,7 +591,7 @@ class SonarrDialogs { ], showCancelButton: false, content: [ - SonarrDatabase.ADD_SERIES_SEARCH_FOR_MISSING.watch( + SonarrDatabase.ADD_SERIES_SEARCH_FOR_MISSING.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.StartSearchForMissingEpisodes'.tr(), value: SonarrDatabase.ADD_SERIES_SEARCH_FOR_MISSING.read(), @@ -599,7 +599,7 @@ class SonarrDialogs { SonarrDatabase.ADD_SERIES_SEARCH_FOR_MISSING.update(value!), ), ), - SonarrDatabase.ADD_SERIES_SEARCH_FOR_CUTOFF_UNMET.watch( + SonarrDatabase.ADD_SERIES_SEARCH_FOR_CUTOFF_UNMET.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.StartSearchForCutoffUnmetEpisodes'.tr(), value: SonarrDatabase.ADD_SERIES_SEARCH_FOR_CUTOFF_UNMET.read(), @@ -690,7 +690,7 @@ class SonarrDialogs { ), ], content: [ - SonarrDatabase.QUEUE_REMOVE_DOWNLOAD_CLIENT.watch( + SonarrDatabase.QUEUE_REMOVE_DOWNLOAD_CLIENT.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.RemoveFromDownloadClient'.tr(), value: SonarrDatabase.QUEUE_REMOVE_DOWNLOAD_CLIENT.read(), @@ -698,7 +698,7 @@ class SonarrDialogs { SonarrDatabase.QUEUE_REMOVE_DOWNLOAD_CLIENT.update(value!), ), ), - SonarrDatabase.QUEUE_ADD_BLOCKLIST.watch( + SonarrDatabase.QUEUE_ADD_BLOCKLIST.listenableBuilder( builder: (context, _) => LunaDialog.checkbox( title: 'sonarr.AddReleaseToBlocklist'.tr(), value: SonarrDatabase.QUEUE_ADD_BLOCKLIST.read(), diff --git a/lib/state/sabnzbd/api.dart b/lib/state/sabnzbd/api.dart new file mode 100644 index 00000000..41ad1772 --- /dev/null +++ b/lib/state/sabnzbd/api.dart @@ -0,0 +1,27 @@ +import 'package:lunasea/api/sabnzbd/api.dart'; +import 'package:lunasea/database/box.dart'; +import 'package:lunasea/state/sabnzbd/config.dart'; +import 'package:lunasea/vendor.dart'; + +final apiProvider = + Provider.autoDispose.family((ref, uuid) { + final db = ref.watch(configProvider(uuid)); + + // A database update was triggered + if (db.hasValue) { + final config = db.value!; + return SABnzbdAPI( + host: config.host, + apiKey: config.apiKey, + headers: config.headers, + ); + } + + // Initial load + final config = LunaBox.profiles.read(uuid)!; + return SABnzbdAPI( + host: config.sabnzbdHost, + apiKey: config.sabnzbdKey, + headers: config.sabnzbdHeaders, + ); +}); diff --git a/lib/state/sabnzbd/config.dart b/lib/state/sabnzbd/config.dart new file mode 100644 index 00000000..a58f40af --- /dev/null +++ b/lib/state/sabnzbd/config.dart @@ -0,0 +1,32 @@ +import 'package:lunasea/database/box.dart'; +import 'package:lunasea/database/models/profile.dart'; +import 'package:lunasea/vendor.dart'; + +class _DB { + final bool enabled; + final String host; + final String apiKey; + final Map headers; + + _DB( + this.enabled, { + this.host = '', + this.apiKey = '', + this.headers = const {}, + }); +} + +final configProvider = StreamProvider.family<_DB, String>((ref, uuid) async* { + final box = LunaBox.profiles.watch(uuid); + await for (final event in box) { + if (event.deleted) yield _DB(false); + + LunaProfile profile = event.value; + yield _DB( + profile.sabnzbdEnabled, + host: profile.sabnzbdHost, + apiKey: profile.sabnzbdKey, + headers: profile.sabnzbdHeaders, + ); + } +}); diff --git a/lib/system/state.dart b/lib/state/state.dart similarity index 100% rename from lib/system/state.dart rename to lib/state/state.dart diff --git a/lib/system/localization.dart b/lib/system/localization.dart index 9b273742..50ff87a3 100644 --- a/lib/system/localization.dart +++ b/lib/system/localization.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; import 'package:lunasea/system/flavor.dart'; import 'package:lunasea/vendor.dart'; diff --git a/lib/utils/profile_tools.dart b/lib/utils/profile_tools.dart index d0662eb6..f84782a0 100644 --- a/lib/utils/profile_tools.dart +++ b/lib/utils/profile_tools.dart @@ -1,7 +1,7 @@ import 'package:lunasea/database/models/profile.dart'; import 'package:lunasea/database/box.dart'; import 'package:lunasea/database/tables/lunasea.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; import 'package:lunasea/router/router.dart'; import 'package:lunasea/system/logger.dart'; import 'package:lunasea/types/exception.dart'; diff --git a/lib/vendor.dart b/lib/vendor.dart index 1eeb294d..9c212072 100644 --- a/lib/vendor.dart +++ b/lib/vendor.dart @@ -18,6 +18,7 @@ export 'package:json_annotation/json_annotation.dart'; export 'package:meta/meta.dart'; export 'package:package_info_plus/package_info_plus.dart'; export 'package:provider/provider.dart' show ReadContext, WatchContext; +export 'package:retrofit/retrofit.dart' hide Headers; export 'package:stash/stash_api.dart'; export 'package:stash_memory/stash_memory.dart'; export 'package:supercharged/supercharged.dart'; diff --git a/lib/widgets/sheets/changelog/sheet.dart b/lib/widgets/sheets/changelog/sheet.dart index 657736df..6aeb07e8 100644 --- a/lib/widgets/sheets/changelog/sheet.dart +++ b/lib/widgets/sheets/changelog/sheet.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; import 'package:lunasea/extensions/string/string.dart'; import 'package:lunasea/system/build.dart'; import 'package:lunasea/system/environment.dart'; diff --git a/lib/widgets/ui/bottom_modal_sheet.dart b/lib/widgets/ui/bottom_modal_sheet.dart index a4f6d8e4..313da5eb 100644 --- a/lib/widgets/ui/bottom_modal_sheet.dart +++ b/lib/widgets/ui/bottom_modal_sheet.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; import 'package:lunasea/widgets/ui.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; diff --git a/lib/widgets/ui/button.dart b/lib/widgets/ui/button.dart index 7690a638..378c6998 100644 --- a/lib/widgets/ui/button.dart +++ b/lib/widgets/ui/button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:lunasea/system/state.dart'; +import 'package:lunasea/state/state.dart'; import 'package:lunasea/types/loading_state.dart'; import 'package:lunasea/widgets/ui.dart'; diff --git a/lib/widgets/ui/drawer/drawer.dart b/lib/widgets/ui/drawer/drawer.dart index 7c0649bf..0bad8fef 100644 --- a/lib/widgets/ui/drawer/drawer.dart +++ b/lib/widgets/ui/drawer/drawer.dart @@ -34,12 +34,12 @@ class LunaDrawer extends StatelessWidget { @override Widget build(BuildContext context) { - return LunaSeaDatabase.ENABLED_PROFILE.watch( - builder: (context, _) => LunaBox.indexers.watch( + return LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder( + builder: (context, _) => LunaBox.indexers.listenableBuilder( builder: (context, _) => Drawer( elevation: LunaUI.ELEVATION, backgroundColor: Theme.of(context).primaryColor, - child: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.watch( + child: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.listenableBuilder( builder: (context, _) => Column( children: [ LunaDrawerHeader(page: page), diff --git a/lib/widgets/ui/drawer/drawer_header.dart b/lib/widgets/ui/drawer/drawer_header.dart index fc24489a..246fa842 100644 --- a/lib/widgets/ui/drawer/drawer_header.dart +++ b/lib/widgets/ui/drawer/drawer_header.dart @@ -11,7 +11,7 @@ class LunaDrawerHeader extends StatelessWidget { @override Widget build(BuildContext context) { - return LunaSeaDatabase.ENABLED_PROFILE.watch( + return LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder( builder: (context, _) => Container( child: LunaAppBar.dropdown( backgroundColor: Colors.transparent, diff --git a/lib/widgets/ui/scaffold.dart b/lib/widgets/ui/scaffold.dart index e747add6..5fa9ed21 100644 --- a/lib/widgets/ui/scaffold.dart +++ b/lib/widgets/ui/scaffold.dart @@ -52,7 +52,7 @@ class LunaScaffold extends StatelessWidget { } Widget get scaffold { - return LunaSeaDatabase.ENABLED_PROFILE.watch( + return LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder( builder: (context, _) { onProfileChange?.call(context); return Scaffold(