Files
umbrix/lib/features/proxies/view/proxies_page.dart

176 lines
6.0 KiB
Dart
Raw Normal View History

2023-07-06 17:18:41 +03:30
import 'package:flutter/material.dart';
import 'package:hiddify/core/core_providers.dart';
import 'package:hiddify/domain/failures.dart';
import 'package:hiddify/features/common/common.dart';
import 'package:hiddify/features/proxies/notifier/notifier.dart';
import 'package:hiddify/features/proxies/notifier/proxies_delay_notifier.dart';
import 'package:hiddify/features/proxies/widgets/widgets.dart';
import 'package:hiddify/utils/utils.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:recase/recase.dart';
class ProxiesPage extends HookConsumerWidget with PresLogger {
const ProxiesPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final t = ref.watch(translationsProvider);
final asyncProxies = ref.watch(proxiesNotifierProvider);
2023-08-25 13:29:39 +03:30
final notifier = ref.watch(proxiesNotifierProvider.notifier);
2023-07-06 17:18:41 +03:30
final delays = ref.watch(proxiesDelayNotifierProvider);
final selectActiveProxyMutation = useMutation(
initialOnFailure: (error) =>
2023-08-26 17:01:51 +03:30
CustomToast.error(t.printError(error)).show(context),
2023-07-06 17:18:41 +03:30
);
switch (asyncProxies) {
2023-08-25 13:29:39 +03:30
case AsyncData(value: final groups):
if (groups.isEmpty) {
2023-07-06 17:18:41 +03:30
return Scaffold(
body: CustomScrollView(
slivers: [
NestedTabAppBar(
title: Text(t.proxies.pageTitle.titleCase),
),
SliverFillRemaining(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(t.proxies.emptyProxiesMsg.titleCase),
],
),
),
],
),
);
}
2023-08-25 13:29:39 +03:30
final select = groups.first;
return Scaffold(
body: CustomScrollView(
slivers: [
NestedTabAppBar(
title: Text(t.proxies.pageTitle.titleCase),
actions: [
PopupMenuButton(
itemBuilder: (_) {
return [
PopupMenuItem(
onTap: ref
.read(proxiesDelayNotifierProvider.notifier)
.cancelDelayTest,
child: Text(
t.proxies.cancelTestButtonText.sentenceCase,
),
),
];
},
),
],
2023-07-06 17:18:41 +03:30
),
2023-08-25 13:29:39 +03:30
SliverLayoutBuilder(
builder: (context, constraints) {
final width = constraints.crossAxisExtent;
if (!PlatformUtils.isDesktop && width < 648) {
return SliverList.builder(
itemBuilder: (_, index) {
final proxy = select.proxies[index];
return ProxyTile(
proxy,
selected: select.group.now == proxy.name,
delay: delays[proxy.name],
onSelect: () async {
if (selectActiveProxyMutation.state.isInProgress) {
return;
}
selectActiveProxyMutation.setFuture(
notifier.changeProxy(
select.group.name,
proxy.name,
),
);
},
);
},
itemCount: select.proxies.length,
);
}
2023-07-06 17:18:41 +03:30
2023-08-25 13:29:39 +03:30
return SliverGrid.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: (width / 268).floor(),
mainAxisExtent: 68,
2023-07-06 17:18:41 +03:30
),
2023-08-25 13:29:39 +03:30
itemBuilder: (context, index) {
final proxy = select.proxies[index];
return ProxyTile(
proxy,
selected: select.group.now == proxy.name,
delay: delays[proxy.name],
onSelect: () async {
if (selectActiveProxyMutation.state.isInProgress) {
return;
}
selectActiveProxyMutation.setFuture(
notifier.changeProxy(
select.group.name,
proxy.name,
),
2023-07-06 17:18:41 +03:30
);
},
2023-08-25 13:29:39 +03:30
);
},
itemCount: select.proxies.length,
2023-07-06 17:18:41 +03:30
);
},
),
2023-08-25 13:29:39 +03:30
],
2023-07-06 17:18:41 +03:30
),
floatingActionButton: FloatingActionButton(
onPressed: () async =>
// TODO: improve
ref.read(proxiesDelayNotifierProvider.notifier).testDelay(
2023-08-25 13:29:39 +03:30
select.proxies.map((e) => e.name),
2023-07-06 17:18:41 +03:30
),
tooltip: t.proxies.delayTestTooltip.titleCase,
child: const Icon(Icons.bolt),
),
);
case AsyncError(:final error):
return Scaffold(
body: CustomScrollView(
slivers: [
NestedTabAppBar(
title: Text(t.proxies.pageTitle.titleCase),
),
2023-08-19 22:27:23 +03:30
SliverErrorBodyPlaceholder(
2023-08-26 17:01:51 +03:30
t.printError(error),
2023-08-19 22:27:23 +03:30
icon: null,
),
2023-07-06 17:18:41 +03:30
],
),
);
case AsyncLoading():
return Scaffold(
body: CustomScrollView(
slivers: [
NestedTabAppBar(
title: Text(t.proxies.pageTitle.titleCase),
),
const SliverLoadingBodyPlaceholder(),
],
),
);
// TODO: remove
default:
return const Scaffold();
}
}
}