diff --git a/lib/logic/cubit/forms/initializing/user_form_cubit.dart b/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart similarity index 93% rename from lib/logic/cubit/forms/initializing/user_form_cubit.dart rename to lib/logic/cubit/forms/initializing/root_user_form_cubit.dart index 47ea1365..bd98debd 100644 --- a/lib/logic/cubit/forms/initializing/user_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/root_user_form_cubit.dart @@ -5,10 +5,10 @@ import 'package:selfprivacy/logic/api_maps/hetzner.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/models/user.dart'; -class UserFormCubit extends FormCubit { +class RootUserFormCubit extends FormCubit { HetznerApi apiClient = HetznerApi(); - UserFormCubit(this.initializingCubit) { + RootUserFormCubit(this.initializingCubit) { var userRegExp = RegExp(r"\W"); var passwordRegExp = RegExp(r"[\n\r\s]+"); diff --git a/lib/logic/cubit/forms/user/user.dart b/lib/logic/cubit/forms/user/user_form_cubit.dart similarity index 76% rename from lib/logic/cubit/forms/user/user.dart rename to lib/logic/cubit/forms/user/user_form_cubit.dart index b51c5c48..c75e760d 100644 --- a/lib/logic/cubit/forms/user/user.dart +++ b/lib/logic/cubit/forms/user/user_form_cubit.dart @@ -3,10 +3,11 @@ import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; import 'package:selfprivacy/logic/models/user.dart'; +import 'package:selfprivacy/utils/password_generator.dart'; -class CloudFlareFormCubit extends FormCubit { - CloudFlareFormCubit({ - this.userCubit, +class UserFormCubit extends FormCubit { + UserFormCubit({ + this.usersCubit, User user, }) { var isEdit = user != null; @@ -24,7 +25,7 @@ class CloudFlareFormCubit extends FormCubit { ); password = FieldCubit( - initalValue: isEdit ? user.password : '', + initalValue: isEdit ? user.password : genPass(), validations: [ RequiredStringValidation('required'), ValidationModel( @@ -41,11 +42,15 @@ class CloudFlareFormCubit extends FormCubit { login: login.state.value, password: password.state.value, ); - userCubit.add(user); + usersCubit.add(user); } FieldCubit login; FieldCubit password; - UsersCubit userCubit; + void genNewPassword() { + password.externalSetValue(genPass()); + } + + UsersCubit usersCubit; } diff --git a/lib/logic/cubit/users/users_cubit.dart b/lib/logic/cubit/users/users_cubit.dart index 6dcdd371..cf296f31 100644 --- a/lib/logic/cubit/users/users_cubit.dart +++ b/lib/logic/cubit/users/users_cubit.dart @@ -9,14 +9,14 @@ class UsersCubit extends Cubit { UsersCubit() : super(UsersState([])); void add(User user) { - var users = state.users; + var users = [...state.users]; users.add(user); emit(UsersState(users)); } void remove(User user) { - var users = state.users; + var users = [...state.users]; users.remove(user); emit(UsersState(users)); diff --git a/lib/ui/pages/initializing/initializing.dart b/lib/ui/pages/initializing/initializing.dart index 47e66ea2..51fa5fc7 100644 --- a/lib/ui/pages/initializing/initializing.dart +++ b/lib/ui/pages/initializing/initializing.dart @@ -7,7 +7,7 @@ import 'package:selfprivacy/config/text_themes.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/cloudflare_form_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/domain_form_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/initializing/hetzner_form_cubit.dart'; -import 'package:selfprivacy/logic/cubit/forms/initializing/user_form_cubit.dart'; +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_button/brand_button.dart'; @@ -217,9 +217,9 @@ class InitializingPage extends StatelessWidget { Widget _stepUser(AppConfigCubit initializingCubit) { return BlocProvider( - create: (context) => UserFormCubit(initializingCubit), + create: (context) => RootUserFormCubit(initializingCubit), child: Builder(builder: (context) { - var formCubit = context.watch(); + var formCubit = context.watch(); return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/ui/pages/users/new_user.dart b/lib/ui/pages/users/new_user.dart index d76715c5..6847bdf7 100644 --- a/lib/ui/pages/users/new_user.dart +++ b/lib/ui/pages/users/new_user.dart @@ -1,73 +1,76 @@ part of 'users.dart'; -class _NewUser extends StatefulWidget { - const _NewUser({Key key}) : super(key: key); - - @override - __NewUserState createState() => __NewUserState(); -} - -class __NewUserState extends State<_NewUser> { - var passController = TextEditingController(text: genPass()); - +class _NewUser extends StatelessWidget { @override Widget build(BuildContext context) { - // final usersCubit = context.watch(); + final usersCubit = context.watch(); return BrandModalSheet( - child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - BrandHeader(title: 'Новый пользователь'), - SizedBox(width: 14), - Padding( - padding: brandPagePadding2, - child: Column( - children: [ - TextField( - decoration: InputDecoration( - labelText: 'Логин', - suffixText: '@example', - ), - ), - SizedBox(height: 20), - TextField( - controller: passController, - decoration: InputDecoration( - alignLabelWithHint: false, - labelText: 'Пароль', - suffixIcon: Padding( - padding: const EdgeInsets.only(right: 8), - child: IconButton( - icon: Icon( - BrandIcons.refresh, - color: BrandColors.blue, - ), - onPressed: () { - passController.value = - TextEditingValue(text: genPass()); - }, + child: BlocProvider( + create: (context) => UserFormCubit(usersCubit: usersCubit), + child: Builder(builder: (context) { + var formCubit = context.watch(); + + return BlocListener( + listener: (context, state) { + if (state.isSubmitted) { + Navigator.pop(context); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + BrandHeader(title: 'Новый пользователь'), + SizedBox(width: 14), + Padding( + padding: brandPagePadding2, + child: Column( + children: [ + CubitFormTextField( + formFieldCubit: formCubit.login, + decoration: InputDecoration( + labelText: 'Логин', + suffixText: '@example', ), ), - ), + SizedBox(height: 20), + CubitFormTextField( + formFieldCubit: formCubit.password, + decoration: InputDecoration( + alignLabelWithHint: false, + labelText: 'Пароль', + suffixIcon: Padding( + padding: const EdgeInsets.only(right: 8), + child: IconButton( + icon: Icon( + BrandIcons.refresh, + color: BrandColors.blue, + ), + onPressed: formCubit.genNewPassword, + ), + ), + ), + ), + SizedBox(height: 30), + BrandButton.rised( + onPressed: formCubit.state.isSubmitting + ? null + : () { + formCubit.trySubmit(); + }, + title: 'Создать', + ), + SizedBox(height: 40), + Text( + 'Новый пользователь автоматически получит доступ ко всем сервисам. Ещё какое-то описание.'), + SizedBox(height: 30), + ], ), - SizedBox(height: 30), - BrandButton.rised( - onPressed: () { - Navigator.pop(context); - }, - title: 'Создать', - ), - SizedBox(height: 40), - Text( - 'Новый пользователь автоматически получит доступ ко всем сервисам. Ещё какое-то описание.'), - SizedBox(height: 30), - ], - ), + ), + ], ), - ], - ), + ); + }), ), ); } diff --git a/lib/ui/pages/users/user_details.dart b/lib/ui/pages/users/user_details.dart index 6311fc4d..80b4de68 100644 --- a/lib/ui/pages/users/user_details.dart +++ b/lib/ui/pages/users/user_details.dart @@ -67,6 +67,7 @@ class _UserDetails extends StatelessWidget { ), ), onPressed: () { + context.read().remove(user); Navigator.of(context)..pop()..pop(); }, ), diff --git a/lib/ui/pages/users/users.dart b/lib/ui/pages/users/users.dart index 809e6a70..c7f6ba88 100644 --- a/lib/ui/pages/users/users.dart +++ b/lib/ui/pages/users/users.dart @@ -1,7 +1,9 @@ +import 'package:cubit_form/cubit_form.dart'; import 'package:flutter/material.dart'; 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/users/users_cubit.dart'; import 'package:selfprivacy/logic/models/user.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; @@ -11,7 +13,6 @@ 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:selfprivacy/utils/password_generator.dart'; part 'fab.dart'; part 'new_user.dart'; diff --git a/pubspec.lock b/pubspec.lock index f91d82ee..6c7ac030 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -182,7 +182,7 @@ packages: name: cubit_form url: "https://pub.dartlang.org" source: hosted - version: "0.0.15" + version: "0.0.16" cupertino_icons: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3828554b..457c52b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter crypto: ^2.1.5 - cubit_form: ^0.0.15 + cubit_form: ^0.0.16 cupertino_icons: ^1.0.0 dio: ^3.0.10 easy_localization: ^2.3.3