diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 68349dda..f3b063d0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - cloud_firestore (3.1.16): + - cloud_firestore (3.1.17): - Firebase/Firestore (= 8.15.0) - firebase_core - Flutter @@ -51,18 +51,18 @@ PODS: - Firebase/Storage (8.15.0): - Firebase/CoreOnly - FirebaseStorage (~> 8.15.0) - - firebase_auth (3.3.18): + - firebase_auth (3.3.19): - Firebase/Auth (= 8.15.0) - firebase_core - Flutter - - firebase_core (1.17.0): + - firebase_core (1.17.1): - Firebase/CoreOnly (= 8.15.0) - Flutter - - firebase_messaging (11.4.0): + - firebase_messaging (11.4.1): - Firebase/Messaging (= 8.15.0) - firebase_core - Flutter - - firebase_storage (10.2.16): + - firebase_storage (10.2.17): - Firebase/Storage (= 8.15.0) - firebase_core - Flutter @@ -244,15 +244,15 @@ CHECKOUT OPTIONS: :tag: 8.15.0 SPEC CHECKSUMS: - cloud_firestore: c85ca781dc18eed0b05c90973b4b030e6802acc4 + cloud_firestore: 936969669b510f2affd43583582d7b117c5f08d1 DKImagePickerController: 72fd378f244cef3d27288e0aebf217a4467e4012 DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 + file_picker: 817ab1d8cd2da9d2da412a417162deee3500fc95 Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d - firebase_auth: ace975b530600827bd901a9a18584f7cdaf6d160 - firebase_core: aa1b92020533f5c23955e388c347c58fd64f8627 - firebase_messaging: 8957bf304b47daf8bf12d0b111fdecc5b33e77a3 - firebase_storage: 9708f24db0c21dadf7e5494f27406326c0d4ab53 + firebase_auth: a6470a6974d42f83117932c913aecb926182f907 + firebase_core: 318de541b0e61d3f24262982a3f0b54afe72439b + firebase_messaging: 943cfe65e0b3f457240489ce67655e40da1d270c + firebase_storage: b079dbfa7ef016051b6f95315a7002012fda9984 FirebaseAuth: 3e73bf8abf4fbb40f8b421f361f4cc48ee57388c FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1 FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb diff --git a/lib/core.dart b/lib/core.dart index 227f6926..58016650 100644 --- a/lib/core.dart +++ b/lib/core.dart @@ -2,7 +2,6 @@ export 'core/cache.dart'; export 'core/dialogs.dart'; export 'core/extensions.dart'; export 'core/models.dart'; -export 'core/modules.dart'; export 'core/pages.dart'; export 'core/router.dart'; export 'core/services.dart'; @@ -14,6 +13,7 @@ export 'database/box.dart'; export 'database/tables/lunasea.dart'; export 'system/logger.dart'; export 'widgets/ui.dart'; +export 'modules.dart'; export 'vendor.dart' hide StreamProvider, diff --git a/lib/core/state/state.dart b/lib/core/state/state.dart index 5a005ea9..9f0d419c 100644 --- a/lib/core/state/state.dart +++ b/lib/core/state/state.dart @@ -10,7 +10,7 @@ import 'package:lunasea/modules/overseerr/core/state.dart'; import 'package:lunasea/modules/sabnzbd/core/state.dart'; import 'package:lunasea/modules/nzbget/core/state.dart'; import 'package:lunasea/modules/tautulli/core/state.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:provider/provider.dart'; diff --git a/lib/database/tables/lunasea.dart b/lib/database/tables/lunasea.dart index db0051d1..7fadf22f 100644 --- a/lib/database/tables/lunasea.dart +++ b/lib/database/tables/lunasea.dart @@ -6,7 +6,7 @@ import 'package:lunasea/core/models/logs/log_type.dart'; import 'package:lunasea/core/models/types/browser.dart'; import 'package:lunasea/core/models/types/indexer_icon.dart'; import 'package:lunasea/core/models/types/list_view_option.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:lunasea/database/table.dart'; import 'package:lunasea/vendor.dart'; import 'package:lunasea/widgets/ui.dart'; @@ -71,14 +71,14 @@ enum LunaSeaDatabase with LunaTableMixin { @override void import(dynamic value) { if (this == LunaSeaDatabase.DEFAULT_LAUNCH_MODULE) { - final item = LunaModule.DASHBOARD.fromKey(value.toString()); + final item = LunaModule.fromKey(value.toString()); if (item != null) update(item as T); return; } if (this == LunaSeaDatabase.DRAWER_MANUAL_ORDER) { List item = []; (value as List).cast().forEach((val) { - LunaModule? module = LunaModule.DASHBOARD.fromKey(val); + LunaModule? module = LunaModule.fromKey(val); if (module != null) item.add(module); }); update(item as T); diff --git a/lib/firebase/messaging.dart b/lib/firebase/messaging.dart index b4bb8612..82a2295d 100644 --- a/lib/firebase/messaging.dart +++ b/lib/firebase/messaging.dart @@ -80,7 +80,7 @@ class LunaFirebaseMessaging { return onMessage.listen((message) { if (LunaSeaDatabase.ENABLE_IN_APP_NOTIFICATIONS.read()) return; - LunaModule? module = LunaModule.DASHBOARD.fromKey(message.data['module']); + LunaModule? module = LunaModule.fromKey(message.data['module']); showLunaSnackBar( title: message.notification?.title ?? 'Unknown Content', message: message.notification?.body ?? LunaUI.TEXT_EMDASH, @@ -112,7 +112,7 @@ class LunaFirebaseMessaging { Future _handleWebhook(RemoteMessage? message) async { if (message == null || message.data.isEmpty) return; // Extract module - LunaModule? module = LunaModule.DASHBOARD.fromKey(message.data['module']); + LunaModule? module = LunaModule.fromKey(message.data['module']); if (module == null) { LunaLogger().warning( 'LunaFirebaseMessaging', diff --git a/lib/core/modules.dart b/lib/modules.dart similarity index 68% rename from lib/core/modules.dart rename to lib/modules.dart index d23798c6..fe1c7586 100644 --- a/lib/core/modules.dart +++ b/lib/modules.dart @@ -23,49 +23,79 @@ import 'package:lunasea/system/flavor.dart'; part 'modules.g.dart'; -const _DASHBOARD_KEY = 'dashboard'; -const _EXTERNAL_MODULES_KEY = 'external_modules'; -const _LIDARR_KEY = 'lidarr'; -const _NZBGET_KEY = 'nzbget'; -const _OVERSEERR_KEY = 'overseerr'; -const _RADARR_KEY = 'radarr'; -const _SABNZBD_KEY = 'sabnzbd'; -const _SEARCH_KEY = 'search'; -const _SETTINGS_KEY = 'settings'; -const _SONARR_KEY = 'sonarr'; -const _TAUTULLI_KEY = 'tautulli'; -const _WAKE_ON_LAN_KEY = 'wake_on_lan'; +const MODULE_DASHBOARD_KEY = 'dashboard'; +const MODULE_EXTERNAL_MODULES_KEY = 'external_modules'; +const MODULE_LIDARR_KEY = 'lidarr'; +const MODULE_NZBGET_KEY = 'nzbget'; +const MODULE_OVERSEERR_KEY = 'overseerr'; +const MODULE_RADARR_KEY = 'radarr'; +const MODULE_SABNZBD_KEY = 'sabnzbd'; +const MODULE_SEARCH_KEY = 'search'; +const MODULE_SETTINGS_KEY = 'settings'; +const MODULE_SONARR_KEY = 'sonarr'; +const MODULE_TAUTULLI_KEY = 'tautulli'; +const MODULE_WAKE_ON_LAN_KEY = 'wake_on_lan'; @HiveType(typeId: 25, adapterName: 'LunaModuleAdapter') enum LunaModule { @HiveField(0) - DASHBOARD, + DASHBOARD(MODULE_DASHBOARD_KEY), @HiveField(11) - EXTERNAL_MODULES, + EXTERNAL_MODULES(MODULE_EXTERNAL_MODULES_KEY), @HiveField(1) - LIDARR, + LIDARR(MODULE_LIDARR_KEY), @HiveField(2) - NZBGET, + NZBGET(MODULE_NZBGET_KEY), @HiveField(3) - OVERSEERR, + OVERSEERR(MODULE_OVERSEERR_KEY), @HiveField(4) - RADARR, + RADARR(MODULE_RADARR_KEY), @HiveField(5) - SABNZBD, + SABNZBD(MODULE_SABNZBD_KEY), @HiveField(6) - SEARCH, + SEARCH(MODULE_SEARCH_KEY), @HiveField(7) - SETTINGS, + SETTINGS(MODULE_SETTINGS_KEY), @HiveField(8) - SONARR, + SONARR(MODULE_SONARR_KEY), @HiveField(9) - TAUTULLI, + TAUTULLI(MODULE_TAUTULLI_KEY), @HiveField(10) - WAKE_ON_LAN; + WAKE_ON_LAN(MODULE_WAKE_ON_LAN_KEY); + + final String key; + const LunaModule(this.key); + + static LunaModule? fromKey(String? key) { + switch (key) { + case MODULE_DASHBOARD_KEY: + return LunaModule.DASHBOARD; + case MODULE_LIDARR_KEY: + return LunaModule.LIDARR; + case MODULE_NZBGET_KEY: + return LunaModule.NZBGET; + case MODULE_RADARR_KEY: + return LunaModule.RADARR; + case MODULE_SABNZBD_KEY: + return LunaModule.SABNZBD; + case MODULE_SEARCH_KEY: + return LunaModule.SEARCH; + case MODULE_SETTINGS_KEY: + return LunaModule.SETTINGS; + case MODULE_SONARR_KEY: + return LunaModule.SONARR; + case MODULE_OVERSEERR_KEY: + return LunaModule.OVERSEERR; + case MODULE_TAUTULLI_KEY: + return LunaModule.TAUTULLI; + case MODULE_WAKE_ON_LAN_KEY: + return LunaModule.WAKE_ON_LAN; + case MODULE_EXTERNAL_MODULES_KEY: + return LunaModule.EXTERNAL_MODULES; + } + return null; + } - /// Returns a list of all system-enabled modules. - /// - /// Internal modules (dashboard, settings, etc.) are removed by default. static List get active { return LunaModule.values.filter((m) { if (m == LunaModule.DASHBOARD) return false; @@ -75,101 +105,18 @@ enum LunaModule { } } -extension LunaModuleExtension on LunaModule { - /// Returns true if the module is enabled at a system/environment level. +extension LunaModuleEnablementExtension on LunaModule { bool get featureFlag { switch (this) { - case LunaModule.DASHBOARD: - return true; - case LunaModule.EXTERNAL_MODULES: - return true; - case LunaModule.LIDARR: - return true; - case LunaModule.NZBGET: - return true; case LunaModule.OVERSEERR: return LunaFlavor.EDGE.isRunningFlavor(); - case LunaModule.RADARR: - return true; - case LunaModule.SABNZBD: - return true; - case LunaModule.SEARCH: - return true; - case LunaModule.SETTINGS: - return true; - case LunaModule.SONARR: - return true; - case LunaModule.TAUTULLI: - return true; case LunaModule.WAKE_ON_LAN: return LunaWakeOnLAN.isSupported; + default: + return true; } } - /// Used to convert a string key back to a [LunaModule] value. - /// - /// If the key is not found, returns null. - LunaModule? fromKey(String? key) { - switch (key) { - case _DASHBOARD_KEY: - return LunaModule.DASHBOARD; - case _LIDARR_KEY: - return LunaModule.LIDARR; - case _NZBGET_KEY: - return LunaModule.NZBGET; - case _RADARR_KEY: - return LunaModule.RADARR; - case _SABNZBD_KEY: - return LunaModule.SABNZBD; - case _SEARCH_KEY: - return LunaModule.SEARCH; - case _SETTINGS_KEY: - return LunaModule.SETTINGS; - case _SONARR_KEY: - return LunaModule.SONARR; - case _OVERSEERR_KEY: - return LunaModule.OVERSEERR; - case _TAUTULLI_KEY: - return LunaModule.TAUTULLI; - case _WAKE_ON_LAN_KEY: - return LunaModule.WAKE_ON_LAN; - case _EXTERNAL_MODULES_KEY: - return LunaModule.EXTERNAL_MODULES; - } - return null; - } - - /// Given a [LunaModule], return the module's key. - String get key { - switch (this) { - case LunaModule.DASHBOARD: - return _DASHBOARD_KEY; - case LunaModule.LIDARR: - return _LIDARR_KEY; - case LunaModule.NZBGET: - return _NZBGET_KEY; - case LunaModule.RADARR: - return _RADARR_KEY; - case LunaModule.SABNZBD: - return _SABNZBD_KEY; - case LunaModule.SEARCH: - return _SEARCH_KEY; - case LunaModule.SETTINGS: - return _SETTINGS_KEY; - case LunaModule.SONARR: - return _SONARR_KEY; - case LunaModule.OVERSEERR: - return _OVERSEERR_KEY; - case LunaModule.TAUTULLI: - return _TAUTULLI_KEY; - case LunaModule.WAKE_ON_LAN: - return _WAKE_ON_LAN_KEY; - case LunaModule.EXTERNAL_MODULES: - return _EXTERNAL_MODULES_KEY; - } - } - - /// Returns true if the module is enabled in the current profile. bool get isEnabled { switch (this) { case LunaModule.DASHBOARD: @@ -198,45 +145,10 @@ extension LunaModuleExtension on LunaModule { return LunaBox.externalModules.box.isNotEmpty; } } +} - /// Fetch the currently loaded configuration for a module. - /// - /// Pulled from the currently loaded profile. - Map get loadedConfiguration { - switch (this) { - case LunaModule.DASHBOARD: - return {}; - case LunaModule.LIDARR: - return LunaProfile.current.getLidarr(); - case LunaModule.NZBGET: - return LunaProfile.current.getNZBGet(); - case LunaModule.OVERSEERR: - return LunaProfile.current.getOverseerr(); - case LunaModule.RADARR: - return LunaProfile.current.getRadarr(); - case LunaModule.SABNZBD: - return LunaProfile.current.getSABnzbd(); - case LunaModule.SEARCH: - return LunaBox.indexers.box - .toMap() - .map((key, value) => MapEntry(key.toString(), value.toMap())); - case LunaModule.SETTINGS: - return {}; - case LunaModule.SONARR: - return LunaProfile.current.getSonarr(); - case LunaModule.TAUTULLI: - return LunaProfile.current.getTautulli(); - case LunaModule.WAKE_ON_LAN: - return LunaProfile.current.getWakeOnLAN(); - case LunaModule.EXTERNAL_MODULES: - return LunaBox.externalModules.box - .toMap() - .map((key, value) => MapEntry(key.toString(), value.toMap())); - } - } - - /// The name of the module. - String get name { +extension LunaModuleMetadataExtension on LunaModule { + String get title { switch (this) { case LunaModule.DASHBOARD: return 'lunasea.Dashboard'.tr(); @@ -265,37 +177,6 @@ extension LunaModuleExtension on LunaModule { } } - /// The full base/home route for the module. - String? get route { - switch (this) { - case LunaModule.DASHBOARD: - return dashboard_home.HomeRouter().route(); - case LunaModule.LIDARR: - return Lidarr.ROUTE_NAME; - case LunaModule.NZBGET: - return NZBGet.ROUTE_NAME; - case LunaModule.RADARR: - return RadarrHomeRouter().route(); - case LunaModule.SABNZBD: - return SABnzbd.ROUTE_NAME; - case LunaModule.SEARCH: - return SearchHomeRouter().route(); - case LunaModule.SETTINGS: - return SettingsHomeRouter().route(); - case LunaModule.SONARR: - return SonarrHomeRouter().route(); - case LunaModule.TAUTULLI: - return TautulliHomeRouter().route(); - case LunaModule.OVERSEERR: - return OverseerrHomeRouter().route(); - case LunaModule.WAKE_ON_LAN: - return null; - case LunaModule.EXTERNAL_MODULES: - return ExternalModulesHomeRouter().route(); - } - } - - /// The module's icon. IconData get icon { switch (this) { case LunaModule.DASHBOARD: @@ -325,37 +206,6 @@ extension LunaModuleExtension on LunaModule { } } - /// The global provider/state for the module. - LunaModuleState? state(BuildContext context) { - switch (this) { - case LunaModule.WAKE_ON_LAN: - return null; - case LunaModule.DASHBOARD: - return context.read(); - case LunaModule.SETTINGS: - return context.read(); - case LunaModule.SEARCH: - return context.read(); - case LunaModule.LIDARR: - return context.read(); - case LunaModule.RADARR: - return context.read(); - case LunaModule.SONARR: - return context.read(); - case LunaModule.NZBGET: - return context.read(); - case LunaModule.SABNZBD: - return context.read(); - case LunaModule.OVERSEERR: - return context.read(); - case LunaModule.TAUTULLI: - return context.read(); - case LunaModule.EXTERNAL_MODULES: - return null; - } - } - - /// The module's brand colour. Color get color { switch (this) { case LunaModule.DASHBOARD: @@ -385,7 +235,6 @@ extension LunaModuleExtension on LunaModule { } } - /// If available, the module's website. String? get website { switch (this) { case LunaModule.DASHBOARD: @@ -415,7 +264,6 @@ extension LunaModuleExtension on LunaModule { } } - /// If available, link to the module's GitHub repository. String? get github { switch (this) { case LunaModule.DASHBOARD: @@ -445,7 +293,6 @@ extension LunaModuleExtension on LunaModule { } } - /// Description of the module, to be used in the module list. String get description { switch (this) { case LunaModule.DASHBOARD: @@ -475,9 +322,6 @@ extension LunaModuleExtension on LunaModule { } } - /// Return the description/information for the module. - /// - /// This is the full information, copied from each module's website/GitHub. String? get information { switch (this) { case LunaModule.DASHBOARD: @@ -506,164 +350,39 @@ extension LunaModuleExtension on LunaModule { return 'LunaSea allows you to add links to additional modules that are not currently supported allowing you to open the module\'s web GUI without having to leave LunaSea!'; } } +} - /// Return the [ShortcutItem] for the module. - ShortcutItem get shortcutItem { +extension LunaModuleRoutingExtension on LunaModule { + String? get homeRoute { switch (this) { case LunaModule.DASHBOARD: - return ShortcutItem(type: key, localizedTitle: name); + return dashboard_home.HomeRouter().route(); case LunaModule.LIDARR: - return ShortcutItem(type: key, localizedTitle: name); + return Lidarr.ROUTE_NAME; case LunaModule.NZBGET: - return ShortcutItem(type: key, localizedTitle: name); + return NZBGet.ROUTE_NAME; case LunaModule.RADARR: - return ShortcutItem(type: key, localizedTitle: name); + return RadarrHomeRouter().route(); case LunaModule.SABNZBD: - return ShortcutItem(type: key, localizedTitle: name); + return SABnzbd.ROUTE_NAME; case LunaModule.SEARCH: - return ShortcutItem(type: key, localizedTitle: name); + return SearchHomeRouter().route(); case LunaModule.SETTINGS: - return ShortcutItem(type: key, localizedTitle: name); + return SettingsHomeRouter().route(); case LunaModule.SONARR: - return ShortcutItem(type: key, localizedTitle: name); + return SonarrHomeRouter().route(); case LunaModule.TAUTULLI: - return ShortcutItem(type: key, localizedTitle: name); + return TautulliHomeRouter().route(); case LunaModule.OVERSEERR: - return ShortcutItem(type: key, localizedTitle: name); + return OverseerrHomeRouter().route(); case LunaModule.WAKE_ON_LAN: - throw Exception('WAKE_ON_LAN does not have a shortcut item'); + return null; case LunaModule.EXTERNAL_MODULES: - return ShortcutItem(type: key, localizedTitle: name); + return ExternalModulesHomeRouter().route(); } } - /// Returns true if the module has a webhook handler available. - bool get hasWebhooks { - switch (this) { - case LunaModule.DASHBOARD: - return false; - case LunaModule.LIDARR: - return true; - case LunaModule.NZBGET: - return false; - case LunaModule.RADARR: - return true; - case LunaModule.SABNZBD: - return false; - case LunaModule.SEARCH: - return false; - case LunaModule.SETTINGS: - return false; - case LunaModule.SONARR: - return true; - case LunaModule.OVERSEERR: - return true; - case LunaModule.TAUTULLI: - return true; - case LunaModule.WAKE_ON_LAN: - return false; - case LunaModule.EXTERNAL_MODULES: - return false; - } - } - - Widget informationBanner() { - String key = 'LUNASEA_MODULE_INFORMATION_${this.key}'; - void markSeen() => LunaBox.alerts.box.put(key, false); - - return ValueListenableBuilder( - valueListenable: LunaBox.alerts.box.listenable(keys: [key]), - builder: (context, dynamic box, _) { - if (LunaBox.alerts.box.get(key, defaultValue: true)) { - return LunaBanner( - dismissCallback: markSeen, - headerText: this.name, - bodyText: this.information, - icon: this.icon, - iconColor: this.color, - buttons: [ - if (this.github != null) - LunaButton.text( - text: 'GitHub', - icon: LunaIcons.GITHUB, - onTap: this.github!.openLink, - ), - if (this.website != null) - LunaButton.text( - text: 'lunasea.Website'.tr(), - icon: Icons.home_rounded, - onTap: this.website!.openLink, - ), - ], - ); - } - return const SizedBox(height: 0.0, width: double.infinity); - }, - ); - } - - /// Clears/hides all banners for the module. - void hideAllBanners() { - switch (this) { - case LunaModule.DASHBOARD: - return; - case LunaModule.LIDARR: - return; - case LunaModule.NZBGET: - return; - case LunaModule.RADARR: - return; - case LunaModule.SABNZBD: - return; - case LunaModule.SEARCH: - return; - case LunaModule.SETTINGS: - return SettingsBanners.values.forEach((banner) => banner.markSeen()); - case LunaModule.SONARR: - return; - case LunaModule.TAUTULLI: - return; - case LunaModule.OVERSEERR: - return; - case LunaModule.WAKE_ON_LAN: - return; - case LunaModule.EXTERNAL_MODULES: - return; - } - } - - /// Execute and handle the webhook for the module. - Future handleWebhook(Map data) async { - switch (this) { - case LunaModule.DASHBOARD: - return; - case LunaModule.LIDARR: - return LidarrWebhooks().handle(data); - case LunaModule.NZBGET: - return; - case LunaModule.RADARR: - return RadarrWebhooks().handle(data); - case LunaModule.SABNZBD: - return; - case LunaModule.SEARCH: - return; - case LunaModule.SETTINGS: - return; - case LunaModule.SONARR: - return SonarrWebhooks().handle(data); - case LunaModule.OVERSEERR: - return OverseerrWebhooks().handle(data); - case LunaModule.TAUTULLI: - return TautulliWebhooks().handle(data); - case LunaModule.WAKE_ON_LAN: - return; - case LunaModule.EXTERNAL_MODULES: - return; - } - } - - /// Return the [SettingsPageRouter] for the module. - SettingsPageRouter? get settingsPage { + SettingsPageRouter? get settingsRoute { switch (this) { case LunaModule.DASHBOARD: return SettingsConfigurationDashboardRouter(); @@ -693,11 +412,120 @@ extension LunaModuleExtension on LunaModule { } Future launch() async { - if (route != null) { + if (homeRoute != null) { LunaState.navigatorKey.currentState?.pushNamedAndRemoveUntil( - route!, + homeRoute!, (Route route) => false, ); } } } + +extension LunaModuleWebhookExtension on LunaModule { + bool get hasWebhooks { + switch (this) { + case LunaModule.LIDARR: + return true; + case LunaModule.RADARR: + return true; + case LunaModule.SONARR: + return true; + case LunaModule.OVERSEERR: + return true; + case LunaModule.TAUTULLI: + return true; + default: + return false; + } + } + + Future handleWebhook(Map data) async { + switch (this) { + case LunaModule.LIDARR: + return LidarrWebhooks().handle(data); + case LunaModule.RADARR: + return RadarrWebhooks().handle(data); + case LunaModule.SONARR: + return SonarrWebhooks().handle(data); + case LunaModule.OVERSEERR: + return OverseerrWebhooks().handle(data); + case LunaModule.TAUTULLI: + return TautulliWebhooks().handle(data); + default: + return; + } + } +} + +extension LunaModuleExtension on LunaModule { + ShortcutItem get shortcutItem { + if (this == LunaModule.WAKE_ON_LAN) { + throw Exception('WAKE_ON_LAN does not have a shortcut item'); + } + return ShortcutItem(type: key, localizedTitle: title); + } + + LunaModuleState? state(BuildContext context) { + switch (this) { + case LunaModule.WAKE_ON_LAN: + return null; + case LunaModule.DASHBOARD: + return context.read(); + case LunaModule.SETTINGS: + return context.read(); + case LunaModule.SEARCH: + return context.read(); + case LunaModule.LIDARR: + return context.read(); + case LunaModule.RADARR: + return context.read(); + case LunaModule.SONARR: + return context.read(); + case LunaModule.NZBGET: + return context.read(); + case LunaModule.SABNZBD: + return context.read(); + case LunaModule.OVERSEERR: + return context.read(); + case LunaModule.TAUTULLI: + return context.read(); + case LunaModule.EXTERNAL_MODULES: + return null; + } + } + + Widget informationBanner() { + String key = 'LUNASEA_MODULE_INFORMATION_${this.key}'; + void markSeen() => LunaBox.alerts.box.put(key, false); + + return ValueListenableBuilder( + valueListenable: LunaBox.alerts.box.listenable(keys: [key]), + builder: (context, dynamic box, _) { + if (LunaBox.alerts.box.get(key, defaultValue: true)) { + return LunaBanner( + dismissCallback: markSeen, + headerText: this.title, + bodyText: this.information, + icon: this.icon, + iconColor: this.color, + buttons: [ + if (this.github != null) + LunaButton.text( + text: 'GitHub', + icon: LunaIcons.GITHUB, + onTap: this.github!.openLink, + ), + if (this.website != null) + LunaButton.text( + text: 'lunasea.Website'.tr(), + icon: Icons.home_rounded, + onTap: this.website!.openLink, + ), + ], + ); + } + return const SizedBox(height: 0.0, width: double.infinity); + }, + ); + } +} diff --git a/lib/modules/dashboard/routes/dashboard/pages/modules.dart b/lib/modules/dashboard/routes/dashboard/pages/modules.dart index 122b6bb5..3ce18ec0 100644 --- a/lib/modules/dashboard/routes/dashboard/pages/modules.dart +++ b/lib/modules/dashboard/routes/dashboard/pages/modules.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:lunasea/core/system/profile.dart'; import 'package:lunasea/database/tables/lunasea.dart'; import 'package:lunasea/widgets/ui.dart'; @@ -47,8 +47,8 @@ class _State extends State with AutomaticKeepAliveClientMixin { List modules = []; int index = 0; LunaModule.active - ..sort((a, b) => a.name.toLowerCase().compareTo( - b.name.toLowerCase(), + ..sort((a, b) => a.title.toLowerCase().compareTo( + b.title.toLowerCase(), )) ..forEach((module) { if (module.isEnabled) { @@ -83,7 +83,7 @@ class _State extends State with AutomaticKeepAliveClientMixin { Widget _buildFromLunaModule(LunaModule module, int listIndex) { return LunaBlock( - title: module.name, + title: module.title, body: [TextSpan(text: module.description)], trailing: LunaIconButton(icon: module.icon, color: module.color), onTap: module.launch, @@ -92,7 +92,7 @@ class _State extends State with AutomaticKeepAliveClientMixin { Widget _buildWakeOnLAN(BuildContext context, int listIndex) { return LunaBlock( - title: LunaModule.WAKE_ON_LAN.name, + title: LunaModule.WAKE_ON_LAN.title, body: [TextSpan(text: LunaModule.WAKE_ON_LAN.description)], trailing: LunaIconButton( icon: LunaModule.WAKE_ON_LAN.icon, diff --git a/lib/modules/dashboard/routes/dashboard/route.dart b/lib/modules/dashboard/routes/dashboard/route.dart index 749667f8..f70eeea6 100644 --- a/lib/modules/dashboard/routes/dashboard/route.dart +++ b/lib/modules/dashboard/routes/dashboard/route.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:lunasea/database/tables/dashboard.dart'; import 'package:lunasea/database/tables/lunasea.dart'; import 'package:lunasea/widgets/ui.dart'; diff --git a/lib/modules/external_modules/routes/external_modules/route.dart b/lib/modules/external_modules/routes/external_modules/route.dart index 03c1cc69..224bcfa1 100644 --- a/lib/modules/external_modules/routes/external_modules/route.dart +++ b/lib/modules/external_modules/routes/external_modules/route.dart @@ -36,7 +36,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( useDrawer: true, - title: LunaModule.EXTERNAL_MODULES.name, + title: LunaModule.EXTERNAL_MODULES.title, scrollControllers: [scrollController], ); } @@ -47,7 +47,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { if (LunaBox.externalModules.box.isEmpty) { return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.EXTERNAL_MODULES.name, + module: LunaModule.EXTERNAL_MODULES.title, ); } return LunaListView( diff --git a/lib/modules/lidarr/routes/lidarr.dart b/lib/modules/lidarr/routes/lidarr.dart index 4cf5746b..c68c63fd 100644 --- a/lib/modules/lidarr/routes/lidarr.dart +++ b/lib/modules/lidarr/routes/lidarr.dart @@ -59,7 +59,7 @@ class _State extends State { if (!_api.enabled!) return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.LIDARR.name, + module: LunaModule.LIDARR.title, ); return LunaPageView( controller: _pageController, @@ -100,7 +100,7 @@ class _State extends State { ), ]; return LunaAppBar.dropdown( - title: LunaModule.LIDARR.name, + title: LunaModule.LIDARR.title, useDrawer: true, profiles: profiles, actions: actions, diff --git a/lib/modules/nzbget/routes/nzbget.dart b/lib/modules/nzbget/routes/nzbget.dart index 6a917671..cf1697cc 100644 --- a/lib/modules/nzbget/routes/nzbget.dart +++ b/lib/modules/nzbget/routes/nzbget.dart @@ -81,7 +81,7 @@ class _State extends State { ), ]; return LunaAppBar.dropdown( - title: LunaModule.NZBGET.name, + title: LunaModule.NZBGET.title, useDrawer: true, profiles: profiles, actions: actions, @@ -94,7 +94,7 @@ class _State extends State { if (!_api.enabled!) return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.NZBGET.name, + module: LunaModule.NZBGET.title, ); return LunaPageView( controller: _pageController, diff --git a/lib/modules/overseerr/core/router.dart b/lib/modules/overseerr/core/router.dart index 22cfeba6..dd79d5c7 100644 --- a/lib/modules/overseerr/core/router.dart +++ b/lib/modules/overseerr/core/router.dart @@ -27,7 +27,7 @@ abstract class OverseerrPageRouter extends LunaPageRouter { handler: Handler( handlerFunc: (context, params) { if (!homeRoute && !context!.read().enabled) { - return LunaNotEnabledRoute(module: LunaModule.OVERSEERR.name); + return LunaNotEnabledRoute(module: LunaModule.OVERSEERR.title); } return widget(); }, @@ -47,7 +47,7 @@ abstract class OverseerrPageRouter extends LunaPageRouter { handler: Handler( handlerFunc: (context, params) { if (!homeRoute && !context!.read().enabled) { - return LunaNotEnabledRoute(module: LunaModule.OVERSEERR.name); + return LunaNotEnabledRoute(module: LunaModule.OVERSEERR.title); } return handlerFunc(context, params); }, diff --git a/lib/modules/overseerr/routes/overseerr/route.dart b/lib/modules/overseerr/routes/overseerr/route.dart index 341c28ef..e3ba48cc 100644 --- a/lib/modules/overseerr/routes/overseerr/route.dart +++ b/lib/modules/overseerr/routes/overseerr/route.dart @@ -67,7 +67,7 @@ class _State extends State<_Widget> { List? actions; if (context.watch().enabled) actions = []; return LunaAppBar.dropdown( - title: LunaModule.OVERSEERR.name, + title: LunaModule.OVERSEERR.title, useDrawer: true, profiles: profiles, actions: actions, @@ -83,7 +83,7 @@ class _State extends State<_Widget> { if (!enabled!) { return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.OVERSEERR.name, + module: LunaModule.OVERSEERR.title, ); } return LunaPageView( diff --git a/lib/modules/radarr/routes/radarr/route.dart b/lib/modules/radarr/routes/radarr/route.dart index f2e1e27c..ee68d5f2 100644 --- a/lib/modules/radarr/routes/radarr/route.dart +++ b/lib/modules/radarr/routes/radarr/route.dart @@ -73,7 +73,7 @@ class _State extends State<_Widget> { ]; } return LunaAppBar.dropdown( - title: LunaModule.RADARR.name, + title: LunaModule.RADARR.title, useDrawer: true, profiles: profiles, actions: actions, diff --git a/lib/modules/sabnzbd/routes/sabnzbd.dart b/lib/modules/sabnzbd/routes/sabnzbd.dart index fce91239..0cec7865 100644 --- a/lib/modules/sabnzbd/routes/sabnzbd.dart +++ b/lib/modules/sabnzbd/routes/sabnzbd.dart @@ -80,7 +80,7 @@ class _State extends State { ), ]; return LunaAppBar.dropdown( - title: LunaModule.SABNZBD.name, + title: LunaModule.SABNZBD.title, useDrawer: true, profiles: profiles, actions: actions, @@ -93,7 +93,7 @@ class _State extends State { if (!_api.enabled!) return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.SABNZBD.name, + module: LunaModule.SABNZBD.title, ); return LunaPageView( controller: _pageController, diff --git a/lib/modules/search/routes/indexers/route.dart b/lib/modules/search/routes/indexers/route.dart index 2121b731..f69f25be 100644 --- a/lib/modules/search/routes/indexers/route.dart +++ b/lib/modules/search/routes/indexers/route.dart @@ -35,7 +35,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( useDrawer: true, - title: LunaModule.SEARCH.name, + title: LunaModule.SEARCH.title, scrollControllers: [scrollController], ); } @@ -46,7 +46,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { if (LunaBox.indexers.box.isEmpty) { return LunaMessage.moduleNotEnabled( context: context, - module: LunaModule.SEARCH.name, + module: LunaModule.SEARCH.title, ); } return LunaListView( diff --git a/lib/modules/settings/routes/configuration/route.dart b/lib/modules/settings/routes/configuration/route.dart index c1a1122d..4e0ead35 100644 --- a/lib/modules/settings/routes/configuration/route.dart +++ b/lib/modules/settings/routes/configuration/route.dart @@ -110,12 +110,12 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _tileFromModuleMap(LunaModule module) { return LunaBlock( - title: module.name, + title: module.title, body: [ - TextSpan(text: 'settings.ConfigureModule'.tr(args: [module.name])) + TextSpan(text: 'settings.ConfigureModule'.tr(args: [module.title])) ], trailing: LunaIconButton(icon: module.icon), - onTap: () async => module.settingsPage!.navigateTo(context), + onTap: () async => module.settingsRoute!.navigateTo(context), ); } } 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 a08bebde..bcd8b27d 100644 --- a/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart +++ b/lib/modules/settings/routes/configuration_dashboard/pages/calendar_settings.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:lunasea/database/tables/dashboard.dart'; import 'package:tuple/tuple.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:lunasea/widgets/ui.dart'; import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_day.dart'; import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_size.dart'; @@ -130,11 +130,11 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { const _db = DashboardDatabase.CALENDAR_ENABLE_LIDARR; return _db.listen( builder: (context, _) => LunaBlock( - title: LunaModule.LIDARR.name, + title: LunaModule.LIDARR.title, body: [ TextSpan( text: 'settings.ShowCalendarEntries'.tr( - args: [LunaModule.LIDARR.name], + args: [LunaModule.LIDARR.title], ), ) ], @@ -150,11 +150,11 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { const _db = DashboardDatabase.CALENDAR_ENABLE_RADARR; return _db.listen( builder: (context, _) => LunaBlock( - title: LunaModule.RADARR.name, + title: LunaModule.RADARR.title, body: [ TextSpan( text: 'settings.ShowCalendarEntries'.tr( - args: [LunaModule.RADARR.name], + args: [LunaModule.RADARR.title], ), ) ], @@ -170,11 +170,11 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { const _db = DashboardDatabase.CALENDAR_ENABLE_SONARR; return _db.listen( builder: (context, _) => LunaBlock( - title: LunaModule.SONARR.name, + title: LunaModule.SONARR.title, body: [ TextSpan( text: 'settings.ShowCalendarEntries'.tr( - args: [LunaModule.SONARR.name], + args: [LunaModule.SONARR.title], ), ) ], diff --git a/lib/modules/settings/routes/configuration_drawer/route.dart b/lib/modules/settings/routes/configuration_drawer/route.dart index d2ef8d25..9b8ba3f4 100644 --- a/lib/modules/settings/routes/configuration_drawer/route.dart +++ b/lib/modules/settings/routes/configuration_drawer/route.dart @@ -88,7 +88,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { key: ObjectKey(_modules![index]), builder: (context, _) => LunaBlock( disabled: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.read(), - title: _modules![index].name, + title: _modules![index].title, body: [TextSpan(text: _modules![index].description)], leading: LunaIconButton(icon: _modules![index].icon), trailing: LunaSeaDatabase.DRAWER_AUTOMATIC_MANAGE.read() diff --git a/lib/modules/settings/routes/configuration_externalmodules/route.dart b/lib/modules/settings/routes/configuration_externalmodules/route.dart index 64816271..7e455d2c 100644 --- a/lib/modules/settings/routes/configuration_externalmodules/route.dart +++ b/lib/modules/settings/routes/configuration_externalmodules/route.dart @@ -36,7 +36,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( scrollControllers: [scrollController], - title: LunaModule.EXTERNAL_MODULES.name, + title: LunaModule.EXTERNAL_MODULES.title, ); } 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 693fa9b1..a4a6e199 100644 --- a/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_lidarr/pages/connection_details.dart @@ -121,7 +121,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.HostRequired'.tr(), message: 'settings.HostRequiredMessage'.tr( - args: [LunaModule.LIDARR.name], + args: [LunaModule.LIDARR.title], ), ); return; @@ -130,7 +130,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.ApiKeyRequired'.tr(), message: 'settings.ApiKeyRequiredMessage'.tr( - args: [LunaModule.LIDARR.name], + args: [LunaModule.LIDARR.title], ), ); return; @@ -141,7 +141,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { (_) => showLunaSuccessSnackBar( title: 'settings.ConnectedSuccessfully'.tr(), message: 'settings.ConnectedSuccessfullyMessage'.tr( - args: [LunaModule.LIDARR.name], + args: [LunaModule.LIDARR.title], ), ), ) diff --git a/lib/modules/settings/routes/configuration_lidarr/route.dart b/lib/modules/settings/routes/configuration_lidarr/route.dart index 64d55a04..a5eff675 100644 --- a/lib/modules/settings/routes/configuration_lidarr/route.dart +++ b/lib/modules/settings/routes/configuration_lidarr/route.dart @@ -35,7 +35,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( scrollControllers: [scrollController], - title: LunaModule.LIDARR.name, + title: LunaModule.LIDARR.title, ); } @@ -57,7 +57,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'settings.EnableModule'.tr(args: [LunaModule.LIDARR.name]), + title: 'settings.EnableModule'.tr(args: [LunaModule.LIDARR.title]), trailing: LunaSwitch( value: LunaProfile.current.lidarrEnabled ?? false, onChanged: (value) { @@ -76,7 +76,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { body: [ TextSpan( text: 'settings.ConnectionDetailsDescription'.tr( - args: [LunaModule.LIDARR.name], + args: [LunaModule.LIDARR.title], ), ), ], 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 9840dcc0..413ccbb9 100644 --- a/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_nzbget/pages/connection_details.dart @@ -150,7 +150,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.HostRequired'.tr(), message: 'settings.HostRequiredMessage' - .tr(args: [LunaModule.NZBGET.name]), + .tr(args: [LunaModule.NZBGET.title]), ); return; } @@ -159,7 +159,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { .then((_) => showLunaSuccessSnackBar( title: 'settings.ConnectedSuccessfully'.tr(), message: 'settings.ConnectedSuccessfullyMessage' - .tr(args: [LunaModule.NZBGET.name]), + .tr(args: [LunaModule.NZBGET.title]), )) .catchError((error, trace) { LunaLogger().error('Connection Test Failed', error, trace); diff --git a/lib/modules/settings/routes/configuration_nzbget/route.dart b/lib/modules/settings/routes/configuration_nzbget/route.dart index 62080d31..c339a7df 100644 --- a/lib/modules/settings/routes/configuration_nzbget/route.dart +++ b/lib/modules/settings/routes/configuration_nzbget/route.dart @@ -34,7 +34,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( - title: LunaModule.NZBGET.name, + title: LunaModule.NZBGET.title, scrollControllers: [scrollController], ); } @@ -57,7 +57,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'settings.EnableModule'.tr(args: [LunaModule.NZBGET.name]), + title: 'settings.EnableModule'.tr(args: [LunaModule.NZBGET.title]), trailing: LunaSwitch( value: LunaProfile.current.nzbgetEnabled ?? false, onChanged: (value) { @@ -76,7 +76,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { body: [ TextSpan( text: 'settings.ConnectionDetailsDescription' - .tr(args: [LunaModule.NZBGET.name]), + .tr(args: [LunaModule.NZBGET.title]), ), ], trailing: const LunaIconButton.arrow(), 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 dc4410e8..2302a671 100644 --- a/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_overseerr/pages/connection_details.dart @@ -121,7 +121,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.HostRequired'.tr(), message: 'settings.HostRequiredMessage' - .tr(args: [LunaModule.OVERSEERR.name]), + .tr(args: [LunaModule.OVERSEERR.title]), ); return; } @@ -129,7 +129,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.ApiKeyRequired'.tr(), message: 'settings.ApiKeyRequiredMessage' - .tr(args: [LunaModule.OVERSEERR.name]), + .tr(args: [LunaModule.OVERSEERR.title]), ); return; } @@ -143,7 +143,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { (_) => showLunaSuccessSnackBar( title: 'settings.ConnectedSuccessfully'.tr(), message: 'settings.ConnectedSuccessfullyMessage' - .tr(args: [LunaModule.OVERSEERR.name]), + .tr(args: [LunaModule.OVERSEERR.title]), ), ) .catchError( diff --git a/lib/modules/settings/routes/configuration_overseerr/route.dart b/lib/modules/settings/routes/configuration_overseerr/route.dart index cf9b4fa6..dd917ae6 100644 --- a/lib/modules/settings/routes/configuration_overseerr/route.dart +++ b/lib/modules/settings/routes/configuration_overseerr/route.dart @@ -35,7 +35,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { Widget _appBar() { return LunaAppBar( - title: LunaModule.OVERSEERR.name, + title: LunaModule.OVERSEERR.title, scrollControllers: [scrollController], ); } @@ -55,7 +55,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'Enable ${LunaModule.OVERSEERR.name}', + title: 'Enable ${LunaModule.OVERSEERR.title}', trailing: LunaSwitch( value: LunaProfile.current.overseerrEnabled ?? false, onChanged: (value) { @@ -74,7 +74,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { body: [ TextSpan( text: 'settings.ConnectionDetailsDescription'.tr( - args: [LunaModule.OVERSEERR.name], + args: [LunaModule.OVERSEERR.title], ), ), ], diff --git a/lib/modules/settings/routes/configuration_quickactions/route.dart b/lib/modules/settings/routes/configuration_quickactions/route.dart index ab05c6c1..ae0ade80 100644 --- a/lib/modules/settings/routes/configuration_quickactions/route.dart +++ b/lib/modules/settings/routes/configuration_quickactions/route.dart @@ -46,36 +46,36 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { children: [ SettingsBanners.QUICK_ACTIONS_SUPPORT.banner(), _actionTile( - LunaModule.LIDARR.name, + LunaModule.LIDARR.title, LunaSeaDatabase.QUICK_ACTIONS_LIDARR, ), _actionTile( - LunaModule.NZBGET.name, + LunaModule.NZBGET.title, LunaSeaDatabase.QUICK_ACTIONS_NZBGET, ), if (LunaModule.OVERSEERR.featureFlag) _actionTile( - LunaModule.OVERSEERR.name, + LunaModule.OVERSEERR.title, LunaSeaDatabase.QUICK_ACTIONS_OVERSEERR, ), _actionTile( - LunaModule.RADARR.name, + LunaModule.RADARR.title, LunaSeaDatabase.QUICK_ACTIONS_RADARR, ), _actionTile( - LunaModule.SABNZBD.name, + LunaModule.SABNZBD.title, LunaSeaDatabase.QUICK_ACTIONS_SABNZBD, ), _actionTile( - LunaModule.SEARCH.name, + LunaModule.SEARCH.title, LunaSeaDatabase.QUICK_ACTIONS_SEARCH, ), _actionTile( - LunaModule.SONARR.name, + LunaModule.SONARR.title, LunaSeaDatabase.QUICK_ACTIONS_SONARR, ), _actionTile( - LunaModule.TAUTULLI.name, + LunaModule.TAUTULLI.title, LunaSeaDatabase.QUICK_ACTIONS_TAUTULLI, ), ], 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 1759982d..9274d9c5 100644 --- a/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart +++ b/lib/modules/settings/routes/configuration_radarr/pages/connection_details.dart @@ -121,7 +121,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.HostRequired'.tr(), message: 'settings.HostRequiredMessage' - .tr(args: [LunaModule.RADARR.name]), + .tr(args: [LunaModule.RADARR.title]), ); return; } @@ -129,7 +129,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { showLunaErrorSnackBar( title: 'settings.ApiKeyRequired'.tr(), message: 'settings.ApiKeyRequiredMessage' - .tr(args: [LunaModule.RADARR.name]), + .tr(args: [LunaModule.RADARR.title]), ); return; } @@ -144,7 +144,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { (_) => showLunaSuccessSnackBar( title: 'settings.ConnectedSuccessfully'.tr(), message: 'settings.ConnectedSuccessfullyMessage' - .tr(args: [LunaModule.RADARR.name]), + .tr(args: [LunaModule.RADARR.title]), ), ) .catchError( diff --git a/lib/modules/settings/routes/configuration_radarr/route.dart b/lib/modules/settings/routes/configuration_radarr/route.dart index 4f9613a1..ea57e834 100644 --- a/lib/modules/settings/routes/configuration_radarr/route.dart +++ b/lib/modules/settings/routes/configuration_radarr/route.dart @@ -59,7 +59,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'Enable ${LunaModule.RADARR.name}', + title: 'Enable ${LunaModule.RADARR.title}', trailing: LunaSwitch( value: LunaProfile.current.radarrEnabled ?? false, onChanged: (value) { diff --git a/lib/modules/settings/routes/configuration_sabnzbd/route.dart b/lib/modules/settings/routes/configuration_sabnzbd/route.dart index bac05ec2..e01836a9 100644 --- a/lib/modules/settings/routes/configuration_sabnzbd/route.dart +++ b/lib/modules/settings/routes/configuration_sabnzbd/route.dart @@ -58,7 +58,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'Enable ${LunaModule.SABNZBD.name}', + title: 'Enable ${LunaModule.SABNZBD.title}', trailing: LunaSwitch( value: LunaProfile.current.sabnzbdEnabled ?? false, onChanged: (value) { @@ -77,7 +77,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { body: [ TextSpan( text: 'settings.ConnectionDetailsDescription'.tr( - args: [LunaModule.SABNZBD.name], + args: [LunaModule.SABNZBD.title], ), ) ], diff --git a/lib/modules/settings/routes/configuration_sonarr/route.dart b/lib/modules/settings/routes/configuration_sonarr/route.dart index 15d959b3..f86de430 100644 --- a/lib/modules/settings/routes/configuration_sonarr/route.dart +++ b/lib/modules/settings/routes/configuration_sonarr/route.dart @@ -57,7 +57,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'Enable ${LunaModule.SONARR.name}', + title: 'Enable ${LunaModule.SONARR.title}', trailing: LunaSwitch( value: LunaProfile.current.sonarrEnabled ?? false, onChanged: (value) { @@ -76,7 +76,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { body: [ TextSpan( text: 'settings.ConnectionDetailsDescription'.tr( - args: [LunaModule.SONARR.name], + args: [LunaModule.SONARR.title], ), ) ], diff --git a/lib/modules/settings/routes/configuration_tautulli/route.dart b/lib/modules/settings/routes/configuration_tautulli/route.dart index 8567937e..971a306d 100644 --- a/lib/modules/settings/routes/configuration_tautulli/route.dart +++ b/lib/modules/settings/routes/configuration_tautulli/route.dart @@ -59,7 +59,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return ValueListenableBuilder( valueListenable: LunaBox.profiles.box.listenable(), builder: (context, dynamic _, __) => LunaBlock( - title: 'Enable ${LunaModule.TAUTULLI.name}', + title: 'Enable ${LunaModule.TAUTULLI.title}', trailing: LunaSwitch( value: LunaProfile.current.tautulliEnabled ?? false, onChanged: (value) { diff --git a/lib/modules/settings/routes/notifications/widgets/module_tile.dart b/lib/modules/settings/routes/notifications/widgets/module_tile.dart index 9ad3bbb0..ec95597b 100644 --- a/lib/modules/settings/routes/notifications/widgets/module_tile.dart +++ b/lib/modules/settings/routes/notifications/widgets/module_tile.dart @@ -15,7 +15,7 @@ class SettingsNotificationsModuleTile extends StatelessWidget { @override Widget build(BuildContext context) { return LunaBanner( - headerText: module.name, + headerText: module.title, icon: module.icon, iconColor: module.color, bodyText: module.information, @@ -30,7 +30,7 @@ class SettingsNotificationsModuleTile extends StatelessWidget { await Clipboard.setData(ClipboardData( text: LunaWebhooks.buildUserTokenURL(userId, module))); showLunaInfoSnackBar( - title: 'Copied URL for ${module.name}', + title: 'Copied URL for ${module.title}', message: 'Copied your user-based URL to the clipboard', ); }, @@ -43,7 +43,7 @@ class SettingsNotificationsModuleTile extends StatelessWidget { await Clipboard.setData(ClipboardData( text: LunaWebhooks.buildDeviceTokenURL(deviceId, module))); showLunaInfoSnackBar( - title: 'Copied URL for ${module.name}', + title: 'Copied URL for ${module.title}', message: 'Copied your device-based URL to the clipboard', ); }, diff --git a/lib/modules/settings/routes/settings/route.dart b/lib/modules/settings/routes/settings/route.dart index f377c37c..c1972979 100644 --- a/lib/modules/settings/routes/settings/route.dart +++ b/lib/modules/settings/routes/settings/route.dart @@ -40,7 +40,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin { return LunaAppBar( useDrawer: true, scrollControllers: [scrollController], - title: LunaModule.SETTINGS.name, + title: LunaModule.SETTINGS.title, ); } diff --git a/lib/modules/sonarr/routes/releases/route.dart b/lib/modules/sonarr/routes/releases/route.dart index d5c57dbe..8829e6bd 100644 --- a/lib/modules/sonarr/routes/releases/route.dart +++ b/lib/modules/sonarr/routes/releases/route.dart @@ -55,7 +55,7 @@ class SonarrReleasesRouter extends SonarrPageRouter { handler: Handler( handlerFunc: (context, params) { if (!context!.read().enabled) { - return LunaNotEnabledRoute(module: LunaModule.SONARR.name); + return LunaNotEnabledRoute(module: LunaModule.SONARR.title); } int episodeId = int.tryParse(params['episodeid']![0]) ?? -1; return _Widget( @@ -70,7 +70,7 @@ class SonarrReleasesRouter extends SonarrPageRouter { handler: Handler( handlerFunc: (context, params) { if (!context!.read().enabled) { - return LunaNotEnabledRoute(module: LunaModule.SONARR.name); + return LunaNotEnabledRoute(module: LunaModule.SONARR.title); } int seriesId = int.tryParse(params['seriesid']![0]) ?? -1; int seasonNumber = int.tryParse(params['seasonnumber']![0]) ?? -1; diff --git a/lib/modules/sonarr/routes/sonarr/route.dart b/lib/modules/sonarr/routes/sonarr/route.dart index efc2edcb..d24433a3 100644 --- a/lib/modules/sonarr/routes/sonarr/route.dart +++ b/lib/modules/sonarr/routes/sonarr/route.dart @@ -73,7 +73,7 @@ class _State extends State<_Widget> { ]; } return LunaAppBar.dropdown( - title: LunaModule.SONARR.name, + title: LunaModule.SONARR.title, useDrawer: true, profiles: profiles, actions: actions, diff --git a/lib/modules/tautulli/routes/tautulli/route.dart b/lib/modules/tautulli/routes/tautulli/route.dart index ac46fd21..c4b23cd6 100644 --- a/lib/modules/tautulli/routes/tautulli/route.dart +++ b/lib/modules/tautulli/routes/tautulli/route.dart @@ -62,7 +62,7 @@ class _State extends State<_Widget> { const TautulliAppBarGlobalSettingsAction(), ]; return LunaAppBar.dropdown( - title: LunaModule.TAUTULLI.name, + title: LunaModule.TAUTULLI.title, useDrawer: true, profiles: profiles, actions: actions, diff --git a/lib/system/quick_actions/platform/quick_actions_io.dart b/lib/system/quick_actions/platform/quick_actions_io.dart index d60e5d72..b479f9d2 100644 --- a/lib/system/quick_actions/platform/quick_actions_io.dart +++ b/lib/system/quick_actions/platform/quick_actions_io.dart @@ -1,6 +1,6 @@ import 'package:lunasea/database/tables/lunasea.dart'; import 'package:quick_actions/quick_actions.dart'; -import 'package:lunasea/core/modules.dart'; +import 'package:lunasea/modules.dart'; import 'package:lunasea/system/platform.dart'; // ignore: always_use_package_imports @@ -23,7 +23,7 @@ class IO implements LunaQuickActions { @override void actionHandler(String action) { - LunaModule.LIDARR.fromKey(action)?.launch(); + LunaModule.fromKey(action)?.launch(); } @override diff --git a/lib/widgets/drawer/drawer.dart b/lib/widgets/drawer/drawer.dart index f3facb50..420851d0 100644 --- a/lib/widgets/drawer/drawer.dart +++ b/lib/widgets/drawer/drawer.dart @@ -12,7 +12,7 @@ class LunaDrawer extends StatelessWidget { static List moduleAlphabeticalList() { return LunaModule.active - ..sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); + ..sort((a, b) => a.title.toLowerCase().compareTo(b.title.toLowerCase())); } static List moduleOrderedList() { @@ -110,7 +110,7 @@ class LunaDrawer extends StatelessWidget { padding: LunaUI.MARGIN_DEFAULT_HORIZONTAL * 1.5, ), Text( - module.name, + module.title, style: TextStyle( color: currentPage ? module.color : LunaColours.white, fontWeight: LunaUI.FONT_WEIGHT_BOLD, diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 52189d5e..fe2badbc 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - cloud_firestore (3.1.16): + - cloud_firestore (3.1.17): - Firebase/CoreOnly (~> 8.15.0) - Firebase/Firestore (~> 8.15.0) - firebase_core @@ -18,20 +18,20 @@ PODS: - Firebase/Storage (8.15.0): - Firebase/CoreOnly - FirebaseStorage (~> 8.15.0) - - firebase_auth (3.3.18): + - firebase_auth (3.3.19): - Firebase/Auth (~> 8.15.0) - Firebase/CoreOnly (~> 8.15.0) - firebase_core - FlutterMacOS - - firebase_core (1.17.0): + - firebase_core (1.17.1): - Firebase/CoreOnly (~> 8.15.0) - FlutterMacOS - - firebase_messaging (11.4.0): + - firebase_messaging (11.4.1): - Firebase/CoreOnly (~> 8.15.0) - Firebase/Messaging (~> 8.15.0) - firebase_core - FlutterMacOS - - firebase_storage (10.2.16): + - firebase_storage (10.2.17): - Firebase/CoreOnly (~> 8.15.0) - Firebase/Storage (~> 8.15.0) - firebase_core @@ -192,12 +192,12 @@ CHECKOUT OPTIONS: :tag: 8.15.0 SPEC CHECKSUMS: - cloud_firestore: 0b86223f1b24b2515df01951b4f58035057ef134 + cloud_firestore: 9122e411bd8ad0b5c4fb72581dd2fcefa4bfeeed Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d - firebase_auth: 5b7faa82249b4157ea4a80952582289cc7a8d0b4 - firebase_core: 895eaa063bde36f163d959810717e0f7a3bac614 - firebase_messaging: 822d21e8fd9ed8f849a51a4480676a2f934abb98 - firebase_storage: 897b8316581dd8032499656bb5bc106c2cbb7c85 + firebase_auth: 5719d06eb4b1c19a3afa58e4dfcd8c7912754241 + firebase_core: 7b87364e2d1eae70018a60698e89e7d6f5320bad + firebase_messaging: e319ed0a19e37b556c6d9df89e275e36d32a3973 + firebase_storage: 547c1e1158f762fd1f122baab025aeae9fa56772 FirebaseAuth: 3e73bf8abf4fbb40f8b421f361f4cc48ee57388c FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1 FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb @@ -212,7 +212,7 @@ SPEC CHECKSUMS: GTMSessionFetcher: 5595ec75acf5be50814f81e9189490412bad82ba nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c - path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f + path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 PromisesObjC: 99b6f43f9e1044bd87a95a60beff28c2c44ddb72 share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727