From 81c069643bfb33d4f53ed143820d110c804651aa Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 29 Dec 2023 15:35:01 +0330 Subject: [PATCH] Add experimental flag in settings ui --- assets/translations/strings_en.i18n.json | 2 + assets/translations/strings_fa.i18n.json | 2 + assets/translations/strings_ru.i18n.json | 4 +- assets/translations/strings_tr.i18n.json | 4 +- assets/translations/strings_zh-CN.i18n.json | 4 +- lib/core/widget/tip_card.dart | 39 +++++++++++++++++++ .../overview/config_options_page.dart | 13 +++++-- lib/singbox/model/singbox_config_enum.dart | 3 +- 8 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 lib/core/widget/tip_card.dart diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 9a8f2b24..cdb7dbbe 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -131,6 +131,8 @@ "settings": { "pageTitle": "Settings", "requiresRestartMsg": "For this to take effect restart the app", + "experimental": "Experimental", + "experimentalMsg": "Features with Experimental flag are still in development and might cause issues.", "general": { "sectionTitle": "General", "locale": "Language", diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index f5380bc7..c570ab8a 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -131,6 +131,8 @@ "settings": { "pageTitle": "تنظیمات", "requiresRestartMsg": "برای اعمال این تنظیم برنامه را بازنشانی کنید", + "experimental": "آزمایشی", + "experimentalMsg": "تنظیماتی که عنوان آزمایشی دارند همچنان در دست توسعه هستند و فعال‌سازی آن‌ها میتواند خطاهایی بوجود بیاورد.", "general": { "sectionTitle": "عمومی", "locale": "زبان", diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json index baeb0635..3898f34f 100644 --- a/assets/translations/strings_ru.i18n.json +++ b/assets/translations/strings_ru.i18n.json @@ -238,7 +238,9 @@ "successMsg": "Объект успешно обновлен", "addRecommended": "Добавить рекомендуемые активы", "missingGeoAssetsMsg": "Файлы выбранных ресурсов маршрутизации отсутствуют. Либо скачайте их, либо выберите существующие." - } + }, + "experimental": "Экспериментальный", + "experimentalMsg": "Функции с флагом «Экспериментально» все еще находятся в разработке и могут вызвать проблемы." }, "about": { "pageTitle": "О программе", diff --git a/assets/translations/strings_tr.i18n.json b/assets/translations/strings_tr.i18n.json index 902dda83..5b7658e2 100644 --- a/assets/translations/strings_tr.i18n.json +++ b/assets/translations/strings_tr.i18n.json @@ -238,7 +238,9 @@ "successMsg": "Öğe başarıyla güncellendi", "addRecommended": "Önerilen Varlıkları Ekle", "missingGeoAssetsMsg": "Seçilen yönlendirme varlıklarının dosyaları eksik. Bunları indirin veya mevcut olanları seçin." - } + }, + "experimental": "Deneysel", + "experimentalMsg": "Deneysel işaretli özellikler hâlâ geliştirilme aşamasındadır ve sorunlara neden olabilir." }, "about": { "pageTitle": "Hakkında", diff --git a/assets/translations/strings_zh-CN.i18n.json b/assets/translations/strings_zh-CN.i18n.json index 83b46551..6adc14ea 100644 --- a/assets/translations/strings_zh-CN.i18n.json +++ b/assets/translations/strings_zh-CN.i18n.json @@ -238,7 +238,9 @@ "successMsg": "已成功更新资源文件", "addRecommended": "添加建议的资源文件", "missingGeoAssetsMsg": "所选路由资源的文件丢失。下载它们或选择现有的。" - } + }, + "experimental": "实验性的", + "experimentalMsg": "带有实验标志的功能仍在开发中,可能会导致问题。" }, "about": { "pageTitle": "关于", diff --git a/lib/core/widget/tip_card.dart b/lib/core/widget/tip_card.dart new file mode 100644 index 00000000..59cabf22 --- /dev/null +++ b/lib/core/widget/tip_card.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +class TipCard extends StatelessWidget { + const TipCard({required this.message, super.key}); + + final String message; + + @override + Widget build(BuildContext context) { + return Card( + margin: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), + child: Row( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.lightbulb), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 8, + ), + child: Text(message), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/features/config_option/overview/config_options_page.dart b/lib/features/config_option/overview/config_options_page.dart index c493ed29..7c94a9d5 100644 --- a/lib/features/config_option/overview/config_options_page.dart +++ b/lib/features/config_option/overview/config_options_page.dart @@ -5,6 +5,7 @@ import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; import 'package:hiddify/core/model/range.dart'; +import 'package:hiddify/core/widget/tip_card.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; @@ -30,6 +31,10 @@ class ConfigOptionsPage extends HookConsumerWidget { await ref.read(configOptionNotifierProvider.notifier).updateOption(patch); } + String experimental(String txt) { + return "$txt (${t.settings.experimental})"; + } + return Scaffold( appBar: AppBar( title: Text(t.settings.config.pageTitle), @@ -62,6 +67,7 @@ class ConfigOptionsPage extends HookConsumerWidget { body: switch (asyncOptions) { AsyncData(value: final options) => ListView( children: [ + TipCard(message: t.settings.experimentalMsg), ListTile( title: Text(t.settings.config.logLevel), subtitle: Text(options.logLevel.name.toUpperCase()), @@ -251,7 +257,7 @@ class ConfigOptionsPage extends HookConsumerWidget { const SettingsDivider(), SettingsSection(t.settings.config.section.outbound), SwitchListTile( - title: Text(t.settings.config.enableTlsFragment), + title: Text(experimental(t.settings.config.enableTlsFragment)), value: options.enableTlsFragment, onChanged: (value) async => changeOption(ConfigOptionPatch(enableTlsFragment: value)), @@ -291,14 +297,15 @@ class ConfigOptionsPage extends HookConsumerWidget { }, ), SwitchListTile( - title: Text(t.settings.config.enableTlsMixedSniCase), + title: + Text(experimental(t.settings.config.enableTlsMixedSniCase)), value: options.enableTlsMixedSniCase, onChanged: (value) async => changeOption( ConfigOptionPatch(enableTlsMixedSniCase: value), ), ), SwitchListTile( - title: Text(t.settings.config.enableTlsPadding), + title: Text(experimental(t.settings.config.enableTlsPadding)), value: options.enableTlsPadding, onChanged: (value) async => changeOption( ConfigOptionPatch(enableTlsPadding: value), diff --git a/lib/singbox/model/singbox_config_enum.dart b/lib/singbox/model/singbox_config_enum.dart index 67f7be47..cb27ee27 100644 --- a/lib/singbox/model/singbox_config_enum.dart +++ b/lib/singbox/model/singbox_config_enum.dart @@ -25,7 +25,8 @@ enum ServiceMode { String present(TranslationsEn t) => switch (this) { proxy => t.settings.config.serviceModes.proxy, systemProxy => t.settings.config.serviceModes.systemProxy, - tun => t.settings.config.serviceModes.tun, + tun => + "${t.settings.config.serviceModes.tun}${PlatformUtils.isDesktop ? " (${t.settings.experimental})" : ""}", }; }