Skip to content

Commit fe5ce75

Browse files
authored
fix: minor ui issues (#4102)
* fix: minor ui issues * feat: support using emoji as icon * chore: update langauges * fix: missing reminder bloc in detail page * fix: integration test
1 parent 99b2b27 commit fe5ce75

File tree

11 files changed

+153
-194
lines changed

11 files changed

+153
-194
lines changed

frontend/appflowy_flutter/integration_test/settings/user_icon_test.dart

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import 'package:appflowy/workspace/presentation/settings/widgets/settings_user_v
33
import 'package:appflowy/workspace/presentation/widgets/user_avatar.dart';
44
import 'package:flutter_test/flutter_test.dart';
55
import 'package:integration_test/integration_test.dart';
6+
7+
import '../util/emoji.dart';
68
import '../util/util.dart';
79

810
void main() {
@@ -28,27 +30,12 @@ void main() {
2830
await tester.pumpAndSettle();
2931

3032
// Select first option that isn't default
31-
await tester.tap(find.byType(IconOption).first);
32-
await tester.pumpAndSettle();
33-
34-
UserAvatar userAvatar = tester.widget(userAvatarFinder) as UserAvatar;
35-
expect(userAvatar.iconUrl, isNotEmpty);
36-
37-
// Open icon picker dialog again
38-
await tester.tap(userAvatarFinder);
39-
await tester.pumpAndSettle();
40-
41-
// Tap the default option
42-
await tester.tap(
43-
find.descendant(
44-
of: find.byType(IconGallery),
45-
matching: find.byType(UserAvatar),
46-
),
47-
);
33+
await tester.tapEmoji('😁');
4834
await tester.pumpAndSettle();
4935

50-
userAvatar = tester.widget(userAvatarFinder) as UserAvatar;
51-
expect(userAvatar.iconUrl, isEmpty);
36+
final UserAvatar userAvatar =
37+
tester.widget(userAvatarFinder) as UserAvatar;
38+
expect(userAvatar.iconUrl, '😁');
5239
});
5340
});
5441
}

frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_home_page_header.dart

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import 'package:appflowy/generated/flowy_svgs.g.dart';
2+
import 'package:appflowy/generated/locale_keys.g.dart';
23
import 'package:appflowy/mobile/presentation/home/mobile_home_setting_page.dart';
34
import 'package:appflowy/plugins/base/emoji/emoji_picker_screen.dart';
45
import 'package:appflowy/plugins/base/icon/icon_picker.dart';
56
import 'package:appflowy/startup/startup.dart';
67
import 'package:appflowy/workspace/application/user/settings_user_bloc.dart';
8+
import 'package:appflowy/workspace/presentation/settings/widgets/settings_user_view.dart';
79
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
10+
import 'package:easy_localization/easy_localization.dart';
811
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
912
import 'package:flutter/material.dart';
1013
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -31,33 +34,7 @@ class MobileHomePageHeader extends StatelessWidget {
3134
constraints: const BoxConstraints(minHeight: 48),
3235
child: Row(
3336
children: [
34-
FlowyButton(
35-
useIntrinsicWidth: true,
36-
text: FlowyText(
37-
// replace with user icon
38-
userIcon.isNotEmpty ? userIcon : '🐻',
39-
fontSize: 26,
40-
),
41-
onTap: () async {
42-
final icon = await context.push<EmojiPickerResult>(
43-
Uri(
44-
path: MobileEmojiPickerScreen.routeName,
45-
queryParameters: {
46-
MobileEmojiPickerScreen.pageTitle: 'User icon',
47-
},
48-
).toString(),
49-
);
50-
if (icon != null) {
51-
if (context.mounted) {
52-
context.read<SettingsUserViewBloc>().add(
53-
SettingsUserEvent.updateUserIcon(
54-
iconUrl: icon.emoji,
55-
),
56-
);
57-
}
58-
}
59-
},
60-
),
37+
_UserIcon(userIcon: userIcon),
6138
const HSpace(12),
6239
Expanded(
6340
child: Column(
@@ -96,3 +73,49 @@ class MobileHomePageHeader extends StatelessWidget {
9673
);
9774
}
9875
}
76+
77+
class _UserIcon extends StatelessWidget {
78+
const _UserIcon({
79+
required this.userIcon,
80+
});
81+
82+
final String userIcon;
83+
84+
@override
85+
Widget build(BuildContext context) {
86+
return FlowyButton(
87+
useIntrinsicWidth: true,
88+
text: builtInSVGIcons.contains(userIcon)
89+
// to be compatible with old user icon
90+
? FlowySvg(
91+
FlowySvgData('emoji/$userIcon'),
92+
size: const Size.square(32),
93+
blendMode: null,
94+
)
95+
: FlowyText(
96+
userIcon.isNotEmpty ? userIcon : '🐻',
97+
fontSize: 26,
98+
),
99+
onTap: () async {
100+
final icon = await context.push<EmojiPickerResult>(
101+
Uri(
102+
path: MobileEmojiPickerScreen.routeName,
103+
queryParameters: {
104+
MobileEmojiPickerScreen.pageTitle:
105+
LocaleKeys.titleBar_userIcon.tr(),
106+
},
107+
).toString(),
108+
);
109+
if (icon != null) {
110+
if (context.mounted) {
111+
context.read<SettingsUserViewBloc>().add(
112+
SettingsUserEvent.updateUserIcon(
113+
iconUrl: icon.emoji,
114+
),
115+
);
116+
}
117+
}
118+
},
119+
);
120+
}
121+
}

frontend/appflowy_flutter/lib/mobile/presentation/setting/cloud/appflowy_cloud_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class AppFlowyCloudPage extends StatelessWidget {
1313
Widget build(BuildContext context) {
1414
return Scaffold(
1515
appBar: AppBar(
16-
title: Text(LocaleKeys.settings_menu_cloudSetting.tr()),
16+
title: Text(LocaleKeys.settings_menu_cloudSettings.tr()),
1717
),
1818
body: Padding(
1919
padding: const EdgeInsets.all(20.0),

frontend/appflowy_flutter/lib/mobile/presentation/setting/cloud/cloud_setting_group.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class CloudSettingGroup extends StatelessWidget {
1717
return FutureBuilder(
1818
future: PackageInfo.fromPlatform(),
1919
builder: (context, snapshot) => MobileSettingGroup(
20-
groupTitle: LocaleKeys.settings_menu_cloudSetting.tr(),
20+
groupTitle: LocaleKeys.settings_menu_cloudSettings.tr(),
2121
settingItemList: [
2222
MobileSettingItem(
2323
name: LocaleKeys.settings_menu_cloudAppFlowy.tr(),

frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_detail.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
22
import 'package:appflowy/plugins/database_view/application/row/row_controller.dart';
33
import 'package:appflowy/plugins/database_view/grid/application/row/row_detail_bloc.dart';
44
import 'package:appflowy/plugins/database_view/widgets/row/row_document.dart';
5+
import 'package:appflowy/startup/startup.dart';
6+
import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
57
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
6-
78
import 'package:flutter/material.dart';
89
import 'package:flutter_bloc/flutter_bloc.dart';
910

@@ -43,9 +44,17 @@ class _RowDetailPageState extends State<RowDetailPage> {
4344
@override
4445
Widget build(BuildContext context) {
4546
return FlowyDialog(
46-
child: BlocProvider(
47-
create: (context) => RowDetailBloc(rowController: widget.rowController)
48-
..add(const RowDetailEvent.initial()),
47+
child: MultiBlocProvider(
48+
providers: [
49+
BlocProvider(
50+
create: (context) =>
51+
RowDetailBloc(rowController: widget.rowController)
52+
..add(const RowDetailEvent.initial()),
53+
),
54+
BlocProvider.value(
55+
value: getIt<ReminderBloc>(),
56+
),
57+
],
4958
child: ListView(
5059
controller: scrollController,
5160
children: [

frontend/appflowy_flutter/lib/user/presentation/screens/sign_in_screen/widgets/third_party_sign_in_buttons.dart

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -189,35 +189,30 @@ class _MobileSignInButton extends StatelessWidget {
189189
width: 0.5,
190190
),
191191
),
192-
child: Center(
193-
child: Row(
194-
mainAxisSize: MainAxisSize.min,
195-
children: [
196-
SizedBox(
197-
// The icon could be in different height as original aspect ratio, we use a fixed sizebox to wrap it to make sure they all occupy the same space.
198-
width: 30,
199-
height: 30,
200-
child: Center(
201-
child: SizedBox(
202-
width: 24,
203-
child: FlowySvg(
204-
icon,
205-
blendMode: null,
206-
),
192+
alignment: Alignment.center,
193+
child: Row(
194+
mainAxisAlignment: MainAxisAlignment.center,
195+
children: [
196+
SizedBox(
197+
// The icon could be in different height as original aspect ratio, we use a fixed sizebox to wrap it to make sure they all occupy the same space.
198+
width: 30,
199+
height: 30,
200+
child: Center(
201+
child: SizedBox(
202+
width: 24,
203+
child: FlowySvg(
204+
icon,
205+
blendMode: null,
207206
),
208207
),
209208
),
210-
const HSpace(8),
211-
SizedBox(
212-
// To fit the longest label 'Log in with Discord'
213-
width: 135,
214-
child: Text(
215-
labelText,
216-
style: Theme.of(context).textTheme.titleSmall,
217-
),
218-
),
219-
],
220-
),
209+
),
210+
const HSpace(8),
211+
Text(
212+
labelText,
213+
style: Theme.of(context).textTheme.titleSmall,
214+
),
215+
],
221216
),
222217
),
223218
);

frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/sidebar_user.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import 'package:appflowy/generated/flowy_svgs.g.dart';
2+
import 'package:appflowy/generated/locale_keys.g.dart';
23
import 'package:appflowy/plugins/document/presentation/more/cubit/document_appearance_cubit.dart';
34
import 'package:appflowy/startup/startup.dart';
45
import 'package:appflowy/workspace/application/menu/menu_user_bloc.dart';
56
import 'package:appflowy/workspace/presentation/notifications/widgets/notification_button.dart';
67
import 'package:appflowy/workspace/presentation/settings/settings_dialog.dart';
8+
import 'package:appflowy/workspace/presentation/widgets/user_avatar.dart';
79
import 'package:appflowy_backend/log.dart';
810
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
9-
import 'package:appflowy/workspace/presentation/widgets/user_avatar.dart';
11+
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
12+
show UserProfilePB;
13+
import 'package:easy_localization/easy_localization.dart';
1014
import 'package:flowy_infra_ui/style_widget/text.dart';
1115
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
1216
import 'package:flowy_infra_ui/widget/spacing.dart';
13-
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
14-
show UserProfilePB;
1517
import 'package:flutter/material.dart';
1618
import 'package:flutter_bloc/flutter_bloc.dart';
17-
import 'package:appflowy/generated/locale_keys.g.dart';
18-
import 'package:easy_localization/easy_localization.dart';
1919

2020
class SidebarUser extends StatelessWidget {
2121
const SidebarUser({
@@ -42,7 +42,7 @@ class SidebarUser extends StatelessWidget {
4242
iconUrl: state.userProfile.iconUrl,
4343
name: state.userProfile.name,
4444
),
45-
const HSpace(10),
45+
const HSpace(4),
4646
Expanded(
4747
child: _buildUserName(context, state),
4848
),

frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/settings_menu.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class SettingsMenu extends StatelessWidget {
6161
SettingsMenuElement(
6262
page: SettingsPage.cloud,
6363
selectedPage: currentPage,
64-
label: LocaleKeys.settings_menu_cloudSetting.tr(),
64+
label: LocaleKeys.settings_menu_cloudSettings.tr(),
6565
icon: Icons.sync,
6666
changeSelectedPage: changeSelectedPage,
6767
),

0 commit comments

Comments
 (0)