Refactor preferences

This commit is contained in:
problematicconsumer
2024-03-02 22:53:14 +03:30
parent 201ea5e88d
commit 2a994dc348
32 changed files with 1104 additions and 1389 deletions

View File

@@ -1,29 +1,19 @@
import 'package:dartx/dartx.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/model/constants.dart';
import 'package:hiddify/core/model/optional_range.dart';
import 'package:hiddify/core/widget/custom_alert_dialog.dart';
import 'package:hiddify/features/config_option/model/config_option_entity.dart';
import 'package:hiddify/features/config_option/data/config_option_repository.dart';
import 'package:hiddify/features/config_option/notifier/warp_option_notifier.dart';
import 'package:hiddify/features/settings/widgets/settings_input_dialog.dart';
import 'package:hiddify/features/config_option/widget/preference_tile.dart';
import 'package:hiddify/singbox/model/singbox_config_enum.dart';
import 'package:hiddify/utils/uri_utils.dart';
import 'package:hiddify/utils/validators.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class WarpOptionsTiles extends HookConsumerWidget {
const WarpOptionsTiles({
required this.options,
required this.defaultOptions,
required this.onChange,
super.key,
});
final ConfigOptionEntity options;
final ConfigOptionEntity defaultOptions;
final Future<void> Function(ConfigOptionPatch patch) onChange;
const WarpOptionsTiles({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -31,7 +21,8 @@ class WarpOptionsTiles extends HookConsumerWidget {
final warpOptions = ref.watch(warpOptionNotifierProvider);
final warpPrefaceCompleted = warpOptions.consentGiven;
final canChangeOptions = warpPrefaceCompleted && options.enableWarp;
final enableWarp = ref.watch(ConfigOptions.enableWarp);
final canChangeOptions = warpPrefaceCompleted && enableWarp;
ref.listen(
warpOptionNotifierProvider.select((value) => value.configGeneration),
@@ -49,7 +40,7 @@ class WarpOptionsTiles extends HookConsumerWidget {
children: [
SwitchListTile(
title: Text(t.settings.config.enableWarp),
value: options.enableWarp,
value: enableWarp,
onChanged: (value) async {
if (!warpPrefaceCompleted) {
final agreed = await showDialog<bool>(
@@ -58,10 +49,10 @@ class WarpOptionsTiles extends HookConsumerWidget {
);
if (agreed ?? false) {
await ref.read(warpOptionNotifierProvider.notifier).agree();
await onChange(ConfigOptionPatch(enableWarp: value));
await ref.read(ConfigOptions.enableWarp.notifier).update(value);
}
} else {
await onChange(ConfigOptionPatch(enableWarp: value));
await ref.read(ConfigOptions.enableWarp.notifier).update(value);
}
},
),
@@ -85,112 +76,56 @@ class WarpOptionsTiles extends HookConsumerWidget {
.generateWarpConfig();
},
),
ListTile(
title: Text(t.settings.config.warpDetourMode),
subtitle: Text(options.warpDetourMode.present(t)),
ChoicePreferenceWidget(
selected: ref.watch(ConfigOptions.warpDetourMode),
preferences: ref.watch(ConfigOptions.warpDetourMode.notifier),
enabled: canChangeOptions,
onTap: () async {
final warpDetourMode = await SettingsPickerDialog(
title: t.settings.config.warpDetourMode,
selected: options.warpDetourMode,
options: WarpDetourMode.values,
getTitle: (e) => e.present(t),
resetValue: defaultOptions.warpDetourMode,
).show(context);
if (warpDetourMode == null) return;
await onChange(
ConfigOptionPatch(warpDetourMode: warpDetourMode),
);
},
choices: WarpDetourMode.values,
title: t.settings.config.warpDetourMode,
presentChoice: (value) => value.present(t),
),
ListTile(
title: Text(t.settings.config.warpLicenseKey),
subtitle: Text(
options.warpLicenseKey.isEmpty
? t.general.notSet
: options.warpLicenseKey,
),
ValuePreferenceWidget(
value: ref.watch(ConfigOptions.warpLicenseKey),
preferences: ref.watch(ConfigOptions.warpLicenseKey.notifier),
enabled: canChangeOptions,
onTap: () async {
final licenseKey = await SettingsInputDialog(
title: t.settings.config.warpLicenseKey,
initialValue: options.warpLicenseKey,
resetValue: defaultOptions.warpLicenseKey,
).show(context);
if (licenseKey == null) return;
await onChange(ConfigOptionPatch(warpLicenseKey: licenseKey));
},
title: t.settings.config.warpLicenseKey,
presentValue: (value) => value.isEmpty ? t.general.notSet : value,
),
ListTile(
title: Text(t.settings.config.warpCleanIp),
subtitle: Text(options.warpCleanIp),
ValuePreferenceWidget(
value: ref.watch(ConfigOptions.warpCleanIp),
preferences: ref.watch(ConfigOptions.warpCleanIp.notifier),
enabled: canChangeOptions,
onTap: () async {
final warpCleanIp = await SettingsInputDialog(
title: t.settings.config.warpCleanIp,
initialValue: options.warpCleanIp,
resetValue: defaultOptions.warpCleanIp,
).show(context);
if (warpCleanIp == null || warpCleanIp.isBlank) return;
await onChange(ConfigOptionPatch(warpCleanIp: warpCleanIp));
},
title: t.settings.config.warpCleanIp,
),
ListTile(
title: Text(t.settings.config.warpPort),
subtitle: Text(options.warpPort.toString()),
ValuePreferenceWidget(
value: ref.watch(ConfigOptions.warpPort),
preferences: ref.watch(ConfigOptions.warpPort.notifier),
enabled: canChangeOptions,
onTap: () async {
final warpPort = await SettingsInputDialog(
title: t.settings.config.warpPort,
initialValue: options.warpPort,
resetValue: defaultOptions.warpPort,
validator: isPort,
mapTo: int.tryParse,
digitsOnly: true,
).show(context);
if (warpPort == null) return;
await onChange(
ConfigOptionPatch(warpPort: warpPort),
);
},
title: t.settings.config.warpPort,
inputToValue: int.tryParse,
validateInput: isPort,
digitsOnly: true,
),
ListTile(
title: Text(t.settings.config.warpNoise),
subtitle: Text(options.warpNoise.present(t)),
ValuePreferenceWidget(
value: ref.watch(ConfigOptions.warpNoise),
preferences: ref.watch(ConfigOptions.warpNoise.notifier),
enabled: canChangeOptions,
onTap: () async {
final warpNoise = await SettingsInputDialog(
title: t.settings.config.warpNoise,
initialValue: options.warpNoise.format(),
resetValue: defaultOptions.warpNoise.format(),
).show(context);
if (warpNoise == null) return;
await onChange(
ConfigOptionPatch(
warpNoise: OptionalRange.tryParse(warpNoise, allowEmpty: true),
),
);
},
title: t.settings.config.warpNoise,
inputToValue: (input) =>
OptionalRange.tryParse(input, allowEmpty: true),
presentValue: (value) => value.present(t),
formatInputValue: (value) => value.format(),
),
ListTile(
title: Text(t.settings.config.warpNoiseDelay),
subtitle: Text(options.warpNoiseDelay.present(t)),
ValuePreferenceWidget(
value: ref.watch(ConfigOptions.warpNoiseDelay),
preferences: ref.watch(ConfigOptions.warpNoiseDelay.notifier),
enabled: canChangeOptions,
onTap: () async {
final warpNoiseDelay = await SettingsInputDialog(
title: t.settings.config.warpNoiseDelay,
initialValue: options.warpNoiseDelay.format(),
resetValue: defaultOptions.warpNoiseDelay.format(),
).show(context);
if (warpNoiseDelay == null) return;
await onChange(
ConfigOptionPatch(
warpNoiseDelay:
OptionalRange.tryParse(warpNoiseDelay, allowEmpty: true),
),
);
},
)
title: t.settings.config.warpNoiseDelay,
inputToValue: (input) =>
OptionalRange.tryParse(input, allowEmpty: true),
presentValue: (value) => value.present(t),
formatInputValue: (value) => value.format(),
),
],
);
}