Files
FlClash/lib/views/proxies/proxies.dart
T

147 lines
4.0 KiB
Dart
Raw Normal View History

2025-05-02 02:24:12 +08:00
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/enum/enum.dart';
import 'package:fl_clash/icons/icons.dart';
import 'package:fl_clash/models/models.dart';
2025-05-02 02:24:12 +08:00
import 'package:fl_clash/providers/providers.dart';
import 'package:fl_clash/views/proxies/list.dart';
import 'package:fl_clash/views/proxies/providers.dart';
import 'package:fl_clash/widgets/widgets.dart';
import 'package:material_ui/material_ui.dart';
2025-05-02 02:24:12 +08:00
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'setting.dart';
import 'tab.dart';
class ProxiesView extends ConsumerStatefulWidget {
const ProxiesView({super.key});
@override
ConsumerState<ProxiesView> createState() => _ProxiesViewState();
}
2025-06-07 01:48:34 +08:00
class _ProxiesViewState extends ConsumerState<ProxiesView> {
2025-05-02 02:24:12 +08:00
final GlobalKey<ProxiesTabViewState> _proxiesTabKey = GlobalKey();
bool _hasProviders = false;
bool _isTab = false;
List<CommonPopupMenuItem> _buildMenuItems(BuildContext context) {
2026-02-02 10:14:13 +08:00
final appLocalizations = context.appLocalizations;
2025-06-07 01:48:34 +08:00
return [
CommonPopupMenuItem(
glyph: AppGlyphs.sliders,
label: appLocalizations.settings,
onPressed: () {
showSheet(
context: context,
builder: (_) {
return CommonScaffold(
body: const ProxiesSetting(),
title: appLocalizations.settings,
);
2025-05-02 02:24:12 +08:00
},
2025-06-07 01:48:34 +08:00
);
},
),
if (_hasProviders)
CommonPopupMenuItem(
glyph: AppGlyphs.layers,
label: appLocalizations.providers,
onPressed: () {
showExtend(
context,
builder: (_) {
return const ProvidersView();
2025-05-02 02:24:12 +08:00
},
);
},
2025-06-07 01:48:34 +08:00
),
];
}
2025-05-02 02:24:12 +08:00
IconButtonData? _buildPrimaryAction() {
if (!_isTab) {
return null;
}
final currentGroupName = ref.watch(
proxiesTabControllerStateProvider.select(
(state) => state.currentGroupName,
),
);
final isDelayTesting = ref.watch(
delayTestingGroupsProvider.select(
(state) => state.contains(currentGroupName),
),
);
return IconButtonData(
glyph: AppGlyphs.bolt,
onPressed: () {
_proxiesTabKey.currentState?.delayTestCurrentGroup();
},
tooltip: context.appLocalizations.delayTest,
isLoading: isDelayTesting,
);
2025-05-02 02:24:12 +08:00
}
2025-06-07 01:48:34 +08:00
void _onSearch(String value) {
2025-10-14 15:13:52 +08:00
ref.read(queryProvider(QueryTag.proxies).notifier).value = value;
2025-06-07 01:48:34 +08:00
}
2025-05-02 02:24:12 +08:00
@override
void initState() {
super.initState();
2025-07-31 17:09:18 +08:00
ref.listenManual(providersProvider.select((state) => state.isNotEmpty), (
prev,
next,
) {
2025-06-07 01:48:34 +08:00
if (prev != next) {
setState(() {
_hasProviders = next;
});
}
}, fireImmediately: true);
ref.listenManual(
2025-07-31 17:09:18 +08:00
proxiesStyleSettingProvider.select(
(state) => state.type == ProxiesType.tab,
),
(prev, next) {
if (prev != next) {
setState(() {
_isTab = next;
});
}
},
fireImmediately: true,
);
2025-05-02 02:24:12 +08:00
}
@override
Widget build(BuildContext context) {
final proxiesType = ref.watch(
2025-07-31 17:09:18 +08:00
proxiesStyleSettingProvider.select((state) => state.type),
2025-05-02 02:24:12 +08:00
);
2025-12-16 11:23:09 +08:00
final isLoading = ref.watch(loadingProvider(LoadingTag.proxies));
2025-06-07 01:48:34 +08:00
return CommonScaffold(
2025-12-16 11:23:09 +08:00
isLoading: isLoading,
2025-10-14 15:13:52 +08:00
resizeToAvoidBottomInset: false,
primaryAction: _buildPrimaryAction(),
iconActions: [
if (_isTab)
IconButtonData(
glyph: AppGlyphs.locate,
onPressed: () {
_proxiesTabKey.currentState?.scrollToGroupSelected();
},
tooltip: context.appLocalizations.scrollToSelected,
),
],
menuItems: _buildMenuItems(context),
2026-02-02 10:14:13 +08:00
title: context.appLocalizations.proxies,
2025-06-07 01:48:34 +08:00
searchState: AppBarSearchState(onSearch: _onSearch),
body: switch (proxiesType) {
2025-07-31 17:09:18 +08:00
ProxiesType.tab => ProxiesTabView(key: _proxiesTabKey),
2025-06-07 01:48:34 +08:00
ProxiesType.list => const ProxiesListView(),
},
);
2025-05-02 02:24:12 +08:00
}
}