From ddaf916170435ab0d9a13c3e1a10b24e7d2bf66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:43:52 +0800 Subject: [PATCH] feat: intro page (#416) Fixes #415 --- lib/app.dart | 29 +++++++++- lib/data/res/github_id.dart | 1 + lib/data/store/setting.dart | 2 + lib/intro.dart | 107 +++++++++++++++++++++++++++++++++++ lib/l10n/app_de.arb | 2 + lib/l10n/app_en.arb | 2 + lib/l10n/app_es.arb | 2 + lib/l10n/app_fr.arb | 2 + lib/l10n/app_id.arb | 2 + lib/l10n/app_ja.arb | 2 + lib/l10n/app_nl.arb | 2 + lib/l10n/app_pt.arb | 2 + lib/l10n/app_ru.arb | 2 + lib/l10n/app_zh.arb | 2 + lib/l10n/app_zh_tw.arb | 2 + lib/view/page/home/home.dart | 4 -- pubspec.lock | 4 +- pubspec.yaml | 2 +- 18 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 lib/intro.dart diff --git a/lib/app.dart b/lib/app.dart index aa7971e2..c5f9a8e4 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,10 +3,14 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:fl_lib/l10n/gen_l10n/lib_l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:server_box/core/extension/context/locale.dart'; import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/data/res/rebuild.dart'; import 'package:server_box/data/res/store.dart'; import 'package:server_box/view/page/home/home.dart'; +import 'package:icons_plus/icons_plus.dart'; + +part 'intro.dart'; class MyApp extends StatelessWidget { const MyApp({super.key}); @@ -82,7 +86,30 @@ class MyApp extends StatelessWidget { Widget _buildAppContent(BuildContext ctx) { //if (Pros.app.isWearOS) return const WearHome(); - return const HomePage(); + return const _AppContent( + intro: _IntroPage(), + child: HomePage(), + ); + } +} + +/// It's used for init settings related to [BuildContext] +final class _AppContent extends StatelessWidget { + final Widget child; + final Widget intro; + + const _AppContent({required this.child, required this.intro}); + + @override + Widget build(BuildContext context) { + context.setLibL10n(); + final appL10n = AppLocalizations.of(context); + if (appL10n != null) l10n = appL10n; + + final showIntro = Stores.setting.showIntro.fetch(); + if (showIntro) return intro; + + return child; } } diff --git a/lib/data/res/github_id.dart b/lib/data/res/github_id.dart index 0bd03b4e..e382d575 100644 --- a/lib/data/res/github_id.dart +++ b/lib/data/res/github_id.dart @@ -83,6 +83,7 @@ abstract final class GithubIds { 'geol', 'Mooling0602', 'IllTamer', + 'marlkiller', }; } diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 48fb1607..82165e24 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -280,6 +280,8 @@ class SettingStore extends PersistentStore { /// Format: {width}x{height} late final windowSize = property('windowSize', ''); + late final showIntro = property('showIntro', true); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/intro.dart b/lib/intro.dart new file mode 100644 index 00000000..4fb1e841 --- /dev/null +++ b/lib/intro.dart @@ -0,0 +1,107 @@ +part of 'app.dart'; + +final class _IntroPage extends StatelessWidget { + const _IntroPage(); + + static final _setting = Stores.setting; + static const _kIconSize = 23.0; + static const _introListPad = EdgeInsets.symmetric(horizontal: 17); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, cons) { + final padTop = cons.maxHeight * .2; + return IntroPage( + pages: [ + _buildAppSettings(context, padTop), + _buildRecommended(context, padTop), + ], + onDone: (ctx) { + //Stores.setting.showIntro.put(false); + Navigator.of(ctx).pushReplacement( + MaterialPageRoute(builder: (_) => const HomePage()), + ); + }, + ); + }, + ); + } + + Widget _buildRecommended(BuildContext context, double padTop) { + return ListView( + padding: _introListPad, + children: [ + SizedBox(height: padTop), + const Icon(Bootstrap.stars, size: 35), + SizedBox(height: padTop), + ListTile( + leading: const Icon(MingCute.delete_2_fill), + title: const Text('rm -r'), + subtitle: Text(l10n.sftpRmrDirSummary, style: UIs.textGrey), + trailing: StoreSwitch(prop: _setting.sftpRmrDir), + ).cardx, + ListTile( + leading: const Icon(IonIcons.stats_chart, size: _kIconSize), + title: Text(l10n.parseContainerStats), + subtitle: Text(l10n.parseContainerStatsTip, style: UIs.textGrey), + trailing: StoreSwitch(prop: _setting.containerParseStat), + ).cardx, + ListTile( + leading: const Icon(OctIcons.cpu), + title: Text('CPU ${l10n.noLineChart}'), + subtitle: Text(l10n.cpuViewAsProgressTip, style: UIs.textGrey), + trailing: StoreSwitch(prop: _setting.cpuViewAsProgress), + ).cardx, + ], + ); + } + + Widget _buildAppSettings(BuildContext ctx, double padTop) { + return ListView( + padding: _introListPad, + children: [ + SizedBox(height: padTop), + _buildTitle(l10n.init, big: true), + SizedBox(height: padTop), + ListTile( + leading: const Icon(IonIcons.language), + title: Text(l10n.language), + onTap: () async { + final selected = await ctx.showPickSingleDialog( + title: l10n.language, + items: AppLocalizations.supportedLocales, + name: (p0) => p0.code, + initial: _setting.locale.fetch().toLocale, + ); + if (selected != null) { + _setting.locale.put(selected.code); + RNodes.app.build(); + } + }, + trailing: Text( + l10n.languageName, + style: const TextStyle(fontSize: 15, color: Colors.grey), + ), + ).cardx, + ListTile( + leading: const Icon(Icons.update), + title: Text(l10n.autoCheckUpdate), + subtitle: Text(l10n.fdroidReleaseTip, style: UIs.textGrey), + trailing: StoreSwitch(prop: _setting.autoCheckAppUpdate), + ).cardx, + ], + ); + } + + Widget _buildTitle(String text, {bool big = false}) { + return Center( + child: Text( + text, + style: big + ? const TextStyle(fontSize: 41, fontWeight: FontWeight.w500) + : UIs.textGrey, + ), + ); + } +} diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 7cd69b46..5f3e8368 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -101,6 +101,7 @@ "export": "Export", "extraArgs": "Extra args", "failed": "Failed", + "fdroidReleaseTip": "Wenn Sie diese App von Fdroid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.", "feedback": "Feedback", "feedbackOnGithub": "Wenn du Fragen hast, stelle diese bitte auf Github.", "fieldMustNotEmpty": "Die Eingabefelder dürfen nicht leer sein.", @@ -135,6 +136,7 @@ "imagesList": "Images", "import": "Importieren", "inAppUpdate": "Im App aktualisieren? Andernfalls mit einem Browser herunterladen.", + "init": "Initialisieren", "inner": "Eingebaut", "inputDomainHere": "Domain eingeben", "install": "install", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2d9136cc..5e13b841 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -101,6 +101,7 @@ "export": "Export", "extraArgs": "Extra args", "failed": "Failed", + "fdroidReleaseTip": "If you downloaded this app from Fdroid, it is recommended to turn off this option.", "feedback": "Feedback", "feedbackOnGithub": "If you have any questions, please feedback on Github.", "fieldMustNotEmpty": "These fields must not be empty.", @@ -135,6 +136,7 @@ "imagesList": "Images list", "import": "Import", "inAppUpdate": "Update within the app? Otherwise, download using a browser.", + "init": "Initialize", "inner": "Inner", "inputDomainHere": "Input Domain here", "install": "install", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 120803b3..eaa724c1 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -101,6 +101,7 @@ "export": "Exportar", "extraArgs": "Argumentos extra", "failed": "Fallido", + "fdroidReleaseTip": "Si descargaste esta aplicación desde Fdroid, se recomienda desactivar esta opción.", "feedback": "Retroalimentación", "feedbackOnGithub": "Si tienes algún problema, por favor informa en GitHub", "fieldMustNotEmpty": "Estos campos no pueden estar vacíos.", @@ -135,6 +136,7 @@ "imagesList": "Lista de imágenes", "import": "Importar", "inAppUpdate": "¿Actualizar dentro de la app? De lo contrario, descargar usando un navegador.", + "init": "Inicializar", "inner": "Interno", "inputDomainHere": "Introduce el dominio aquí", "install": "Instalar", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index ec3cc4a9..dbcdcb22 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -101,6 +101,7 @@ "export": "Exporter", "extraArgs": "Arguments supplémentaires", "failed": "Échoué", + "fdroidReleaseTip": "Si vous avez téléchargé cette application depuis Fdroid, il est recommandé de désactiver cette option.", "feedback": "Retour", "feedbackOnGithub": "Si vous avez des questions, veuillez donner votre avis sur Github.", "fieldMustNotEmpty": "Ces champs ne doivent pas être vides.", @@ -135,6 +136,7 @@ "imagesList": "Liste des images", "import": "Importer", "inAppUpdate": "Mettre à jour dans l'application ? Sinon, téléchargez en utilisant un navigateur.", + "init": "Initialiser", "inner": "Interne", "inputDomainHere": "Saisissez le domaine ici", "install": "Installer", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 7f81f66d..42fa2923 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -101,6 +101,7 @@ "export": "Ekspor", "extraArgs": "Args ekstra", "failed": "Gagal", + "fdroidReleaseTip": "Jika Anda mengunduh aplikasi ini dari Fdroid, disarankan untuk mematikan opsi ini.", "feedback": "Masukan", "feedbackOnGithub": "Jika Anda memiliki pertanyaan, silakan umpan balik tentang GitHub.", "fieldMustNotEmpty": "Bidang -bidang ini tidak boleh kosong.", @@ -135,6 +136,7 @@ "imagesList": "Daftar gambar", "import": "Impor", "inAppUpdate": "Perbarui di dalam aplikasi? Jika tidak, unduh menggunakan browser.", + "init": "Menginisialisasi", "inner": "Batin", "inputDomainHere": "Input domain di sini", "install": "Install", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index bff98c37..f490149e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -101,6 +101,7 @@ "export": "エクスポート", "extraArgs": "追加引数", "failed": "失敗しました", + "fdroidReleaseTip": "このアプリをFdroidからダウンロードした場合、このオプションをオフにすることをお勧めします。", "feedback": "フィードバック", "feedbackOnGithub": "問題がある場合は、GitHubでフィードバックしてください", "fieldMustNotEmpty": "これらの入力フィールドは空にできません。", @@ -135,6 +136,7 @@ "imagesList": "イメージリスト", "import": "インポート", "inAppUpdate": "アプリ内で更新しますか?それ以外の場合は、ブラウザを使用してダウンロードしてください。", + "init": "初期化する", "inner": "内蔵", "inputDomainHere": "ここにドメインを入力", "install": "インストール", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 0d6cf40f..b217142a 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -101,6 +101,7 @@ "export": "Exporteren", "extraArgs": "Extra argumenten", "failed": "Mislukt", + "fdroidReleaseTip": "Als u deze app van Fdroid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.", "feedback": "Feedback", "feedbackOnGithub": "Als je vragen hebt, geef dan feedback op Github.", "fieldMustNotEmpty": "Deze velden mogen niet leeg zijn.", @@ -135,6 +136,7 @@ "imagesList": "Lijst met afbeeldingen", "import": "Importeren", "inAppUpdate": "Bijwerken binnen de app? Anders downloaden via een browser.", + "init": "Initialiseren", "inner": "Intern", "inputDomainHere": "Voer hier domein in", "install": "Installeren", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 6da2b4a9..1e30db08 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -101,6 +101,7 @@ "export": "Exportar", "extraArgs": "Argumentos extras", "failed": "Falhou", + "fdroidReleaseTip": "Se você baixou este aplicativo do Fdroid, é recomendado desativar esta opção.", "feedback": "Feedback", "feedbackOnGithub": "Se você tem qualquer problema, por favor, dê feedback no GitHub", "fieldMustNotEmpty": "Estes campos não podem estar vazios.", @@ -135,6 +136,7 @@ "imagesList": "Lista de imagens", "import": "Importar", "inAppUpdate": "Atualizar dentro do app? Caso contrário, baixe usando um navegador.", + "init": "Inicializar", "inner": "Interno", "inputDomainHere": "Insira o domínio aqui", "install": "Instalar", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index be762778..5f4bb01b 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -101,6 +101,7 @@ "export": "экспорт", "extraArgs": "дополнительные аргументы", "failed": "неудача", + "fdroidReleaseTip": "Если вы скачали это приложение с Fdroid, рекомендуется отключить эту опцию.", "feedback": "обратная связь", "feedbackOnGithub": "Если у вас есть какие-либо вопросы, пожалуйста, отправьте отзыв на GitHub", "fieldMustNotEmpty": "Эти поля не могут быть пустыми.", @@ -135,6 +136,7 @@ "imagesList": "список образов", "import": "импорт", "inAppUpdate": "Обновить в приложении? В противном случае загрузите с помощью браузера.", + "init": "Инициализировать", "inner": "встроенный", "inputDomainHere": "введите домен здесь", "install": "установить", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index c5628f59..e1b2701c 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -101,6 +101,7 @@ "export": "导出", "extraArgs": "额外参数", "failed": "失败", + "fdroidReleaseTip": "如果你是从 Fdroid 下载的本应用,推荐关闭此选项", "feedback": "反馈", "feedbackOnGithub": "如果你有任何问题,请在GitHub反馈", "fieldMustNotEmpty": "这些输入框不能为空。", @@ -135,6 +136,7 @@ "imagesList": "镜像列表", "import": "导入", "inAppUpdate": "在App内更新?否则使用浏览器下载", + "init": "初始化", "inner": "内置", "inputDomainHere": "在这里输入域名", "install": "安装", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index a0dfff2c..e329153b 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -101,6 +101,7 @@ "export": "導出", "extraArgs": "額外參數", "failed": "失敗", + "fdroidReleaseTip": "如果你是從 Fdroid 下載的本應用,推薦關閉此選項", "feedback": "反饋", "feedbackOnGithub": "如果你有任何問題,請在GitHub反饋", "fieldMustNotEmpty": "這些輸入框不能為空。", @@ -135,6 +136,7 @@ "imagesList": "鏡像列表", "import": "導入", "inAppUpdate": "在App內更新?否則使用瀏覽器下載。", + "init": "初始化", "inner": "內置", "inputDomainHere": "在這裡輸入域名", "install": "安裝", diff --git a/lib/view/page/home/home.dart b/lib/view/page/home/home.dart index be90f155..e46d0515 100644 --- a/lib/view/page/home/home.dart +++ b/lib/view/page/home/home.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:icons_plus/icons_plus.dart'; import 'package:server_box/core/channel/home_widget.dart'; import 'package:server_box/core/extension/build.dart'; @@ -59,9 +58,6 @@ class _HomePageState extends State @override void didChangeDependencies() { super.didChangeDependencies(); - context.setLibL10n(); - final appL10n = AppLocalizations.of(context); - if (appL10n != null) l10n = appL10n; _isLandscape.value = MediaQuery.of(context).orientation == Orientation.landscape; } diff --git a/pubspec.lock b/pubspec.lock index f1858a68..65265e59 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -385,8 +385,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.48" - resolved-ref: "48e91d023afa5c73970c75b8fc1f5dffa0c809d7" + ref: "v1.0.49" + resolved-ref: "85ae5cfeba1c8a959e0bd83b7e1eff5edc572ab9" url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 8f0e78ff..726d2c2b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,7 +58,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.48 + ref: v1.0.49 dependency_overrides: # dartssh2: