From dce4c41fd177262dde4a3dc38c6fd2a3904c6a98 Mon Sep 17 00:00:00 2001 From: Kherel Date: Thu, 18 Mar 2021 08:26:54 +0100 Subject: [PATCH] update --- assets/fonts/BrandIcons.ttf | Bin 8128 -> 9624 bytes assets/markdown/about-en.md | 12 +++ assets/markdown/about-ru.md | 12 +++ assets/markdown/how_hetzner-en.md | 7 ++ assets/markdown/how_hetzner-ru.md | 7 ++ assets/translations/en.json | 8 +- assets/translations/ru.json | 6 +- lib/config/md_files.dart | 0 .../components/brand_icons/brand_icons.dart | 12 +++ lib/ui/components/brand_md/brand_md.dart | 70 ++++++++++++++++++ lib/ui/pages/initializing/initializing.dart | 41 ++-------- lib/ui/pages/more/about/about.dart | 40 ++-------- .../pages/more/app_settings/app_setting.dart | 3 +- lib/ui/pages/more/info/info.dart | 7 +- lib/ui/pages/more/more.dart | 10 +-- lib/ui/pages/onboarding/onboarding.dart | 2 +- pubspec.lock | 14 ++++ pubspec.yaml | 3 +- 18 files changed, 172 insertions(+), 82 deletions(-) create mode 100644 assets/markdown/about-en.md create mode 100644 assets/markdown/about-ru.md create mode 100644 assets/markdown/how_hetzner-en.md create mode 100644 assets/markdown/how_hetzner-ru.md create mode 100644 lib/config/md_files.dart create mode 100644 lib/ui/components/brand_md/brand_md.dart diff --git a/assets/fonts/BrandIcons.ttf b/assets/fonts/BrandIcons.ttf index 404489f370fdb8ef125f57e9f1e8050f6d44daf8..4d4e0f28991303464768023ec5c44bd77707445e 100644 GIT binary patch delta 1983 zcmY*aeP|nH7=Pb;b9c#o<}R1JOPa5{OD?r*W1BR|+HLKs6XrIZZe1sCQ{$GdW9>S( zs-2+04}__VNji`ziZaDN{6i?{kof`KUlU{sqToOgb#cg0P!P0<&m|e^h2K5T`+U6b z`~05wy?iqM($>>X?RA9k3kad9{d1M0Uz|I99U*EjLIfS0Ju!X#?CD8_=vNTxd3UB- zIS~8x#6^hx4p5o_gTLr|5cCUx^vvAC;v=85euepdfbrt&{Qk=9oz+3ehxyRhTxIbn z-hjRbzX{{ik;+{4k{Vswhmf@m7Br8}A75Dd%7ujV0SFp;@q#m+Kp0{Hcf5J=sr%*i ze;}STz=EzUzO3Jnt-o3o-;ZPmjQxo6tnhewiFyJ*g#W0Y#^X3%zl;ym2PrM+P4HjT zH&Vvlki~hNCmwM6au{qq=DWA3WMGSf|?s$AOmz@(gX5j zqyyLlYD7DL?Vv_a2j0$5Bh~@z5jEl+!1n(1rKA2Q0_OsMavFD*cli(a%K{@z3qOgc z#IKk8=x^m3L8$dMSt22nL4)WZ6kaUlsI22U5(!IK(~SgKhsQ{{1i#^|iy81*5(!zh zJ6u|a^QB>T4fdR2P0yD$;DTo~x&z&SU)Zr3O$V#4F=PT;8>b4?@Y;z-?;Ub;wVcbW z-FJMPTR*?MJ2NJNwDaI}WcGQ}H#flWK0I5+mFD`?ic& z*oFzrlw)oxkJ?YGrm4Q+^S$B8XCyr{Fqrq;j=9W+-(qTT{8}H9GgJ%OlLU^ku4CCU zX2Ob=#CpNXkKFjDm%7R7hiB3ohs-FzR92W+fcffN$^RH3E849CouV zF;~w=a<-<~xd^p6l5;{KCl@pok62ToHY;Xx*^UST&uJp>L^O^Ugb3Awpoo{~h1YIm zuCBY0V=9kF_@olnRNabacWsC$> z9>cIR$Chw{^3<$rfo>$Qp?6$m%Z5m(7;I2ox#p1zmE5S=Dq6*E-S~BZ7ko6K)E-U{ zqwn!XfDXpOvLN9Npo3kI1H2r)wmKcjsp+%|rJOCe>9iX#)zxX$q^_^3rb?X!?I||E ziM*)LG_8rMDTiZ0I$-cYsV2xK*a=1Z!r*u-q_~CE>4K|-(r%$W-QPcZCkH>e^Rg$~ zJ$#-l0s|BpMRQR52+lw+vQQ_G0F42?%|I9mg@e>#1_*%mg0I}=qFi!G4rgm_7Tyrw z4)X@k+;QNpoS-1JeanEkGAJ-VuHe^vjNi|TGBF)yXmE<-1VyByJpk)4K7`&C zyh^rFU&7aN00_;vz-8xB& zW&h8tB-*0HF2B<=LU5w~Q({oSQQU)LIF1uIS=W;b0e|(#!9z!?)noPNlKCuse5P`= k${wzsn33_esZF#p1l?W1IrH} z-zYb+qJYty;So??0?1d$OUz9@B_uT^mVrTf4FdzSL_vOWiQw7uK(^cwpn_i$_bA&- zFfam{K _BrandMarkdownState(); +} + +class _BrandMarkdownState extends State { + String _mdContent = ''; + + @override + void initState() { + super.initState(); + _loadMdFile(); + } + + void _loadMdFile() async { + String mdFromFile = await rootBundle + .loadString('assets/markdown/${widget.fileName}-${'locale'.tr()}.md'); + setState(() { + _mdContent = mdFromFile; + }); + } + + @override + Widget build(BuildContext context) { + var isDark = Theme.of(context).brightness == Brightness.dark; + var markdown = MarkdownStyleSheet( + p: defaultTextStyle, + h1: headline1Style.copyWith( + color: isDark ? BrandColors.white : null, + ), + h2: headline2Style.copyWith( + color: isDark ? BrandColors.white : null, + ), + h3: headline3Style.copyWith( + color: isDark ? BrandColors.white : null, + ), + h4: headline4Style.copyWith( + color: isDark ? BrandColors.white : null, + ), + ); + return Markdown( + styleSheet: markdown, + onTapLink: (String text, String? href, String title) { + if (href != null) { + canLaunch(href).then((canLaunchURL) { + if (canLaunchURL) { + launch(href); + } + }); + } + }, + data: _mdContent, + ); + } +} diff --git a/lib/ui/pages/initializing/initializing.dart b/lib/ui/pages/initializing/initializing.dart index 5f39d543..4375f422 100644 --- a/lib/ui/pages/initializing/initializing.dart +++ b/lib/ui/pages/initializing/initializing.dart @@ -1,9 +1,7 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/config/brand_theme.dart'; -import 'package:selfprivacy/config/text_themes.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/backblaze_form_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/cloudflare_form_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/domain_cloudflare.dart'; @@ -13,8 +11,8 @@ import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_card/brand_card.dart'; +import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; -import 'package:selfprivacy/ui/components/brand_span_button/brand_span_button.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/brand_timer/brand_timer.dart'; import 'package:selfprivacy/ui/components/progress_bar/progress_bar.dart'; @@ -488,41 +486,12 @@ class _HowHetzner extends StatelessWidget { @override Widget build(BuildContext context) { - var isDark = Theme.of(context).brightness == Brightness.dark; - return BrandModalSheet( child: Padding( - padding: brandPagePadding2, - child: Column( - children: [ - SizedBox(height: 40), - BrandText.h2('initializing.18'.tr()), - SizedBox(height: 20), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: 'initializing.19'.tr(), - style: body1Style.copyWith( - color: isDark ? BrandColors.white : BrandColors.black, - ), - ), - BrandSpanButton.link( - text: 'hetzner.com', - urlString: 'https://hetzner.com', - ), - TextSpan( - text: 'initializing.20'.tr(), - style: body1Style.copyWith( - color: isDark ? BrandColors.white : BrandColors.black, - ), - ), - ], - ), - ), - ], - ), - ), + padding: brandPagePadding1, + child: BrandMarkdown( + fileName: 'how_hetzner', + )), ); } } diff --git a/lib/ui/pages/more/about/about.dart b/lib/ui/pages/more/about/about.dart index ac31338f..b927c785 100644 --- a/lib/ui/pages/more/about/about.dart +++ b/lib/ui/pages/more/about/about.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:selfprivacy/config/brand_theme.dart'; -import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; -import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; class AboutPage extends StatelessWidget { const AboutPage({Key? key}) : super(key: key); @@ -12,37 +11,14 @@ class AboutPage extends StatelessWidget { return SafeArea( child: Scaffold( appBar: PreferredSize( - child: BrandHeader(title: 'О проекте', hasBackButton: true), + child: BrandHeader( + title: 'more.about_project'.tr(), hasBackButton: true), preferredSize: Size.fromHeight(52), ), - body: ListView( - padding: brandPagePadding2, - children: [ - BrandDivider(), - SizedBox(height: 20), - BrandText.h3('О проекте'), - SizedBox(height: 10), - BrandText.body1( - 'Всё больше организаций хотят владеть нашими данными'), - SizedBox(height: 10), - BrandText.body1( - 'А мы сами хотим распоряжаться своими данными на своем сервере.'), - SizedBox(height: 20), - BrandDivider(), - SizedBox(height: 10), - BrandText.h3('Миссия проекта'), - SizedBox(height: 10), - BrandText.body1( - 'Цифровая независимость и приватность доступная каждому'), - SizedBox(height: 20), - BrandDivider(), - SizedBox(height: 10), - BrandText.h3('Цель'), - SizedBox(height: 10), - BrandText.body1( - 'Развивать программу, которая позволит каждому создавать приватные сервисы для себя и своих близких'), - SizedBox(height: 10), - ], + body: Container( + child: BrandMarkdown( + fileName: 'about', + ), ), ), ); diff --git a/lib/ui/pages/more/app_settings/app_setting.dart b/lib/ui/pages/more/app_settings/app_setting.dart index 279b6443..8d3d33c1 100644 --- a/lib/ui/pages/more/app_settings/app_setting.dart +++ b/lib/ui/pages/more/app_settings/app_setting.dart @@ -9,6 +9,7 @@ import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/utils/named_font_weight.dart'; +import 'package:easy_localization/easy_localization.dart'; class AppSettingsPage extends StatefulWidget { const AppSettingsPage({Key? key}) : super(key: key); @@ -27,7 +28,7 @@ class _AppSettingsPageState extends State { return Scaffold( appBar: PreferredSize( child: - BrandHeader(title: 'Настройки приложения', hasBackButton: true), + BrandHeader(title: 'more.settings'.tr(), hasBackButton: true), preferredSize: Size.fromHeight(52), ), body: ListView( diff --git a/lib/ui/pages/more/info/info.dart b/lib/ui/pages/more/info/info.dart index 21906e5d..1ed6aea4 100644 --- a/lib/ui/pages/more/info/info.dart +++ b/lib/ui/pages/more/info/info.dart @@ -4,6 +4,7 @@ import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:package_info/package_info.dart'; +import 'package:easy_localization/easy_localization.dart'; class InfoPage extends StatelessWidget { const InfoPage({Key? key}) : super(key: key); @@ -13,7 +14,7 @@ class InfoPage extends StatelessWidget { return SafeArea( child: Scaffold( appBar: PreferredSize( - child: BrandHeader(title: 'О приложении', hasBackButton: true), + child: BrandHeader(title: 'more.about_app'.tr(), hasBackButton: true), preferredSize: Size.fromHeight(52), ), body: ListView( @@ -24,8 +25,8 @@ class InfoPage extends StatelessWidget { FutureBuilder( future: _version(), builder: (context, snapshot) { - return BrandText.body1( - 'Тут любая служебная информация, v.${snapshot.data}'); + return BrandText.body1('more.about_app_page.text' + .tr(args: [snapshot.data.toString()])); }), ], ), diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index acd7bb0a..8959d87a 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -35,7 +35,7 @@ class MorePage extends StatelessWidget { BrandDivider(), _NavItem( title: 'more.configuration_wizard'.tr(), - iconData: BrandIcons.settings, + iconData: BrandIcons.triangle, goTo: InitializingPage(), ), _NavItem( @@ -45,22 +45,22 @@ class MorePage extends StatelessWidget { ), _NavItem( title: 'more.about_project'.tr(), - iconData: BrandIcons.triangle, + iconData: BrandIcons.engineer, goTo: AboutPage(), ), _NavItem( title: 'more.about_app'.tr(), - iconData: BrandIcons.help, + iconData: BrandIcons.fire, goTo: InfoPage(), ), _NavItem( title: 'more.onboarding'.tr(), - iconData: BrandIcons.triangle, + iconData: BrandIcons.start, goTo: OnboardingPage(nextPage: RootPage()), ), _NavItem( title: 'more.console'.tr(), - iconData: BrandIcons.triangle, + iconData: BrandIcons.terminal, goTo: Console(), ), ], diff --git a/lib/ui/pages/onboarding/onboarding.dart b/lib/ui/pages/onboarding/onboarding.dart index c0418d15..07790f60 100644 --- a/lib/ui/pages/onboarding/onboarding.dart +++ b/lib/ui/pages/onboarding/onboarding.dart @@ -58,7 +58,7 @@ class _OnboardingPageState extends State { 'onboarding.page1_title'.tr(), ), SizedBox(height: 20), - BrandText.body2('services.page1_text'.tr()), + BrandText.body2('onboarding.page1_text'.tr()), Flexible( child: Center( child: Image.asset( diff --git a/pubspec.lock b/pubspec.lock index bb1f548e..a7267e00 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -298,6 +298,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.0" flutter_secure_storage: dependency: "direct main" description: @@ -420,6 +427,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + markdown: + dependency: transitive + description: + name: markdown + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" mask_text_input_formatter: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 215913e7..b891badd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: either_option: ^2.0.1-dev.1 equatable: ^2.0.0 flutter_bloc: ^7.0.0-nullsafety.5 + flutter_markdown: ^0.6.0 flutter_secure_storage: ^4.1.0 get_it: ^6.0.0 hive: ^2.0.0 @@ -49,6 +50,7 @@ flutter: - assets/images/onboarding/ - assets/images/logos/ - assets/translations/ + - assets/markdown/ fonts: - family: BrandIcons fonts: @@ -64,4 +66,3 @@ flutter: weight: 700 - asset: assets/fonts/Inter-ExtraBold.ttf weight: 800 - \ No newline at end of file