From f24e154b4fb5cb4776040c945c9fc5e89ef4d085 Mon Sep 17 00:00:00 2001 From: Ian Su Date: Sat, 9 Jul 2022 22:00:17 +0800 Subject: [PATCH] refactor: create SettingsUserViewBloc --- .../app_flowy/assets/translations/en.json | 2 +- .../app_flowy/lib/startup/deps_resolver.dart | 6 ++ .../workspace/application/user/prelude.dart | 1 + .../application/user/settings_user_bloc.dart | 79 +++++++++++++++++++ .../settings/settings_dialog.dart | 4 +- .../settings/widgets/settings_menu.dart | 2 +- ...ings_view.dart => settings_user_view.dart} | 25 +++--- 7 files changed, 100 insertions(+), 19 deletions(-) create mode 100644 frontend/app_flowy/lib/workspace/application/user/prelude.dart create mode 100644 frontend/app_flowy/lib/workspace/application/user/settings_user_bloc.dart rename frontend/app_flowy/lib/workspace/presentation/settings/widgets/{settings_settings_view.dart => settings_user_view.dart} (51%) diff --git a/frontend/app_flowy/assets/translations/en.json b/frontend/app_flowy/assets/translations/en.json index de2f8f7039..656c28be2e 100644 --- a/frontend/app_flowy/assets/translations/en.json +++ b/frontend/app_flowy/assets/translations/en.json @@ -141,7 +141,7 @@ "menu": { "appearance": "Appearance", "language": "Language", - "settings": "Settings", + "user": "User", "open": "Open Settings" }, "appearance": { diff --git a/frontend/app_flowy/lib/startup/deps_resolver.dart b/frontend/app_flowy/lib/startup/deps_resolver.dart index 0cf248e7e4..ed382f9b83 100644 --- a/frontend/app_flowy/lib/startup/deps_resolver.dart +++ b/frontend/app_flowy/lib/startup/deps_resolver.dart @@ -5,6 +5,7 @@ import 'package:app_flowy/workspace/application/app/prelude.dart'; import 'package:app_flowy/workspace/application/doc/prelude.dart'; import 'package:app_flowy/workspace/application/grid/prelude.dart'; import 'package:app_flowy/workspace/application/trash/prelude.dart'; +import 'package:app_flowy/workspace/application/user/prelude.dart'; import 'package:app_flowy/workspace/application/workspace/prelude.dart'; import 'package:app_flowy/workspace/application/edit_pannel/edit_pannel_bloc.dart'; import 'package:app_flowy/workspace/application/view/prelude.dart'; @@ -101,6 +102,11 @@ void _resolveFolderDeps(GetIt getIt) { (user, _) => MenuUserBloc(user), ); + //User + getIt.registerFactoryParam( + (user, _) => SettingsUserViewBloc(user), + ); + // App getIt.registerFactoryParam( (app, _) => AppBloc( diff --git a/frontend/app_flowy/lib/workspace/application/user/prelude.dart b/frontend/app_flowy/lib/workspace/application/user/prelude.dart new file mode 100644 index 0000000000..f698497db9 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/user/prelude.dart @@ -0,0 +1 @@ +export 'settings_user_bloc.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/user/settings_user_bloc.dart b/frontend/app_flowy/lib/workspace/application/user/settings_user_bloc.dart new file mode 100644 index 0000000000..5a4954c068 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/user/settings_user_bloc.dart @@ -0,0 +1,79 @@ +import 'package:app_flowy/user/application/user_listener.dart'; +import 'package:app_flowy/user/application/user_service.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:dartz/dartz.dart'; + +part 'settings_user_bloc.freezed.dart'; + +class SettingsUserViewBloc extends Bloc { + final UserService _userService; + final UserListener _userListener; + final UserProfile userProfile; + + SettingsUserViewBloc(this.userProfile) + : _userListener = UserListener(userProfile: userProfile), + _userService = UserService(userId: userProfile.id), + super(SettingsUserState.initial(userProfile)) { + on((event, emit) async { + await event.when( + initial: () async { + _userListener.start(onProfileUpdated: _profileUpdated); + await _initUser(); + }, + didReceiveUserProfile: (UserProfile newUserProfile) { + emit(state.copyWith(userProfile: newUserProfile)); + }, + updateUserName: (String name) { + _userService.updateUserProfile(name: name).then((result) { + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }); + }, + ); + }); + } + + @override + Future close() async { + await _userListener.stop(); + super.close(); + } + + Future _initUser() async { + final result = await _userService.initUser(); + result.fold((l) => null, (error) => Log.error(error)); + } + + void _profileUpdated(Either userProfileOrFailed) { + userProfileOrFailed.fold( + (newUserProfile) => add(SettingsUserEvent.didReceiveUserProfile(newUserProfile)), + (err) => Log.error(err), + ); + } +} + +@freezed +class SettingsUserEvent with _$SettingsUserEvent { + const factory SettingsUserEvent.initial() = _Initial; + const factory SettingsUserEvent.updateUserName(String name) = _UpdateUserName; + const factory SettingsUserEvent.didReceiveUserProfile(UserProfile newUserProfile) = _DidReceiveUserProfile; +} + +@freezed +class SettingsUserState with _$SettingsUserState { + const factory SettingsUserState({ + required UserProfile userProfile, + required Either successOrFailure, + }) = _SettingsUserState; + + factory SettingsUserState.initial(UserProfile userProfile) => SettingsUserState( + userProfile: userProfile, + successOrFailure: left(unit), + ); +} diff --git a/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart b/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart index 3d0f59bdd8..72bb0bf7ac 100644 --- a/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart +++ b/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart @@ -2,7 +2,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/workspace/application/appearance.dart'; import 'package:app_flowy/workspace/presentation/settings/widgets/settings_appearance_view.dart'; import 'package:app_flowy/workspace/presentation/settings/widgets/settings_language_view.dart'; -import 'package:app_flowy/workspace/presentation/settings/widgets/settings_settings_view.dart'; +import 'package:app_flowy/workspace/presentation/settings/widgets/settings_user_view.dart'; import 'package:app_flowy/workspace/presentation/settings/widgets/settings_menu.dart'; import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart' show UserProfile; import 'package:easy_localization/easy_localization.dart'; @@ -24,7 +24,7 @@ class _SettingsDialogState extends State { final List settingsViews = [ const SettingsAppearanceView(), const SettingsLanguageView(), - SettingsSettingsView(user), + SettingsUserView(user), ]; return settingsViews[index]; } diff --git a/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_menu.dart b/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_menu.dart index 6900328f60..a27d9861c4 100644 --- a/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_menu.dart +++ b/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_menu.dart @@ -40,7 +40,7 @@ class SettingsMenu extends StatelessWidget { SettingsMenuElement( index: 2, currentIndex: currentIndex, - label: LocaleKeys.settings_menu_settings.tr(), + label: LocaleKeys.settings_menu_user.tr(), icon: Icons.account_box_outlined, changeSelectedIndex: changeSelectedIndex, ), diff --git a/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_settings_view.dart b/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_user_view.dart similarity index 51% rename from frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_settings_view.dart rename to frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_user_view.dart index 6b33022577..b72df8f272 100644 --- a/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_settings_view.dart +++ b/frontend/app_flowy/lib/workspace/presentation/settings/widgets/settings_user_view.dart @@ -1,22 +1,22 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:flutter/material.dart'; -import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart'; +import 'package:app_flowy/workspace/application/user/settings_user_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart' show UserProfile; -class SettingsSettingsView extends StatelessWidget { +class SettingsUserView extends StatelessWidget { final UserProfile user; - SettingsSettingsView(this.user, {Key? key}) : super(key: ValueKey(user.id)); + SettingsUserView(this.user, {Key? key}) : super(key: ValueKey(user.id)); @override Widget build(BuildContext context) { - return BlocProvider( - create: (context) => getIt(param1: user)..add(const MenuUserEvent.initial()), - child: BlocBuilder( + return BlocProvider( + create: (context) => getIt(param1: user)..add(const SettingsUserEvent.initial()), + child: BlocBuilder( builder: (context, state) => SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: const [UserNameInput()], + children: const [_UserNameInput()], ), ), ), @@ -24,16 +24,11 @@ class SettingsSettingsView extends StatelessWidget { } } -class UserNameInput extends StatefulWidget { - const UserNameInput({ +class _UserNameInput extends StatelessWidget { + const _UserNameInput({ Key? key, }) : super(key: key); - @override - State createState() => _UserNameInputState(); -} - -class _UserNameInputState extends State { @override Widget build(BuildContext context) { return TextField( @@ -41,7 +36,7 @@ class _UserNameInputState extends State { labelText: 'Name', ), onSubmitted: (val) { - context.read().add(MenuUserEvent.updateUserName(val)); + context.read().add(SettingsUserEvent.updateUserName(val)); debugPrint("Value $val submitted"); }); }