252 lines
7.3 KiB
Dart
252 lines
7.3 KiB
Dart
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/fragments/config/network.dart';
|
|
import 'package:fl_clash/providers/config.dart';
|
|
import 'package:fl_clash/widgets/widgets.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
class TUNButton extends StatelessWidget {
|
|
const TUNButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
if (system.isDesktop) const TUNItem(),
|
|
const TunStackItem(),
|
|
],
|
|
),
|
|
),
|
|
title: appLocalizations.tun,
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: appLocalizations.tun,
|
|
iconData: Icons.stacked_line_chart,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final enable = ref.watch(patchClashConfigProvider
|
|
.select((state) => state.tun.enable));
|
|
return Switch(
|
|
value: enable,
|
|
onChanged: (value) {
|
|
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
(state) => state.copyWith.tun(
|
|
enable: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class SystemProxyButton extends StatelessWidget {
|
|
const SystemProxyButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
SystemProxyItem(),
|
|
BypassDomainItem(),
|
|
],
|
|
),
|
|
),
|
|
title: appLocalizations.systemProxy,
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: appLocalizations.systemProxy,
|
|
iconData: Icons.shuffle,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final systemProxy = ref.watch(networkSettingProvider
|
|
.select((state) => state.systemProxy));
|
|
return Switch(
|
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
|
value: systemProxy,
|
|
onChanged: (value) {
|
|
ref.read(networkSettingProvider.notifier).updateState(
|
|
(state) => state.copyWith(
|
|
systemProxy: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class VpnButton extends StatelessWidget {
|
|
const VpnButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
const VPNItem(),
|
|
const VpnSystemProxyItem(),
|
|
const TunStackItem(),
|
|
],
|
|
),
|
|
),
|
|
title: "VPN",
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: "VPN",
|
|
iconData: Icons.stacked_line_chart,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final enable = ref.watch(
|
|
vpnSettingProvider.select(
|
|
(state) => state.enable,
|
|
),
|
|
);
|
|
return Switch(
|
|
value: enable,
|
|
onChanged: (value) {
|
|
ref.read(vpnSettingProvider.notifier).updateState(
|
|
(state) => state.copyWith(
|
|
enable: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|