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, ), ); }, ); }, ) ], ), ), ), ); } }