diff --git a/assets/translations/en.json b/assets/translations/en.json index cafb848a82..76165d9be2 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -34,7 +34,7 @@ "onboarding": "Onboarding", "console": "Console", "about_app_page": { - "text": "Тут любая служебная информация, v.{}" + "text": "Application version v.{}" }, "settings": { "title": "Application settings", @@ -188,7 +188,10 @@ "20": "\n", "21": "One more restart to apply your security certificates.", "22": "Create master account", - "23": "Enter a nickname and strong password" + "23": "Enter a nickname and strong password", + "finish": "Everything is initialized", + "checks": "Checks have been completed \n{} ouf of {}" + }, "modals": { "_comment": "messages in modals", @@ -208,5 +211,12 @@ "title": "Jobs list", "start": "Start", "empty": "No jobs" + }, + "validations": { + "required": "required", + "invalid_format": "invalid format", + "root_name": "User name cannot be 'root'", + "key_format": "invalid key format", + "length": "length is [] shoud be {}" } } \ No newline at end of file diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 13b9658e41..0fba1284e2 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -188,7 +188,9 @@ "20": "\n2 Заходим в созданный нами проект. Если такового - нет, значит создаём.\n3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика).\n4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему.\n5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же вы используете мобильную версию сайта, в нижнем правом углу вы увидите красный плюсик. Нажимаем на эту кнопку.\n6 В поле Description, даём нашему токену название (это может быть любое название, которые вам нравиться. Сути оно не меняет.", "21": "Сейчас будет дополнительная перезагрузка для активации сертификатов безопастности", "22": "Создайте главную учетную запись", - "23": "Введите никнейм и сложный пароль" + "23": "Введите никнейм и сложный пароль", + "finish": "Все инициализировано", + "checks": "Проверок выполнено: \n{} / {}" }, "modals": { "_comment": "messages in modals", @@ -209,5 +211,12 @@ "title": "Задачи", "start": "Начать выполенение", "empty": "Пусто" + }, + "validations": { + "required": "обязательное поле", + "invalid_format": "неверный формат", + "root_name": "Имя пользователя не может быть'root'", + "key_format": "неверный формат", + "length": "Длина строки [] должна быть {}" } } \ No newline at end of file diff --git a/lib/logic/api_maps/server.dart b/lib/logic/api_maps/server.dart index 3d64a4dc17..071680063c 100644 --- a/lib/logic/api_maps/server.dart +++ b/lib/logic/api_maps/server.dart @@ -47,11 +47,21 @@ class ServerApi extends ApiMap { var client = await getClient(); try { - response = await client.get('/createUser'); + response = await client.post( + '/createUser', + options: Options( + headers: { + "X-Username": user.login, + "X-Password": user.password, + }, + ), + ); res = response.statusCode == HttpStatus.ok; } catch (e) { + print(e); res = false; } + close(client); return res; } diff --git a/lib/logic/cubit/app_config/app_config_state.dart b/lib/logic/cubit/app_config/app_config_state.dart index 6b9880c929..1269f9305f 100644 --- a/lib/logic/cubit/app_config/app_config_state.dart +++ b/lib/logic/cubit/app_config/app_config_state.dart @@ -85,7 +85,17 @@ class AppConfigState extends Equatable { bool get isServerCreated => hetznerServer != null; bool get isFullyInitilized => _fulfilementList.every((el) => el!); - int get progress => _fulfilementList.where((el) => el!).length; + int get progress => _fulfilementList.where((el) => el!).length ; + + int get porgressBar { + if (progress < 6) { + return progress; + } else if (progress < 10) { + return 6; + } else { + return 7; + } + } List get _fulfilementList { var res = [ diff --git a/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart b/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart index 123553cfdb..eda069393c 100644 --- a/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart @@ -3,6 +3,7 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/api_maps/backblaze.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/models/backblaze_credential.dart'; +import 'package:easy_localization/easy_localization.dart'; class BackblazeFormCubit extends FormCubit { BackblazeFormCubit(this.initializingCubit) { @@ -10,7 +11,7 @@ class BackblazeFormCubit extends FormCubit { keyId = FieldCubit( initalValue: '', validations: [ - RequiredStringValidation('required'), + RequiredStringValidation('validations.required'.tr()), //ValidationModel( //(s) => regExp.hasMatch(s), 'invalid key format'), //LegnthStringValidationWithLenghShowing(64, 'length is [] shoud be 64') diff --git a/lib/logic/cubit/forms/initializing/cloudflare_form_cubit.dart b/lib/logic/cubit/forms/initializing/cloudflare_form_cubit.dart index 883470c895..2654caa9d8 100644 --- a/lib/logic/cubit/forms/initializing/cloudflare_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/cloudflare_form_cubit.dart @@ -4,6 +4,7 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/api_maps/cloudflare.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart'; +import 'package:easy_localization/easy_localization.dart'; class CloudFlareFormCubit extends FormCubit { CloudFlareFormCubit(this.initializingCubit) { @@ -11,10 +12,11 @@ class CloudFlareFormCubit extends FormCubit { apiKey = FieldCubit( initalValue: '', validations: [ - RequiredStringValidation('required'), + RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => regExp.hasMatch(s), 'invalid key format'), - LegnthStringValidationWithLenghShowing(40, 'length is [] shoud be 40') + (s) => regExp.hasMatch(s), 'validations.key_format'.tr()), + LegnthStringValidationWithLenghShowing( + 40, 'validations.length'.tr(args: ["40"])) ], ); diff --git a/lib/logic/cubit/forms/initializing/hetzner_form_cubit.dart b/lib/logic/cubit/forms/initializing/hetzner_form_cubit.dart index a9e8950121..4824ff2ee9 100644 --- a/lib/logic/cubit/forms/initializing/hetzner_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/hetzner_form_cubit.dart @@ -4,6 +4,7 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/api_maps/hetzner.dart'; import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; +import 'package:easy_localization/easy_localization.dart'; class HetznerFormCubit extends FormCubit { HetznerFormCubit(this.initializingCubit) { @@ -11,10 +12,10 @@ class HetznerFormCubit extends FormCubit { apiKey = FieldCubit( initalValue: '', validations: [ - RequiredStringValidation('required'), + RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => regExp.hasMatch(s), 'invalid key format'), - LegnthStringValidationWithLenghShowing(64, 'length is [] shoud be 64') + (s) => regExp.hasMatch(s), 'validations.key_format'.tr()), + LegnthStringValidationWithLenghShowing(64, 'validations.length'.tr(args: ["64"])) ], ); diff --git a/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart b/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart index b82bd0f367..5fb172a2b6 100644 --- a/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/models/user.dart'; +import 'package:easy_localization/easy_localization.dart'; class RootUserFormCubit extends FormCubit { RootUserFormCubit(this.initializingCubit) { @@ -12,18 +13,20 @@ class RootUserFormCubit extends FormCubit { userName = FieldCubit( initalValue: '', validations: [ - RequiredStringValidation('required'), ValidationModel( - (s) => userRegExp.hasMatch(s), 'invalid format'), + (s) => s.toLowerCase() == 'root', 'validations.root_name'.tr()), + RequiredStringValidation('validations.required'.tr()), + ValidationModel( + (s) => userRegExp.hasMatch(s), 'validations.invalid_format'.tr()), ], ); password = FieldCubit( initalValue: '', validations: [ - RequiredStringValidation('required'), + RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => passwordRegExp.hasMatch(s), 'invalid format'), + (s) => passwordRegExp.hasMatch(s), 'validations.invalid_format'.tr()), ], ); diff --git a/lib/logic/cubit/forms/user/user_form_cubit.dart b/lib/logic/cubit/forms/user/user_form_cubit.dart index 50de369e37..5db9ad6f0a 100644 --- a/lib/logic/cubit/forms/user/user_form_cubit.dart +++ b/lib/logic/cubit/forms/user/user_form_cubit.dart @@ -1,9 +1,11 @@ import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; -import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; +import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; +import 'package:selfprivacy/logic/models/jobs/job.dart'; import 'package:selfprivacy/logic/models/user.dart'; import 'package:selfprivacy/utils/password_generator.dart'; +import 'package:easy_localization/easy_localization.dart'; class UserFormCubit extends FormCubit { UserFormCubit({ @@ -18,18 +20,18 @@ class UserFormCubit extends FormCubit { login = FieldCubit( initalValue: isEdit ? user!.login : '', validations: [ - RequiredStringValidation('required'), + RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => userRegExp.hasMatch(s), 'invalid format'), + (s) => userRegExp.hasMatch(s), 'validations.invalid_format'.tr()), ], ); password = FieldCubit( initalValue: isEdit ? user!.password : genPass(), validations: [ - RequiredStringValidation('required'), - ValidationModel( - (s) => passwordRegExp.hasMatch(s), 'invalid format'), + RequiredStringValidation('validations.required'.tr()), + ValidationModel((s) => passwordRegExp.hasMatch(s), + 'validations.invalid_format'.tr()), ], ); @@ -42,7 +44,7 @@ class UserFormCubit extends FormCubit { login: login.state.value, password: password.state.value, ); - usersCubit.addUser(user); + usersCubit.addJob(CreateUserJob(user: user)); } late FieldCubit login; @@ -52,5 +54,5 @@ class UserFormCubit extends FormCubit { password.externalSetValue(genPass()); } - late UsersCubit usersCubit; + late JobsCubit usersCubit; } diff --git a/lib/logic/cubit/jobs/jobs_cubit.dart b/lib/logic/cubit/jobs/jobs_cubit.dart index f511963cea..ee4b9ed056 100644 --- a/lib/logic/cubit/jobs/jobs_cubit.dart +++ b/lib/logic/cubit/jobs/jobs_cubit.dart @@ -24,7 +24,7 @@ class JobsCubit extends Cubit { Future applyAll() async { for (var job in state.jobList) { if (job is CreateUserJob) { - await api.createUser(job.user); + // await api.createUser(job.user); } } emit(JobsState.emtpy()); diff --git a/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart b/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart index 2f8b0baa53..d5718181b2 100644 --- a/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart +++ b/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart @@ -2,18 +2,37 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; class BrandBottomSheet extends StatelessWidget { - const BrandBottomSheet({Key? key, required this.child}) : super(key: key); + const BrandBottomSheet({ + Key? key, + required this.child, + this.isExpended = false, + }) : super(key: key); final Widget child; + final bool isExpended; @override Widget build(BuildContext context) { var mainHeight = MediaQuery.of(context).size.height - MediaQuery.of(context).padding.top - 100; + late Widget innerWidget; + if (isExpended) { + innerWidget = Scaffold( + body: child, + ); + } else { + final ThemeData themeData = Theme.of(context); + + innerWidget = Material( + color: themeData.scaffoldBackgroundColor, + child: IntrinsicHeight(child: child), + ); + } return ConstrainedBox( constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6), child: Column( + mainAxisSize: MainAxisSize.min, children: [ Center( child: Container( @@ -27,10 +46,10 @@ class BrandBottomSheet extends StatelessWidget { ), SizedBox(height: 6), ClipRRect( - borderRadius: BorderRadius.circular(20), + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), child: ConstrainedBox( constraints: BoxConstraints(maxHeight: mainHeight), - child: Scaffold(body: child), + child: innerWidget, ), ), ], diff --git a/lib/ui/components/brand_md/brand_md.dart b/lib/ui/components/brand_md/brand_md.dart index c130136c72..230b56194a 100644 --- a/lib/ui/components/brand_md/brand_md.dart +++ b/lib/ui/components/brand_md/brand_md.dart @@ -56,6 +56,7 @@ class _BrandMarkdownState extends State { ), ); return Markdown( + shrinkWrap: true, styleSheet: markdown, onTapLink: (String text, String? href, String title) { if (href != null) { diff --git a/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart b/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart index 7670c94dbd..6435f7bc38 100644 --- a/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart +++ b/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart @@ -1,63 +1,63 @@ -import 'package:flutter/material.dart'; +// import 'package:flutter/material.dart'; -var navigatorKey = GlobalKey(); +// var navigatorKey = GlobalKey(); -class BrandModalSheet extends StatelessWidget { - const BrandModalSheet({ - Key? key, - this.child, - }) : super(key: key); +// class BrandModalSheet extends StatelessWidget { +// const BrandModalSheet({ +// Key? key, +// this.child, +// }) : super(key: key); - final Widget? child; - @override - Widget build(BuildContext context) { - return DraggableScrollableSheet( - minChildSize: 0.95, - initialChildSize: 1, - maxChildSize: 1, - builder: (context, scrollController) { - return SingleChildScrollView( - controller: scrollController, - physics: ClampingScrollPhysics(), - child: Container( - child: Column( - children: [ - GestureDetector( - onTap: () => Navigator.of(context).pop(), - behavior: HitTestBehavior.opaque, - child: Container( - width: double.infinity, - child: Center( - child: Padding( - padding: EdgeInsets.only(top: 132, bottom: 6), - child: Container( - height: 4, - width: 30, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2), - color: Color(0xFFE3E3E3).withOpacity(0.65), - ), - ), - ), - ), - ), - ), - Container( - constraints: BoxConstraints( - minHeight: MediaQuery.of(context).size.height - 132, - maxHeight: MediaQuery.of(context).size.height - 132, - ), - decoration: BoxDecoration( - borderRadius: - BorderRadius.vertical(top: Radius.circular(20)), - color: Theme.of(context).scaffoldBackgroundColor, - ), - width: double.infinity, - child: child), - ], - ), - ), - ); - }); - } -} +// final Widget? child; +// @override +// Widget build(BuildContext context) { +// return DraggableScrollableSheet( +// minChildSize: 1, +// initialChildSize: 1, +// maxChildSize: 1, +// builder: (context, scrollController) { +// return SingleChildScrollView( +// controller: scrollController, +// physics: ClampingScrollPhysics(), +// child: Container( +// child: Column( +// children: [ +// GestureDetector( +// onTap: () => Navigator.of(context).pop(), +// behavior: HitTestBehavior.opaque, +// child: Container( +// width: double.infinity, +// child: Center( +// child: Padding( +// padding: EdgeInsets.only(top: 132, bottom: 6), +// child: Container( +// height: 4, +// width: 30, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(2), +// color: Color(0xFFE3E3E3).withOpacity(0.65), +// ), +// ), +// ), +// ), +// ), +// ), +// Container( +// constraints: BoxConstraints( +// minHeight: MediaQuery.of(context).size.height - 132, +// maxHeight: MediaQuery.of(context).size.height - 132, +// ), +// decoration: BoxDecoration( +// borderRadius: +// BorderRadius.vertical(top: Radius.circular(20)), +// color: Theme.of(context).scaffoldBackgroundColor, +// ), +// width: double.infinity, +// child: child), +// ], +// ), +// ), +// ); +// }); +// } +// } diff --git a/lib/ui/components/jobs_content/jobs_content.dart b/lib/ui/components/jobs_content/jobs_content.dart index c89773ab82..e815826f62 100644 --- a/lib/ui/components/jobs_content/jobs_content.dart +++ b/lib/ui/components/jobs_content/jobs_content.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/config/brand_colors.dart'; +import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; @@ -12,7 +13,8 @@ class JobsContent extends StatelessWidget { @override Widget build(BuildContext context) { var jobs = context.watch().state; - return Column( + return ListView( + padding: paddingH15V0, children: [ SizedBox(height: 15), Center( @@ -20,11 +22,8 @@ class JobsContent extends StatelessWidget { 'jobs.title'.tr(), ), ), - if (jobs.isEmpty) - Padding( - padding: const EdgeInsets.only(top: 50), - child: BrandText.body1('jobs.empty'.tr()), - ), + SizedBox(height: 20), + if (jobs.isEmpty) BrandText.body1('jobs.empty'.tr()), if (!jobs.isEmpty) ...[ ...jobs.jobList .map( diff --git a/lib/ui/components/pre_styled_buttons/flash.dart b/lib/ui/components/pre_styled_buttons/flash.dart index 0049699d28..30151a56e5 100644 --- a/lib/ui/components/pre_styled_buttons/flash.dart +++ b/lib/ui/components/pre_styled_buttons/flash.dart @@ -15,12 +15,25 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> @override void initState() { _animationController = - AnimationController(vsync: this, duration: Duration(milliseconds: 600)); + AnimationController(vsync: this, duration: Duration(milliseconds: 800)); _colorTween = ColorTween( begin: BrandColors.black, end: BrandColors.primary, ).animate(_animationController); + super.initState(); + WidgetsBinding.instance!.addPostFrameCallback(_afterLayout); + } + + void _afterLayout(_) { + if (Theme.of(context).brightness == Brightness.dark) { + setState(() { + _colorTween = ColorTween( + begin: BrandColors.white, + end: BrandColors.primary, + ).animate(_animationController); + }); + } } @override @@ -48,13 +61,10 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> }, child: IconButton( onPressed: () { - showCupertinoModalBottomSheet( - barrierColor: Colors.black45, - expand: false, + showBrandBottomSheet( context: context, - shadow: BoxShadow(color: Colors.transparent), - backgroundColor: Colors.transparent, builder: (context) => BrandBottomSheet( + isExpended: true, child: JobsContent(), ), ); @@ -62,9 +72,13 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> icon: AnimatedBuilder( animation: _colorTween, builder: (context, child) { - return Icon( - icon, - color: _colorTween.value, + var v = _animationController.value; + return Transform.scale( + scale: 1 + (v < 0.5 ? v : 1 - v) * 2, + child: Icon( + icon, + color: _colorTween.value, + ), ); }), ), diff --git a/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart b/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart index f2ce87c95a..e9b7cc85ba 100644 --- a/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart +++ b/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ionicons/ionicons.dart'; import 'package:selfprivacy/config/brand_colors.dart'; @@ -6,8 +7,8 @@ import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/jobs_content/jobs_content.dart'; +import 'package:selfprivacy/ui/helpers/modals.dart'; part 'close.dart'; part 'flash.dart'; diff --git a/lib/ui/components/progress_bar/progress_bar.dart b/lib/ui/components/progress_bar/progress_bar.dart index a75c44fa6a..41b23c8654 100644 --- a/lib/ui/components/progress_bar/progress_bar.dart +++ b/lib/ui/components/progress_bar/progress_bar.dart @@ -53,9 +53,9 @@ class _ProgressBarState extends State { width: 10, ), ); - even.add( + odd.add( SizedBox( - width: 10, + width: 20, ), ); diff --git a/lib/ui/helpers/modals.dart b/lib/ui/helpers/modals.dart new file mode 100644 index 0000000000..69f6b6d805 --- /dev/null +++ b/lib/ui/helpers/modals.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; + +Future showBrandBottomSheet({ + required BuildContext context, + required WidgetBuilder builder, +}) => + showCupertinoModalBottomSheet( + builder: builder, + barrierColor: Colors.black45, + context: context, + shadow: BoxShadow(color: Colors.transparent), + backgroundColor: Colors.transparent, + ); diff --git a/lib/ui/pages/initializing/initializing.dart b/lib/ui/pages/initializing/initializing.dart index ea0e854413..202d22f45b 100644 --- a/lib/ui/pages/initializing/initializing.dart +++ b/lib/ui/pages/initializing/initializing.dart @@ -10,10 +10,10 @@ import 'package:selfprivacy/logic/cubit/forms/initializing/hetzner_form_cubit.da import 'package:selfprivacy/logic/cubit/forms/initializing/root_user_form_cubit.dart'; 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_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.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_text/brand_text.dart'; import 'package:selfprivacy/ui/components/brand_timer/brand_timer.dart'; import 'package:selfprivacy/ui/components/progress_bar/progress_bar.dart'; @@ -36,7 +36,7 @@ class InitializingPage extends StatelessWidget { () => _stepCheck(cubit), () => _stepCheck(cubit), () => _stepCheck(cubit), - () => Container(child: Text('Everythigng is initialized')) + () => Container(child: Center(child: Text('initializing.finish'.tr()))) ][cubit.state.progress](); return BlocListener( listener: (context, state) { @@ -59,12 +59,9 @@ class InitializingPage extends StatelessWidget { 'Domain', 'User', 'Server', - ' ✅', - ' ✅', - ' ✅', - ' ✅', + '✅ Check', ], - activeIndex: cubit.state.progress, + activeIndex: cubit.state.porgressBar, ), ), _addCard( @@ -443,21 +440,29 @@ class InitializingPage extends StatelessWidget { Widget _stepCheck(AppConfigCubit appConfigCubit) { assert(appConfigCubit.state is TimerState, 'wronge state'); var state = appConfigCubit.state as TimerState; - + late int doneCount; late String? text; if (state.isServerResetedSecondTime) { text = 'initializing.13'.tr(); + doneCount = 3; } else if (state.isServerResetedFirstTime) { text = 'initializing.21'.tr(); + doneCount = 2; } else if (state.isServerStarted) { text = 'initializing.14'.tr(); + doneCount = 1; } else if (state.isServerCreated) { text = 'initializing.15'.tr(); + doneCount = 0; } return Builder(builder: (context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox(height: 15), + BrandText.h4( + 'initializing.checks'.tr(args: [doneCount.toString(), "4"]), + ), Spacer(flex: 2), SizedBox(height: 10), BrandText.body2(text), @@ -501,12 +506,14 @@ class _HowHetzner extends StatelessWidget { @override Widget build(BuildContext context) { - return BrandModalSheet( + return BrandBottomSheet( + isExpended: true, child: Padding( - padding: paddingH15V0.copyWith(top: 25), - child: BrandMarkdown( - fileName: 'how_hetzner', - )), + padding: paddingH15V0, + child: BrandMarkdown( + fileName: 'how_hetzner', + ), + ), ); } } diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart index 516b4659f1..5e7ec7a6b9 100644 --- a/lib/ui/pages/providers/providers.dart +++ b/lib/ui/pages/providers/providers.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; @@ -9,12 +8,11 @@ import 'package:selfprivacy/logic/models/state_types.dart'; import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; -import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart'; +import 'package:selfprivacy/ui/helpers/modals.dart'; import 'package:selfprivacy/ui/pages/server_details/server_details.dart'; -import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/utils/ui_helpers.dart'; @@ -87,13 +85,10 @@ class _Card extends StatelessWidget { case ProviderType.server: title = 'providers.server.card_title'.tr(); stableText = 'providers.server.status'.tr(); - onTap = () => showCupertinoModalBottomSheet( - barrierColor: Colors.black45, - expand: false, + onTap = () => showBrandBottomSheet( context: context, - shadow: BoxShadow(color: Colors.transparent), - backgroundColor: Colors.transparent, builder: (context) => BrandBottomSheet( + isExpended: true, child: ServerDetails(), ), ); @@ -104,10 +99,8 @@ class _Card extends StatelessWidget { message = domainName; stableText = 'providers.domain.status'.tr(); - onTap = () => showModalBottomSheet( + onTap = () => showBrandBottomSheet( context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, builder: (BuildContext context) { return _ProviderDetails( provider: provider, @@ -203,37 +196,31 @@ class _ProviderDetails extends StatelessWidget { ]; break; } - return BrandModalSheet( - child: Navigator( - key: navigatorKey, - initialRoute: '/', - onGenerateRoute: (_) { - return materialRoute( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 40), - Padding( - padding: paddingH15V0, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - IconStatusMask( - status: provider.state, - child: - Icon(provider.icon, size: 40, color: Colors.white), - ), - SizedBox(height: 10), - BrandText.h1(title), - SizedBox(height: 10), - ...children - ], + return BrandBottomSheet( + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 40), + Padding( + padding: paddingH15V0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconStatusMask( + status: provider.state, + child: Icon(provider.icon, size: 40, color: Colors.white), ), - ) - ], - ), - ); - }, + SizedBox(height: 10), + BrandText.h1(title), + SizedBox(height: 10), + ...children, + SizedBox(height: 30), + ], + ), + ) + ], + ), ), ); } diff --git a/lib/ui/pages/users/new_user.dart b/lib/ui/pages/users/new_user.dart index 04792623d1..ed35c2e346 100644 --- a/lib/ui/pages/users/new_user.dart +++ b/lib/ui/pages/users/new_user.dart @@ -7,10 +7,10 @@ class _NewUser extends StatelessWidget { var domainName = UiHelpers.getDomainName(config); - return BrandModalSheet( + return BrandBottomSheet( child: BlocProvider( create: (context) => - UserFormCubit(usersCubit: context.read()), + UserFormCubit(usersCubit: context.read()), child: Builder(builder: (context) { var formCubitState = context.watch().state; @@ -22,6 +22,7 @@ class _NewUser extends StatelessWidget { }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ BrandHeader( title: 'users.new_user'.tr(), @@ -30,12 +31,15 @@ class _NewUser extends StatelessWidget { Padding( padding: paddingH15V0, child: Column( + mainAxisSize: MainAxisSize.min, children: [ - CubitFormTextField( - formFieldCubit: context.read().login, - decoration: InputDecoration( - labelText: 'users.login'.tr(), - suffixText: '@$domainName', + IntrinsicHeight( + child: CubitFormTextField( + formFieldCubit: context.read().login, + decoration: InputDecoration( + labelText: 'users.login'.tr(), + suffixText: '@$domainName', + ), ), ), SizedBox(height: 20), diff --git a/lib/ui/pages/users/user.dart b/lib/ui/pages/users/user.dart index dc7249483b..5be15912dd 100644 --- a/lib/ui/pages/users/user.dart +++ b/lib/ui/pages/users/user.dart @@ -8,10 +8,8 @@ class _User extends StatelessWidget { Widget build(BuildContext context) { return InkWell( onTap: () { - showModalBottomSheet( + showBrandBottomSheet( context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, builder: (BuildContext context) { return _UserDetails(user: user); }, diff --git a/lib/ui/pages/users/user_details.dart b/lib/ui/pages/users/user_details.dart index 517c98ab4f..eae8217ce6 100644 --- a/lib/ui/pages/users/user_details.dart +++ b/lib/ui/pages/users/user_details.dart @@ -14,9 +14,11 @@ class _UserDetails extends StatelessWidget { var domainName = UiHelpers.getDomainName(config); - return BrandModalSheet( + return BrandBottomSheet( + isExpended: true, child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ Container( height: 200, diff --git a/lib/ui/pages/users/users.dart b/lib/ui/pages/users/users.dart index 6200e5d9b2..b2cb4e67ef 100644 --- a/lib/ui/pages/users/users.dart +++ b/lib/ui/pages/users/users.dart @@ -4,16 +4,18 @@ import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/user/user_form_cubit.dart'; +import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; import 'package:selfprivacy/logic/models/user.dart'; +import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.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_icons/brand_icons.dart'; -import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:selfprivacy/ui/helpers/modals.dart'; import 'package:selfprivacy/utils/ui_helpers.dart'; part 'fab.dart'; diff --git a/pubspec.lock b/pubspec.lock index dec832785a..a8ac47f158 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -42,7 +42,7 @@ packages: name: basic_utils url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.3" + version: "3.1.0" bloc: dependency: transitive description: @@ -105,14 +105,14 @@ packages: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "5.1.0" built_value: dependency: transitive description: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.0.4" + version: "8.1.0" characters: dependency: transitive description: @@ -176,7 +176,7 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.3" - crypto: + crypt: dependency: "direct main" description: name: crypt @@ -189,21 +189,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" cubit_form: dependency: "direct main" description: name: cubit_form url: "https://pub.dartlang.org" source: hosted - version: "1.0.2-nullsafety.0" + version: "1.0.16" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.3" dart_style: dependency: transitive description: @@ -252,7 +252,14 @@ packages: name: equatable url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.3" + extended_masked_text: + dependency: transitive + description: + name: extended_masked_text + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" fake_async: dependency: transitive description: @@ -266,14 +273,14 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.2" file: dependency: transitive description: name: file url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "6.1.2" fixnum: dependency: transitive description: @@ -299,7 +306,7 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "7.0.0" + version: "7.0.1" flutter_launcher_icons: dependency: "direct dev" description: @@ -318,14 +325,14 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.1" + version: "0.6.2" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -342,7 +349,7 @@ packages: name: get_it url: "https://pub.dartlang.org" source: hosted - version: "6.0.0" + version: "6.1.1" glob: dependency: transitive description: @@ -363,28 +370,28 @@ packages: name: hive url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" hive_flutter: dependency: "direct main" description: name: hive_flutter url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0" hive_generator: dependency: "direct dev" description: name: hive_generator url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" http: dependency: transitive description: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.1" + version: "0.13.3" http_multi_server: dependency: transitive description: @@ -420,6 +427,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + ionicons: + dependency: "direct main" + description: + name: ionicons + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" js: dependency: transitive description: @@ -455,13 +469,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - mask_text_input_formatter: - dependency: transitive - description: - name: mask_text_input_formatter - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0-nullsafety.2" matcher: dependency: transitive description: @@ -483,6 +490,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + modal_bottom_sheet: + dependency: "direct main" + description: + name: modal_bottom_sheet + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + nanoid: + dependency: "direct main" + description: + name: nanoid + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" nested: dependency: transitive description: @@ -510,7 +531,7 @@ packages: name: package_info url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.2" path: dependency: transitive description: @@ -524,7 +545,7 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" path_provider_linux: dependency: transitive description: @@ -552,21 +573,21 @@ packages: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" pedantic: dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.11.0" + version: "1.11.1" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.0.2" + version: "4.1.0" platform: dependency: transitive description: @@ -587,7 +608,7 @@ packages: name: pointycastle url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.1.2" pool: dependency: transitive description: @@ -630,20 +651,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" shared_preferences: dependency: transitive description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" shared_preferences_linux: dependency: transitive description: @@ -685,7 +699,7 @@ packages: name: shelf url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.4" shelf_packages_handler: dependency: transitive description: @@ -719,6 +733,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" source_map_stack_trace: dependency: transitive description: @@ -823,7 +844,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.0.6" url_launcher_linux: dependency: transitive description: @@ -844,14 +865,14 @@ packages: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" url_launcher_windows: dependency: transitive description: @@ -879,28 +900,28 @@ packages: name: wakelock url: "https://pub.dartlang.org" source: hosted - version: "0.5.0+2" + version: "0.5.2" wakelock_macos: dependency: transitive description: name: wakelock_macos url: "https://pub.dartlang.org" source: hosted - version: "0.1.0" + version: "0.1.0+1" wakelock_platform_interface: dependency: transitive description: name: wakelock_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.1+1" wakelock_web: dependency: transitive description: name: wakelock_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" wakelock_windows: dependency: transitive description: @@ -935,7 +956,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.2.1" xdg_directories: dependency: transitive description: @@ -949,7 +970,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.0.2" + version: "5.1.2" yaml: dependency: transitive description: @@ -958,5 +979,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.13.0 <3.0.0" flutter: ">=2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index a3ced3fe2e..2ae1c63d94 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: selfprivacy description: selfprivacy.org publish_to: 'none' -version: 0.1.1+1 +version: 0.1.3+1 environment: sdk: '>=2.12.0 <3.0.0'