diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 525ffdf9..54c24363 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,14 +1,11 @@ blank_issues_enabled: false contact_links: - - name: Support via Discord + - name: Feedback Requets & Support via Discord url: https://www.lunasea.app/discord - about: Chat with the developer and users on support and setup related topics. + about: Request new features and get support from the community - name: Support via GitHub Discussions url: https://github.com/JagandeepBrar/LunaSea/discussions about: Ask questions and discuss with other community members - name: Support via Reddit url: https://www.lunasea.app/reddit - about: Ask the developer and other redditors for support and setup related topics. - - name: Feedback & Feature Requests Board - url: https://feedback.lunasea.app - about: Request new features and modules to be implemented into LunaSea. + about: Ask the developer and other redditors for support and setup related topics diff --git a/.github/workflows/github_issue_labels.yml b/.github/workflows/github_issue_labels.yml index 1f0d0466..3a821caf 100644 --- a/.github/workflows/github_issue_labels.yml +++ b/.github/workflows/github_issue_labels.yml @@ -16,11 +16,8 @@ jobs: issue-comment: > Hi @{issue-author}! We use the issue tracker exclusively for bug reports and issues. However, this issue appears - to be a feature request. Please use the following channels: - - - [Feedback & Feature Requests Board](https://feedback.lunasea.app) - - - [Discord](https://www.lunasea.app/discord) + to be a feature request. Please use the [Discord](https://www.lunasea.app/discord) + to request new features. close-issue: true lock-issue: true issue-lock-reason: 'off-topic' diff --git a/README.md b/README.md index 199b629b..b852d297 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,6 @@ Interested in using prerelease build channels of LunaSea? Learn the differences - [Build Guide](https://github.com/JagandeepBrar/LunaSea/wiki/Build-Guide) - [Documentation](https://www.lunasea.app/docs) -- [Feedback & Feature Requests Board](https://www.lunasea.app/feedback) - [Frequently Asked Questions](https://docs.lunasea.app/getting-started/frequently-asked-questions) ## Support @@ -41,9 +40,8 @@ Interested in using prerelease build channels of LunaSea? Learn the differences [![Discord](https://img.shields.io/discord/673591529834807358?label=Discord&style=flat)](https://www.lunasea.app/discord) [![Reddit](https://img.shields.io/reddit/subreddit-subscribers/LunaSeaApp?label=r%2FLunaSeaApp&style=flat)](https://www.lunasea.app/reddit) -**Please only create an issue on GitHub for bugs and software issues**. Post in the [discussions board](https://github.com/JagandeepBrar/LunaSea/discussions) or the [feedback & feature requests board](https://www.lunasea.app/feedback) for requests and general feedback. +**Please only create an issue on GitHub for bugs and software issues**. Post in the [discussions board](https://github.com/JagandeepBrar/LunaSea/discussions) or the [Discord forum](https://www.lunasea.app/discord) for requests and general feedback. -- [Discord](https://www.lunasea.app/discord) - [Email](mailto:hello@lunasea.app) - [Reddit](https://www.lunasea.app/reddit) - [Website](https://www.lunasea.app) @@ -55,5 +53,4 @@ Interested in using prerelease build channels of LunaSea? Learn the differences Thank you to all tools and services for offering free subscriptions for open-source projects! - [docs.page](https://docs.page/): docs.page is used to host LunaSea's documentation -- [Hellonext](https://www.hellonext.co): Hellonext is used to host LunaSea's feedback board - [Weblate](https://weblate.org): Weblate is used to gather community localization for LunaSea diff --git a/assets/localization/en.json b/assets/localization/en.json index 8a2f9220..ddc1d667 100644 --- a/assets/localization/en.json +++ b/assets/localization/en.json @@ -54,6 +54,7 @@ "lunasea.Disabled": "Disabled", "lunasea.Dismiss": "Dismiss", "lunasea.Docs": "Docs", + "lunasea.DownloadClient": "Download Client", "lunasea.Edge": "Edge", "lunasea.Error": "Error", "lunasea.ExternalModules": "External Modules", diff --git a/docs/getting-started/frequently-asked-questions.mdx b/docs/getting-started/frequently-asked-questions.mdx index cf941462..ccb4ceef 100644 --- a/docs/getting-started/frequently-asked-questions.mdx +++ b/docs/getting-started/frequently-asked-questions.mdx @@ -15,7 +15,6 @@ The software, or as used in LunaSea, _Modules_, are all pieces of software that I take all requests into consideration! If you would like to request a feature there are a few ways I recommend: -- [Feedback Board](https://www.lunasea.app/feedback): The feedback board allows users to create, comment on, and vote on new features and general requests! This is the ideal way to request a new feature, as it allows other users to see active requests, it allows discussions to stay per-request, and the voting system gives me a good indication on the active demand for a feature. - [Discord](https://www.lunasea.app/discord) - [Email](mailto:hello@lunasea.app) - [Reddit](https://www.lunasea.app/reddit) @@ -34,7 +33,7 @@ Support for torrent clients is easily the most requested new module, and I defin Torrent support is not completely off the table and may come in the future! But at the moment, over 90% of the active user base is using iOS-based devices and it is hard to justify building a module (that takes a lot of time) that the mass majority of the user base would not be able to use. -> I am actively thinking of methods to get around this limitation, if you have any ideas consider commenting on the torrent client support [feedback board request](https://feedback.lunasea.app/b/New-Modules/p/torrent-clients-support). +> I am actively thinking of methods to get around this limitation, if you have any ideas consider commenting on the torrent client support [Discord Forum post](https://discord.com/channels/673591529834807358/1020181897973874748). ## Development @@ -69,7 +68,6 @@ I tried to make it as stable as possible, but bugs obviously will always be ther I consider all feedback and actively try to integrate new features that are requested by the community, big or small! You have a few ways to request new features for LunaSea: -- [Feedback Board](https://www.lunasea.app/feedback): The feedback board allows users to create, comment on, and vote on new features and general requests! This is the ideal way to request a new feature, as it allows other users to see active requests, it allows discussions to stay per-request, and the voting system gives me a good indication on the active demand for a feature. - [Discord](https://www.lunasea.app/discord) - [Email](mailto:hello@lunasea.app) - [Reddit](https://www.lunasea.app/reddit) diff --git a/lib/modules/lidarr/routes/search_results.dart b/lib/modules/lidarr/routes/search_results.dart index df974ab1..636d556b 100644 --- a/lib/modules/lidarr/routes/search_results.dart +++ b/lib/modules/lidarr/routes/search_results.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lunasea/core.dart'; import 'package:lunasea/modules/lidarr.dart'; +import 'package:lunasea/widgets/sheets/download_client/button.dart'; class ArtistAlbumReleasesRoute extends StatefulWidget { final int albumId; @@ -46,6 +47,9 @@ class _State extends State title: 'Releases', scrollControllers: [scrollController], bottom: LidarrReleasesSearchBar(scrollController: scrollController), + actions: const [ + DownloadClientButton(), + ], ); } diff --git a/lib/modules/nzbget/routes/nzbget.dart b/lib/modules/nzbget/routes/nzbget.dart index 3e34c958..b0bb2414 100644 --- a/lib/modules/nzbget/routes/nzbget.dart +++ b/lib/modules/nzbget/routes/nzbget.dart @@ -9,8 +9,11 @@ import 'package:lunasea/system/filesystem/file.dart'; import 'package:lunasea/system/filesystem/filesystem.dart'; class NZBGetRoute extends StatefulWidget { + final bool showDrawer; + const NZBGetRoute({ Key? key, + this.showDrawer = true, }) : super(key: key); @override @@ -40,7 +43,7 @@ class _State extends State { return LunaScaffold( scaffoldKey: _scaffoldKey, body: _body(), - drawer: _drawer(), + drawer: widget.showDrawer ? _drawer() : null, appBar: _appBar() as PreferredSizeWidget?, bottomNavigationBar: _bottomNavigationBar(), extendBodyBehindAppBar: false, @@ -81,7 +84,8 @@ class _State extends State { ]; return LunaAppBar.dropdown( title: LunaModule.NZBGET.title, - useDrawer: true, + useDrawer: widget.showDrawer, + hideLeading: !widget.showDrawer, profiles: profiles, actions: actions, pageController: _pageController, diff --git a/lib/modules/radarr/routes/releases/route.dart b/lib/modules/radarr/routes/releases/route.dart index d73f6e96..89bcb6ce 100644 --- a/lib/modules/radarr/routes/releases/route.dart +++ b/lib/modules/radarr/routes/releases/route.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:lunasea/core.dart'; import 'package:lunasea/modules/radarr.dart'; import 'package:lunasea/widgets/pages/invalid_route.dart'; +import 'package:lunasea/widgets/sheets/download_client/button.dart'; class MovieReleasesRoute extends StatefulWidget { final int movieId; @@ -43,6 +44,9 @@ class _State extends State with LunaScrollControllerMixin { title: 'Releases', scrollControllers: [scrollController], bottom: RadarrReleasesSearchBar(scrollController: scrollController), + actions: const [ + DownloadClientButton(), + ], ); } diff --git a/lib/modules/sabnzbd/routes/sabnzbd.dart b/lib/modules/sabnzbd/routes/sabnzbd.dart index ac00235a..28e51506 100644 --- a/lib/modules/sabnzbd/routes/sabnzbd.dart +++ b/lib/modules/sabnzbd/routes/sabnzbd.dart @@ -8,8 +8,11 @@ import 'package:lunasea/system/filesystem/file.dart'; import 'package:lunasea/system/filesystem/filesystem.dart'; class SABnzbdRoute extends StatefulWidget { + final bool showDrawer; + const SABnzbdRoute({ Key? key, + this.showDrawer = true, }) : super(key: key); @override @@ -39,7 +42,7 @@ class _State extends State { return LunaScaffold( scaffoldKey: _scaffoldKey, body: _body(), - drawer: _drawer(), + drawer: widget.showDrawer ? _drawer() : null, appBar: _appBar() as PreferredSizeWidget?, bottomNavigationBar: _bottomNavigationBar(), extendBodyBehindAppBar: false, @@ -79,7 +82,8 @@ class _State extends State { ]; return LunaAppBar.dropdown( title: LunaModule.SABNZBD.title, - useDrawer: true, + useDrawer: widget.showDrawer, + hideLeading: !widget.showDrawer, profiles: profiles, actions: actions, pageController: _pageController, diff --git a/lib/modules/sonarr/routes/releases/route.dart b/lib/modules/sonarr/routes/releases/route.dart index 8dad3313..29ab2c2d 100644 --- a/lib/modules/sonarr/routes/releases/route.dart +++ b/lib/modules/sonarr/routes/releases/route.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lunasea/core.dart'; import 'package:lunasea/modules/sonarr.dart'; +import 'package:lunasea/widgets/sheets/download_client/button.dart'; class ReleasesRoute extends StatefulWidget { final int? episodeId; @@ -45,6 +46,9 @@ class _State extends State with LunaScrollControllerMixin { title: 'sonarr.Releases'.tr(), scrollControllers: [scrollController], bottom: SonarrReleasesSearchBar(scrollController: scrollController), + actions: const [ + DownloadClientButton(), + ], ); } diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 226a9ebb..02682235 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -157,4 +157,40 @@ class LunaDialogs { ); return [_flag]; } + + Future selectDownloadClient() async { + final profile = LunaProfile.current; + final context = LunaState.context; + LunaModule? module; + + await LunaDialog.dialog( + context: context, + title: 'lunasea.DownloadClient'.tr(), + content: [ + if (profile.nzbgetEnabled) + LunaDialog.tile( + text: LunaModule.NZBGET.title, + icon: LunaModule.NZBGET.icon, + iconColor: LunaModule.NZBGET.color, + onTap: () { + module = LunaModule.NZBGET; + Navigator.of(context).pop(); + }, + ), + if (profile.sabnzbdEnabled) + LunaDialog.tile( + text: LunaModule.SABNZBD.title, + icon: LunaModule.SABNZBD.icon, + iconColor: LunaModule.SABNZBD.color, + onTap: () { + module = LunaModule.SABNZBD; + Navigator.of(context).pop(); + }, + ), + ], + contentPadding: LunaDialog.listDialogContentPadding(), + ); + + return module; + } } diff --git a/lib/utils/links.dart b/lib/utils/links.dart index a4bd1a65..2cd608aa 100644 --- a/lib/utils/links.dart +++ b/lib/utils/links.dart @@ -15,7 +15,6 @@ enum LunaLinkedContent { BUILDS('https://www.lunasea.app/builds'), DISCORD('https://www.lunasea.app/discord'), DOCUMENTATION('https://www.lunasea.app/docs'), - FEEDBACK_BOARD('https://www.lunasea.app/feedback'), GITHUB('https://www.lunasea.app/github'), NOTIFICATIONS_DOC('https://docs.lunasea.app/lunasea/notifications'), REDDIT('https://www.lunasea.app/reddit'), diff --git a/lib/widgets/sheets/download_client/button.dart b/lib/widgets/sheets/download_client/button.dart new file mode 100644 index 00000000..4e884812 --- /dev/null +++ b/lib/widgets/sheets/download_client/button.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:lunasea/database/models/profile.dart'; +import 'package:lunasea/widgets/sheets/download_client/sheet.dart'; +import 'package:lunasea/widgets/ui.dart'; + +class DownloadClientButton extends StatelessWidget { + const DownloadClientButton({ + super.key, + }); + + @override + Widget build(BuildContext context) { + if (_shouldShow) { + return LunaIconButton.appBar( + icon: LunaIcons.DOWNLOAD, + onPressed: DownloadClientSheet().show, + ); + } + return const SizedBox(); + } + + bool get _shouldShow { + final profile = LunaProfile.current; + return profile.sabnzbdEnabled || profile.nzbgetEnabled; + } +} diff --git a/lib/widgets/sheets/download_client/sheet.dart b/lib/widgets/sheets/download_client/sheet.dart new file mode 100644 index 00000000..7a2d2d8e --- /dev/null +++ b/lib/widgets/sheets/download_client/sheet.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:lunasea/database/models/profile.dart'; +import 'package:lunasea/modules.dart'; +import 'package:lunasea/modules/nzbget.dart'; +import 'package:lunasea/modules/sabnzbd/routes.dart'; +import 'package:lunasea/utils/dialogs.dart'; +import 'package:lunasea/vendor.dart'; +import 'package:lunasea/widgets/pages/invalid_route.dart'; +import 'package:lunasea/widgets/ui.dart'; + +class DownloadClientSheet extends LunaBottomModalSheet { + Future getDownloadClient() async { + final profile = LunaProfile.current; + final nzbget = profile.nzbgetEnabled; + final sabnzbd = profile.sabnzbdEnabled; + + if (nzbget && sabnzbd) { + return LunaDialogs().selectDownloadClient(); + } + if (nzbget) { + return LunaModule.NZBGET; + } + if (sabnzbd) { + return LunaModule.SABNZBD; + } + + return null; + } + + @override + Future show({ + Widget Function(BuildContext context)? builder, + }) async { + final module = await getDownloadClient(); + if (module != null) { + return showModal(builder: (context) { + if (module == LunaModule.SABNZBD) { + return const SABnzbdRoute(showDrawer: false); + } + if (module == LunaModule.NZBGET) { + return const NZBGetRoute(showDrawer: false); + } + return InvalidRoutePage(); + }); + } + } +} diff --git a/localization/lunasea/en.json b/localization/lunasea/en.json index c979d22e..866d023a 100644 --- a/localization/lunasea/en.json +++ b/localization/lunasea/en.json @@ -33,6 +33,7 @@ "lunasea.Disabled": "Disabled", "lunasea.Dismiss": "Dismiss", "lunasea.Docs": "Docs", + "lunasea.DownloadClient": "Download Client", "lunasea.Edge": "Edge", "lunasea.Error": "Error", "lunasea.ExternalModules": "External Modules",