import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/enum/enum.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'; import 'package:intl/intl.dart'; class ProxiesSetting extends StatelessWidget { const ProxiesSetting({super.key}); IconData _getIconWithProxiesType(ProxiesType type) { return switch (type) { ProxiesType.tab => Icons.view_carousel, ProxiesType.list => Icons.view_list, }; } IconData _getIconWithProxiesSortType(ProxiesSortType type) { return switch (type) { ProxiesSortType.none => Icons.sort, ProxiesSortType.delay => Icons.network_ping, ProxiesSortType.name => Icons.sort_by_alpha, }; } String _getStringProxiesSortType(ProxiesSortType type) { return switch (type) { ProxiesSortType.none => appLocalizations.defaultText, ProxiesSortType.delay => appLocalizations.delay, ProxiesSortType.name => appLocalizations.name, }; } String getTextForProxiesLayout(ProxiesLayout proxiesLayout) { return switch (proxiesLayout) { ProxiesLayout.tight => appLocalizations.tight, ProxiesLayout.standard => appLocalizations.standard, ProxiesLayout.loose => appLocalizations.loose, }; } String _getTextWithProxiesIconStyle(ProxiesIconStyle style) { return switch (style) { ProxiesIconStyle.standard => appLocalizations.standard, ProxiesIconStyle.none => appLocalizations.noIcon, ProxiesIconStyle.icon => appLocalizations.onlyIcon, }; } List _buildStyleSetting() { return generateSection( title: appLocalizations.style, items: [ SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16), scrollDirection: Axis.horizontal, child: Consumer( builder: (_, ref, __) { final proxiesType = ref.watch(proxiesStyleSettingProvider.select( (state) => state.type, )); return Wrap( spacing: 16, children: [ for (final item in ProxiesType.values) SettingInfoCard( Info( label: Intl.message(item.name), iconData: _getIconWithProxiesType(item), ), isSelected: proxiesType == item, onPressed: () { ref .read(proxiesStyleSettingProvider.notifier) .updateState((state) { return state.copyWith( type: item, ); }); }, ) ], ); }, ), ) ], ); } List _buildSortSetting() { return generateSection( title: appLocalizations.sort, items: [ SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16), scrollDirection: Axis.horizontal, child: Consumer( builder: (_, ref, __) { final sortType = ref.watch(proxiesStyleSettingProvider.select( (state) => state.sortType, )); return Wrap( spacing: 16, children: [ for (final item in ProxiesSortType.values) SettingInfoCard( Info( label: _getStringProxiesSortType(item), iconData: _getIconWithProxiesSortType(item), ), isSelected: sortType == item, onPressed: () { ref .read(proxiesStyleSettingProvider.notifier) .updateState((state) { return state.copyWith( sortType: item, ); }); }, ), ], ); }, ), ), ], ); } List _buildSizeSetting() { return generateSection( title: appLocalizations.size, items: [ SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16), scrollDirection: Axis.horizontal, child: Consumer( builder: (_, ref, __) { final cardType = ref.watch(proxiesStyleSettingProvider.select( (state) => state.cardType, )); return Wrap( spacing: 16, children: [ for (final item in ProxyCardType.values) SettingTextCard( Intl.message(item.name), isSelected: item == cardType, onPressed: () { ref .read(proxiesStyleSettingProvider.notifier) .updateState((state) { return state.copyWith( cardType: item, ); }); }, ) ], ); }, ), ) ], ); } List _buildLayoutSetting() { return generateSection( title: appLocalizations.layout, items: [ SingleChildScrollView( padding: const EdgeInsets.symmetric( horizontal: 16, ), scrollDirection: Axis.horizontal, child: Consumer( builder: (_, ref, __) { final layout = ref.watch(proxiesStyleSettingProvider.select( (state) => state.layout, )); return Wrap( spacing: 16, children: [ for (final item in ProxiesLayout.values) SettingTextCard( getTextForProxiesLayout(item), isSelected: item == layout, onPressed: () { ref .watch(proxiesStyleSettingProvider.notifier) .updateState((state) { return state.copyWith( layout: item, ); }); }, ) ], ); }, ), ), ], ); } _buildGroupStyleSetting() { return generateSection( title: appLocalizations.iconStyle, items: [ SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16), scrollDirection: Axis.horizontal, child: Consumer( builder: (_, ref, __) { final iconStyle = ref.watch(proxiesStyleSettingProvider.select( (state) => state.iconStyle, )); return Wrap( spacing: 16, children: [ for (final item in ProxiesIconStyle.values) SettingTextCard( _getTextWithProxiesIconStyle(item), isSelected: iconStyle == item, onPressed: () { ref .read(proxiesStyleSettingProvider.notifier) .updateState((state) { return state.copyWith( iconStyle: item, ); }); }, ), ], ); }, ), ), ], ); } @override Widget build(BuildContext context) { return SingleChildScrollView( padding: EdgeInsets.only(bottom: 32), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ ..._buildStyleSetting(), ..._buildSortSetting(), ..._buildLayoutSetting(), ..._buildSizeSetting(), Consumer( builder: (_, ref, child) { final isList = ref.watch(proxiesStyleSettingProvider .select((state) => state.type == ProxiesType.list)); if (isList) { return child!; } return Container(); }, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ ..._buildGroupStyleSetting(), ], ), ), ], ), ); } }