Skip to content

Commit 83259bc

Browse files
committed
fix: recent icon doesn't work in space icon (#7133)
1 parent 1e916a0 commit 83259bc

File tree

7 files changed

+97
-23
lines changed

7 files changed

+97
-23
lines changed

frontend/appflowy_flutter/integration_test/desktop/cloud/cloud_runner.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'data_migration/data_migration_test_runner.dart'
22
as data_migration_test_runner;
33
import 'document/document_test_runner.dart' as document_test_runner;
44
import 'set_env.dart' as preset_af_cloud_env_test;
5+
import 'sidebar/sidebar_icon_test.dart' as sidebar_icon_test;
56
import 'sidebar/sidebar_move_page_test.dart' as sidebar_move_page_test;
67
import 'sidebar/sidebar_rename_untitled_test.dart'
78
as sidebar_rename_untitled_test;
@@ -26,4 +27,5 @@ Future<void> main() async {
2627
// sidebar
2728
sidebar_move_page_test.main();
2829
sidebar_rename_untitled_test.main();
30+
sidebar_icon_test.main();
2931
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'dart:convert';
2+
3+
import 'package:appflowy/env/cloud_env.dart';
4+
import 'package:appflowy/shared/icon_emoji_picker/flowy_icon_emoji_picker.dart';
5+
import 'package:appflowy/shared/icon_emoji_picker/icon_picker.dart';
6+
import 'package:appflowy/shared/icon_emoji_picker/recent_icons.dart';
7+
import 'package:appflowy/workspace/presentation/home/menu/sidebar/space/sidebar_space_header.dart';
8+
import 'package:appflowy/workspace/presentation/home/menu/sidebar/space/space_action_type.dart';
9+
import 'package:appflowy/workspace/presentation/home/menu/sidebar/space/space_more_popup.dart';
10+
import 'package:flowy_svg/flowy_svg.dart';
11+
import 'package:flutter_test/flutter_test.dart';
12+
import 'package:integration_test/integration_test.dart';
13+
14+
import '../../../shared/emoji.dart';
15+
import '../../../shared/util.dart';
16+
17+
void main() {
18+
setUpAll(() {
19+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
20+
RecentIcons.enable = false;
21+
});
22+
23+
tearDownAll(() {
24+
RecentIcons.enable = true;
25+
});
26+
27+
testWidgets('Change slide bar space icon', (tester) async {
28+
await tester.initializeAppFlowy(
29+
cloudType: AuthenticatorType.appflowyCloudSelfHost,
30+
);
31+
await tester.tapGoogleLoginInButton();
32+
await tester.expectToSeeHomePageWithGetStartedPage();
33+
final emojiIconData = await tester.loadIcon();
34+
final firstIcon = IconsData.fromJson(jsonDecode(emojiIconData.emoji));
35+
36+
await tester.hoverOnWidget(
37+
find.byType(SidebarSpaceHeader),
38+
onHover: () async {
39+
final moreOption = find.byType(SpaceMorePopup);
40+
await tester.tapButton(moreOption);
41+
expect(find.byType(FlowyIconEmojiPicker), findsNothing);
42+
await tester.tapSvgButton(SpaceMoreActionType.changeIcon.leftIconSvg);
43+
expect(find.byType(FlowyIconEmojiPicker), findsOneWidget);
44+
},
45+
);
46+
47+
final icons = find.byWidgetPredicate(
48+
(w) => w is FlowySvg && w.svgString == firstIcon.iconContent,
49+
);
50+
expect(icons, findsOneWidget);
51+
await tester.tapIcon(EmojiIconData.icon(firstIcon));
52+
53+
final spaceHeader = find.byType(SidebarSpaceHeader);
54+
final spaceIcon = find.descendant(
55+
of: spaceHeader,
56+
matching: find.byWidgetPredicate(
57+
(w) => w is FlowySvg && w.svgString == firstIcon.iconContent,
58+
),
59+
);
60+
expect(spaceIcon, findsOneWidget);
61+
});
62+
}

frontend/appflowy_flutter/integration_test/shared/emoji.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ extension EmojiTestExtension on WidgetTester {
3131
matching: find.text(PickerTabType.icon.tr),
3232
);
3333
expect(iconTab, findsOneWidget);
34-
expect(find.byType(FlowyIconPicker), findsNothing);
35-
await tap(iconTab);
36-
await pumpAndSettle();
37-
expect(find.byType(FlowyIconPicker), findsOneWidget);
34+
await tapButton(iconTab);
3835
final selectedSvg = find.descendant(
3936
of: find.byType(FlowyIconPicker),
4037
matching: find.byWidgetPredicate(

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:appflowy/mobile/presentation/bottom_sheet/bottom_sheet.dart';
55
import 'package:appflowy/mobile/presentation/home/workspaces/workspace_menu_bottom_sheet.dart';
66
import 'package:appflowy/plugins/base/emoji/emoji_picker_screen.dart';
77
import 'package:appflowy/shared/icon_emoji_picker/flowy_icon_emoji_picker.dart';
8+
import 'package:appflowy/shared/icon_emoji_picker/tab.dart';
89
import 'package:appflowy/startup/startup.dart';
910
import 'package:appflowy/util/built_in_svgs.dart';
1011
import 'package:appflowy/workspace/application/user/settings_user_bloc.dart';
@@ -234,6 +235,7 @@ class _UserIcon extends StatelessWidget {
234235
queryParameters: {
235236
MobileEmojiPickerScreen.pageTitle:
236237
LocaleKeys.titleBar_userIcon.tr(),
238+
MobileEmojiPickerScreen.selectTabs: [PickerTabType.emoji.name],
237239
},
238240
).toString(),
239241
);

frontend/appflowy_flutter/lib/shared/icon_emoji_picker/recent_icons.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ class RecentIcons {
4646
.map(
4747
(e) => RecentIcon.fromJson(jsonDecode(e) as Map<String, dynamic>),
4848
)
49+
50+
/// skip the data that is already stored locally but has an empty
51+
/// groupName to accommodate the issue of destructive data modifications
52+
.skipWhile((e) => e.groupName.isEmpty)
4953
.toList();
5054
} catch (e) {
5155
Log.error('RecentIcons getIcons with :$iconList', e);

frontend/appflowy_flutter/lib/startup/tasks/generate_router.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import 'package:appflowy/user/application/auth/auth_service.dart';
2929
import 'package:appflowy/user/presentation/presentation.dart';
3030
import 'package:appflowy/workspace/presentation/home/desktop_home_screen.dart';
3131
import 'package:appflowy/workspace/presentation/settings/widgets/feature_flags/mobile_feature_flag_screen.dart';
32+
import 'package:appflowy_backend/log.dart';
3233
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
3334
import 'package:flowy_infra/time/duration.dart';
3435
import 'package:flutter/foundation.dart';
@@ -288,10 +289,15 @@ GoRoute _mobileEmojiPickerPageRoute() {
288289
final selectedType = state
289290
.uri.queryParameters[MobileEmojiPickerScreen.iconSelectedType]
290291
?.toPickerTabType();
291-
final tabs = selectTabs
292-
.split('-')
293-
.map((e) => PickerTabType.values.byName(e))
294-
.toList();
292+
List<PickerTabType> tabs = [];
293+
try {
294+
tabs = selectTabs
295+
.split('-')
296+
.map((e) => PickerTabType.values.byName(e))
297+
.toList();
298+
} on ArgumentError catch (e) {
299+
Log.error('convert selectTabs to pickerTab error', e);
300+
}
295301
return MaterialExtendedPage(
296302
child: tabs.isEmpty
297303
? MobileEmojiPickerScreen(title: title, selectedType: selectedType)

frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/space/sidebar_space_header.dart

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,22 @@ class _SidebarSpaceHeaderState extends State<SidebarSpaceHeader> {
173173
await _showRenameDialog();
174174
break;
175175
case SpaceMoreActionType.changeIcon:
176-
final result = data as EmojiIconData;
177-
if (data.type == FlowyIconType.icon) {
178-
try {
179-
final iconsData = IconsData.fromJson(jsonDecode(result.emoji));
180-
context.read<SpaceBloc>().add(
181-
SpaceEvent.changeIcon(
182-
icon: '${iconsData.groupName}/${iconsData.iconName}',
183-
iconColor: iconsData.color,
184-
),
185-
);
186-
} on FormatException catch (e) {
187-
context
188-
.read<SpaceBloc>()
189-
.add(const SpaceEvent.changeIcon(icon: ''));
190-
Log.warn('SidebarSpaceHeader changeIcon error:$e');
176+
if (data is SelectedEmojiIconResult) {
177+
if (data.type == FlowyIconType.icon) {
178+
try {
179+
final iconsData = IconsData.fromJson(jsonDecode(data.emoji));
180+
context.read<SpaceBloc>().add(
181+
SpaceEvent.changeIcon(
182+
icon: '${iconsData.groupName}/${iconsData.iconName}',
183+
iconColor: iconsData.color,
184+
),
185+
);
186+
} on FormatException catch (e) {
187+
context
188+
.read<SpaceBloc>()
189+
.add(const SpaceEvent.changeIcon(icon: ''));
190+
Log.warn('SidebarSpaceHeader changeIcon error:$e');
191+
}
191192
}
192193
}
193194
break;

0 commit comments

Comments
 (0)