mirror of
https://github.com/jagandeepbrar/lunasea.git
synced 2026-08-30 20:24:25 +00:00
214 lines
5.9 KiB
Dart
214 lines
5.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:lunasea/core.dart';
|
|
import 'package:lunasea/modules/nzbget.dart';
|
|
|
|
class NZBGet extends StatefulWidget {
|
|
static const ROUTE_NAME = '/nzbget';
|
|
|
|
const NZBGet({
|
|
Key? key,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
State<StatefulWidget> createState() => _State();
|
|
}
|
|
|
|
class _State extends State<NZBGet> {
|
|
final _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
LunaPageController? _pageController;
|
|
String _profileState = LunaProfile.current.toString();
|
|
NZBGetAPI _api = NZBGetAPI.from(LunaProfile.current);
|
|
|
|
final List _refreshKeys = [
|
|
GlobalKey<RefreshIndicatorState>(),
|
|
GlobalKey<RefreshIndicatorState>(),
|
|
];
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_pageController = LunaPageController(
|
|
initialPage: NZBGetDatabaseValue.NAVIGATION_INDEX.data);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return LunaScaffold(
|
|
scaffoldKey: _scaffoldKey,
|
|
body: _body(),
|
|
drawer: _drawer(),
|
|
appBar: _appBar() as PreferredSizeWidget?,
|
|
bottomNavigationBar: _bottomNavigationBar(),
|
|
extendBodyBehindAppBar: false,
|
|
extendBody: false,
|
|
onProfileChange: (_) {
|
|
if (_profileState != LunaProfile.current.toString()) _refreshProfile();
|
|
},
|
|
);
|
|
}
|
|
|
|
Widget _drawer() => LunaDrawer(page: LunaModule.NZBGET.key);
|
|
|
|
Widget? _bottomNavigationBar() {
|
|
if (_api.enabled!)
|
|
return NZBGetNavigationBar(pageController: _pageController);
|
|
return null;
|
|
}
|
|
|
|
Widget _appBar() {
|
|
List<String> profiles =
|
|
Database.profiles.box.keys.fold([], (value, element) {
|
|
if (Database.profiles.box.get(element)?.nzbgetEnabled ?? false)
|
|
value.add(element);
|
|
return value;
|
|
});
|
|
List<Widget>? actions;
|
|
if (_api.enabled!)
|
|
actions = [
|
|
Selector<NZBGetState, bool>(
|
|
selector: (_, model) => model.error,
|
|
builder: (context, error, widget) =>
|
|
error ? Container() : const NZBGetAppBarStats(),
|
|
),
|
|
LunaIconButton(
|
|
icon: Icons.more_vert_rounded,
|
|
onPressed: () async => _handlePopup(),
|
|
),
|
|
];
|
|
return LunaAppBar.dropdown(
|
|
title: LunaModule.NZBGET.name,
|
|
useDrawer: true,
|
|
profiles: profiles,
|
|
actions: actions,
|
|
pageController: _pageController,
|
|
scrollControllers: NZBGetNavigationBar.scrollControllers,
|
|
);
|
|
}
|
|
|
|
Widget _body() {
|
|
if (!_api.enabled!)
|
|
return LunaMessage.moduleNotEnabled(
|
|
context: context,
|
|
module: LunaModule.NZBGET.name,
|
|
);
|
|
return LunaPageView(
|
|
controller: _pageController,
|
|
children: [
|
|
NZBGetQueue(
|
|
refreshIndicatorKey: _refreshKeys[0],
|
|
),
|
|
NZBGetHistory(
|
|
refreshIndicatorKey: _refreshKeys[1],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Future<void> _handlePopup() async {
|
|
List<dynamic> values = await NZBGetDialogs.globalSettings(context);
|
|
if (values[0])
|
|
switch (values[1]) {
|
|
case 'web_gui':
|
|
ProfileHiveObject profile = LunaProfile.current;
|
|
await profile.nzbgetHost
|
|
?.lunaOpenGenericLink(headers: profile.nzbgetHeaders);
|
|
break;
|
|
case 'add_nzb':
|
|
_addNZB();
|
|
break;
|
|
case 'sort':
|
|
_sort();
|
|
break;
|
|
case 'server_details':
|
|
_serverDetails();
|
|
break;
|
|
default:
|
|
LunaLogger()
|
|
.warning('NZBGet', '_handlePopup', 'Unknown Case: ${values[1]}');
|
|
}
|
|
}
|
|
|
|
Future<void> _addNZB() async {
|
|
List values = await NZBGetDialogs.addNZB(context);
|
|
if (values[0])
|
|
switch (values[1]) {
|
|
case 'link':
|
|
_addByURL();
|
|
break;
|
|
case 'file':
|
|
_addByFile();
|
|
break;
|
|
default:
|
|
LunaLogger()
|
|
.warning('NZBGet', '_addNZB', 'Unknown Case: ${values[1]}');
|
|
}
|
|
}
|
|
|
|
Future<void> _addByURL() async {
|
|
List values = await NZBGetDialogs.addNZBUrl(context);
|
|
if (values[0])
|
|
await _api
|
|
.uploadURL(values[1])
|
|
.then((_) => showLunaSuccessSnackBar(
|
|
title: 'Uploaded NZB (URL)', message: values[1]))
|
|
.catchError((error) => showLunaErrorSnackBar(
|
|
title: 'Failed to Upload NZB', error: error));
|
|
}
|
|
|
|
Future<void> _addByFile() async {
|
|
try {
|
|
LunaFile? _file = await LunaFileSystem().read(context, [
|
|
'nzb',
|
|
]);
|
|
if (_file != null) {
|
|
String _name = _file.path.substring(_file.path.lastIndexOf('/') + 1);
|
|
if (_file.data.isNotEmpty) {
|
|
await _api.uploadFile(_file.data, _name).then((value) {
|
|
_refreshKeys[0]?.currentState?.show();
|
|
showLunaSuccessSnackBar(
|
|
title: 'Uploaded NZB (File)',
|
|
message: _name,
|
|
);
|
|
});
|
|
} else {
|
|
showLunaErrorSnackBar(
|
|
title: 'Failed to Upload NZB',
|
|
message: 'Please select a valid file',
|
|
);
|
|
}
|
|
}
|
|
} catch (error, stack) {
|
|
LunaLogger().error('Failed to add NZB by file', error, stack);
|
|
showLunaErrorSnackBar(
|
|
title: 'Failed to Upload NZB',
|
|
error: error,
|
|
);
|
|
}
|
|
}
|
|
|
|
Future<void> _sort() async {
|
|
List values = await NZBGetDialogs.sortQueue(context);
|
|
if (values[0])
|
|
await _api.sortQueue(values[1]).then((_) {
|
|
_refreshKeys[0]?.currentState?.show();
|
|
showLunaSuccessSnackBar(
|
|
title: 'Sorted Queue', message: (values[1] as NZBGetSort?).name);
|
|
}).catchError((error) {
|
|
showLunaErrorSnackBar(title: 'Failed to Sort Queue', error: error);
|
|
});
|
|
}
|
|
|
|
Future<void> _serverDetails() async =>
|
|
Navigator.of(context).pushNamed(NZBGetStatistics.ROUTE_NAME);
|
|
|
|
void _refreshProfile() {
|
|
_api = NZBGetAPI.from(LunaProfile.current);
|
|
_profileState = LunaProfile.current.toString();
|
|
_refreshAllPages();
|
|
}
|
|
|
|
void _refreshAllPages() {
|
|
for (var key in _refreshKeys) key?.currentState?.show();
|
|
}
|
|
}
|