chore(api): create stub APIs for remaining modules (#707)

This commit is contained in:
Jagandeep Brar
2022-09-22 09:28:17 -04:00
committed by GitHub
parent a6be658164
commit af83820b85
80 changed files with 396 additions and 149 deletions

View File

@@ -2,6 +2,8 @@ include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- 'test/**'
- 'test.g.dart'
- 'lib/**/*.g.dart'
linter:
rules:

27
lib/api/lidarr/api.dart Normal file
View File

@@ -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<String, dynamic> headers = const {},
}) {
Dio dio = Dio(BaseOptions(
headers: headers,
followRedirects: true,
maxRedirects: 5,
queryParameters: {
if (apiKey.isNotEmpty) 'apikey': apiKey,
},
));
return _LidarrAPI(dio, baseUrl: _baseUrl(host));
}
}

69
lib/api/nzbget/api.dart Normal file
View File

@@ -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<String, dynamic> 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<NZBGetVersion> getVersion({
@Query('method') String method = 'version',
});
@POST('')
Future<NZBGetStatus> getStatus({
@Query('method') String method = 'status',
});
}

View File

@@ -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<String, dynamic> json) {
return _$NZBGetStatusFromJson(json);
}
Map<String, dynamic> toJson() {
return _$NZBGetStatusToJson(this);
}
}

View File

@@ -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<String, dynamic> json) {
return _$NZBGetVersionFromJson(json);
}
Map<String, dynamic> toJson() {
return _$NZBGetVersionToJson(this);
}
}

View File

@@ -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 {

View File

@@ -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<String, dynamic> 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('')

View File

@@ -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<SABnzbdHistorySlot> 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<String, dynamic> json) {
factory _SABnzbdHistoryResult.fromJson(Map<String, dynamic> 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<SABnzbdStageLog> 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<String, dynamic> json) {
factory _SABnzbdHistorySlot.fromJson(Map<String, dynamic> json) {
return _$SABnzbdHistorySlotFromJson(json);
}

View File

@@ -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<SABnzbdQueueSlot> 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<String, dynamic> json) {
factory _SABnzbdQueueResult.fromJson(Map<String, dynamic> 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<String, dynamic> json) {
factory _SABnzbdQueueSlot.fromJson(Map<String, dynamic> json) {
return _$SABnzbdQueueSlotFromJson(json);
}

View File

@@ -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<String, dynamic> json) {
factory _SABnzbdStatusResult.fromJson(Map<String, dynamic> json) {
return _$SABnzbdStatusResultFromJson(json);
}

View File

@@ -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';

View File

@@ -63,11 +63,15 @@ enum LunaBox<T> {
return Hive.openBox<T>(key);
}
Stream<BoxEvent> watch([dynamic key]) {
return _instance.watch(key: key);
}
ValueListenable<Box<T>> listenable([List<dynamic>? keys]) {
return _instance.listenable(keys: keys);
}
ValueListenableBuilder watch({
ValueListenableBuilder listenableBuilder({
required Widget Function(BuildContext, Widget?) builder,
List<dynamic>? selectKeys,
List<LunaTableMixin>? selectItems,

View File

@@ -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<T extends LunaTableMixin> {
bios<BIOSDatabase>('bios', items: BIOSDatabase.values),
@@ -94,12 +95,16 @@ mixin LunaTableMixin<T> on Enum {
return update(value as T);
}
ValueListenableBuilder watch({
Stream<BoxEvent> 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),

View File

@@ -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;
}
}

View File

@@ -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,

View File

@@ -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)) {

View File

@@ -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() {

View File

@@ -53,7 +53,7 @@ class _State extends State<DashboardRoute> {
}
Widget _body() {
return LunaSeaDatabase.ENABLED_PROFILE.watch(
return LunaSeaDatabase.ENABLED_PROFILE.listenableBuilder(
builder: (context, _) => LunaPageView(
controller: _pageController,
children: [

View File

@@ -122,7 +122,7 @@ class _State extends State<CalendarView> {
}
Widget _calendar() {
return LunaBox.lunasea.watch(
return LunaBox.lunasea.listenableBuilder(
selectItems: [
DashboardDatabase.CALENDAR_STARTING_DAY,
DashboardDatabase.CALENDAR_STARTING_SIZE,

View File

@@ -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(),

View File

@@ -165,7 +165,7 @@ class _State extends State<AddArtistDetailsRoute>
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<AddArtistDetailsRoute>
);
},
),
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<AddArtistDetailsRoute>
},
);
}),
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<AddArtistDetailsRoute>
);
},
),
LidarrDatabase.ADD_METADATA_PROFILE.watch(
LidarrDatabase.ADD_METADATA_PROFILE.listenableBuilder(
builder: (context, _) {
final _profile = LidarrDatabase.ADD_METADATA_PROFILE.read();
return LunaBlock(

View File

@@ -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';

View File

@@ -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(),

View File

@@ -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

View File

@@ -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(

View File

@@ -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!)

View File

@@ -53,7 +53,7 @@ class _State extends State<SettingsHeaderRoute> with LunaScrollControllerMixin {
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -36,7 +36,7 @@ class _State extends State<ConfigurationRoute> with LunaScrollControllerMixin {
}
Widget _enabledProfile() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) {
if (LunaBox.profiles.size < 2) return const SizedBox();
return LunaIconButton(

View File

@@ -44,7 +44,7 @@ class _State extends State<ConfigurationAppearanceRoute>
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<ConfigurationAppearanceRoute>
}
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<ConfigurationAppearanceRoute>
Widget _imageBackgroundOpacity() {
const _db = LunaSeaDatabase.THEME_IMAGE_BACKGROUND_OPACITY;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'settings.BackgroundImageOpacity'.tr(),
body: [

View File

@@ -60,7 +60,7 @@ class _State extends State<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
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<ConfigurationDashboardCalendarRoute>
Widget _startingSize() {
const _db = DashboardDatabase.CALENDAR_STARTING_SIZE;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'settings.StartingSize'.tr(),
body: [

View File

@@ -45,7 +45,7 @@ class _State extends State<ConfigurationDashboardDefaultPagesRoute>
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()])],

View File

@@ -46,7 +46,7 @@ class _State extends State<ConfigurationDrawerRoute>
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<ConfigurationDrawerRoute>
}
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(),

View File

@@ -68,7 +68,7 @@ class _State extends State<ConfigurationExternalModulesEditRoute>
}
Widget _body() {
return LunaBox.externalModules.watch(
return LunaBox.externalModules.listenableBuilder(
selectKeys: [widget.moduleId],
builder: (context, dynamic _) {
if (!LunaBox.externalModules.contains(widget.moduleId))

View File

@@ -46,7 +46,7 @@ class _State extends State<ConfigurationExternalModulesRoute>
}
Widget _body() {
return LunaBox.externalModules.watch(
return LunaBox.externalModules.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationLidarrConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -42,7 +42,7 @@ class _State extends State<ConfigurationLidarrDefaultPagesRoute>
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()])],

View File

@@ -47,7 +47,7 @@ class _State extends State<ConfigurationLidarrRoute>
}
Widget _enabledToggle() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'settings.EnableModule'.tr(args: [LunaModule.LIDARR.title]),
trailing: LunaSwitch(

View File

@@ -57,7 +57,7 @@ class _State extends State<ConfigurationLocalizationRoute>
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())],

View File

@@ -42,7 +42,7 @@ class _State extends State<ConfigurationNetworkRoute>
Widget _useTLSValidation() {
const _db = LunaSeaDatabase.NETWORKING_TLS_VALIDATION;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'settings.TLSCertificateValidation'.tr(),
body: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationNZBGetConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationNZBGetDefaultPagesRoute>
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()])],

View File

@@ -47,7 +47,7 @@ class _State extends State<ConfigurationNZBGetRoute>
}
Widget _enabledToggle() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'settings.EnableModule'.tr(args: [LunaModule.NZBGET.title]),
trailing: LunaSwitch(

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationOverseerrConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -44,7 +44,7 @@ class _State extends State<ConfigurationOverseerrRoute>
}
Widget _enabledToggle() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.OVERSEERR.title}',
trailing: LunaSwitch(

View File

@@ -77,7 +77,7 @@ class _State extends State<ConfigurationQuickActionsRoute>
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(),

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationRadarrConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -52,7 +52,7 @@ class _State extends State<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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<ConfigurationRadarrDefaultOptionsRoute>
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)],

View File

@@ -45,7 +45,7 @@ class _State extends State<ConfigurationRadarrDefaultPagesRoute>
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<ConfigurationRadarrDefaultPagesRoute>
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<ConfigurationRadarrDefaultPagesRoute>
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<ConfigurationRadarrDefaultPagesRoute>
Widget _systemStatusPage() {
const _db = RadarrDatabase.NAVIGATION_INDEX_SYSTEM_STATUS;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'System Status',
body: [

View File

@@ -49,7 +49,7 @@ class _State extends State<ConfigurationRadarrRoute>
}
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<ConfigurationRadarrRoute>
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<ConfigurationRadarrRoute>
Widget _queueSize() {
const _db = RadarrDatabase.QUEUE_PAGE_SIZE;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Queue Size',
body: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationSABnzbdConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationSABnzbdDefaultPagesRoute>
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()])],

View File

@@ -47,7 +47,7 @@ class _State extends State<ConfigurationSABnzbdRoute>
}
Widget _enabledToggle() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.SABNZBD.title}',
trailing: LunaSwitch(

View File

@@ -67,7 +67,7 @@ class _State extends State<ConfigurationSearchEditIndexerRoute>
}
Widget _body() {
return LunaBox.indexers.watch(
return LunaBox.indexers.listenableBuilder(
selectKeys: [widget.id],
builder: (context, _) {
if (!LunaBox.indexers.contains(widget.id)) return Container();

View File

@@ -59,7 +59,7 @@ class _State extends State<ConfigurationSearchEditIndexerHeadersRoute>
}
Widget _body() {
return LunaBox.indexers.watch(
return LunaBox.indexers.listenableBuilder(
selectKeys: [widget.id],
builder: (context, _) {
if (!LunaBox.indexers.contains(widget.id)) return Container();

View File

@@ -47,7 +47,7 @@ class _State extends State<ConfigurationSearchRoute>
}
Widget _body() {
return LunaBox.indexers.watch(
return LunaBox.indexers.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [
@@ -101,7 +101,7 @@ class _State extends State<ConfigurationSearchRoute>
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<ConfigurationSearchRoute>
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')],

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationSonarrConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -52,7 +52,7 @@ class _State extends State<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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<ConfigurationSonarrDefaultOptionsRoute>
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)],

View File

@@ -44,7 +44,7 @@ class _State extends State<ConfigurationSonarrDefaultPagesRoute>
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<ConfigurationSonarrDefaultPagesRoute>
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<ConfigurationSonarrDefaultPagesRoute>
Widget _seasonDetailsPage() {
const _db = SonarrDatabase.NAVIGATION_INDEX_SEASON_DETAILS;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) {
return LunaBlock(
title: 'sonarr.SeasonDetails'.tr(),

View File

@@ -48,7 +48,7 @@ class _State extends State<ConfigurationSonarrRoute>
}
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<ConfigurationSonarrRoute>
Widget _queueSize() {
const _db = SonarrDatabase.QUEUE_PAGE_SIZE;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Queue Size',
body: [

View File

@@ -43,7 +43,7 @@ class _State extends State<ConfigurationTautulliConnectionDetailsRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -46,7 +46,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
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<ConfigurationTautulliDefaultPagesRoute>
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<ConfigurationTautulliDefaultPagesRoute>
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<ConfigurationTautulliDefaultPagesRoute>
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<ConfigurationTautulliDefaultPagesRoute>
Widget _userDetailsPage() {
const _db = TautulliDatabase.NAVIGATION_INDEX_USER_DETAILS;
return _db.watch(
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'User Details',
body: [

View File

@@ -49,7 +49,7 @@ class _State extends State<ConfigurationTautulliRoute>
}
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<ConfigurationTautulliRoute>
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<ConfigurationTautulliRoute>
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<ConfigurationTautulliRoute>
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';

View File

@@ -32,7 +32,7 @@ class _State extends State<ConfigurationWakeOnLANRoute>
}
Widget _body() {
return LunaBox.profiles.watch(
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaListView(
controller: scrollController,
children: [

View File

@@ -69,7 +69,7 @@ class _State extends State<NotificationsRoute> 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,

View File

@@ -112,7 +112,7 @@ class _State extends State<ProfilesRoute> 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())],

View File

@@ -37,7 +37,7 @@ class _State extends State<SystemLogsDetailsRoute>
}
Widget _body() {
return LunaBox.logs.watch(builder: (context, _) {
return LunaBox.logs.listenableBuilder(builder: (context, _) {
List<LunaLog> logs = filter();
if (logs.isEmpty) {
return LunaMessage.goBack(

View File

@@ -81,7 +81,7 @@ class _State extends State<SystemLogsRoute> 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())],

View File

@@ -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(),

View File

@@ -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<SABnzbdAPI, String>((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,
);
});

View File

@@ -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<String, String> 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,
);
}
});

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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),

View File

@@ -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,

View File

@@ -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(