11import 'package:appflowy/features/workspace/logic/workspace_bloc.dart' ;
22import 'package:appflowy/generated/locale_keys.g.dart' ;
3+ import 'package:appflowy/workspace/application/command_palette/command_palette_bloc.dart' ;
34import 'package:appflowy/workspace/application/recent/recent_views_bloc.dart' ;
45import 'package:appflowy/workspace/presentation/command_palette/navigation_bloc_extension.dart' ;
56import 'package:appflowy/workspace/presentation/command_palette/widgets/search_icon.dart' ;
67import 'package:appflowy/workspace/presentation/command_palette/widgets/search_recent_view_cell.dart' ;
8+ import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart' ;
79import 'package:appflowy_backend/protobuf/flowy-user/workspace.pbenum.dart' ;
810import 'package:appflowy_ui/appflowy_ui.dart' ;
911import 'package:easy_localization/easy_localization.dart' ;
1012import 'package:flowy_infra_ui/flowy_infra_ui.dart' ;
1113import 'package:flutter/material.dart' ;
1214import 'package:flutter_bloc/flutter_bloc.dart' ;
1315
16+ import 'keyboard_scroller.dart' ;
1417import 'page_preview.dart' ;
1518import 'search_ask_ai_entrance.dart' ;
19+ import 'search_field.dart' ;
1620
1721class RecentViewsList extends StatelessWidget {
1822 const RecentViewsList ({super .key, required this .onSelected});
@@ -26,15 +30,54 @@ class RecentViewsList extends StatelessWidget {
2630 RecentViewsBloc ()..add (const RecentViewsEvent .initial ()),
2731 child: BlocBuilder <RecentViewsBloc , RecentViewsState >(
2832 builder: (context, state) {
33+ final recentViews = state.views.map ((e) => e.item).toSet ().toList ();
34+ final bloc = context.read <RecentViewsBloc >();
2935 return LayoutBuilder (
3036 builder: (context, constrains) {
3137 final maxWidth = constrains.maxWidth;
3238 final hidePreview = maxWidth < 884 ;
33- return Row (
34- children: [
35- buildLeftPanel (state, context, hidePreview),
36- if (! hidePreview) buildPreview (state),
37- ],
39+ final commandPaletteState =
40+ context.read <CommandPaletteBloc >().state;
41+ return ScrollControllerBuilder (
42+ builder: (context, controller) {
43+ return KeyboardScroller <ViewPB >(
44+ onSelect: (index) {
45+ bloc.add (RecentViewsEvent .hoverView (recentViews[index]));
46+ },
47+ idGetter: (item) => item.id,
48+ list: recentViews,
49+ controller: controller,
50+ selectedIndexGetter: () => recentViews.indexWhere (
51+ (item) => item.id == bloc.state.hoveredView? .id,
52+ ),
53+ builder: (context, detectors) {
54+ return Column (
55+ crossAxisAlignment: CrossAxisAlignment .start,
56+ mainAxisSize: MainAxisSize .min,
57+ children: [
58+ SearchField (
59+ query: commandPaletteState.query,
60+ isLoading: commandPaletteState.searching,
61+ ),
62+ Flexible (
63+ child: Row (
64+ children: [
65+ buildLeftPanel (
66+ state: state,
67+ context: context,
68+ hidePreview: hidePreview,
69+ controller: controller,
70+ detectors: detectors,
71+ ),
72+ if (! hidePreview) buildPreview (state),
73+ ],
74+ ),
75+ ),
76+ ],
77+ );
78+ },
79+ );
80+ },
3881 );
3982 },
4083 );
@@ -43,45 +86,48 @@ class RecentViewsList extends StatelessWidget {
4386 );
4487 }
4588
46- Widget buildLeftPanel (
47- RecentViewsState state,
48- BuildContext context,
49- bool hidePreview,
50- ) {
89+ Widget buildLeftPanel ({
90+ required RecentViewsState state,
91+ required BuildContext context,
92+ required bool hidePreview,
93+ required ScrollController controller,
94+ required AreaDetectors detectors,
95+ }) {
5196 final workspaceState = context.read <UserWorkspaceBloc ?>()? .state;
5297 final showAskingAI =
5398 workspaceState? .userProfile.workspaceType == WorkspaceTypePB .ServerW ;
5499 return Flexible (
55100 child: Align (
56101 alignment: Alignment .topLeft,
57- child: ScrollControllerBuilder (
58- builder : (context, controller) {
59- return Padding (
60- padding : EdgeInsets . only (right : hidePreview ? 0 : 6 ) ,
61- child : FlowyScrollbar (
62- controller : controller,
63- thumbVisibility : false ,
64- child : SingleChildScrollView (
65- controller : controller,
66- physics : const ClampingScrollPhysics (),
67- child : Padding (
68- padding : EdgeInsets . only (
69- right : hidePreview ? 0 : 6 ,
70- ) ,
71- child : Column (
72- crossAxisAlignment : CrossAxisAlignment .start ,
73- children : [
74- if (showAskingAI) SearchAskAiEntrance (),
75- buildTitle (context) ,
76- buildViewList (state, context, hidePreview) ,
77- VSpace ( 16 ) ,
78- ] ,
102+ child: Padding (
103+ padding : EdgeInsets . only (right : hidePreview ? 0 : 6 ),
104+ child : FlowyScrollbar (
105+ controller : controller ,
106+ thumbVisibility : false ,
107+ child : SingleChildScrollView (
108+ controller : controller ,
109+ physics : const ClampingScrollPhysics (),
110+ child : Padding (
111+ padding : EdgeInsets . only (
112+ right : hidePreview ? 0 : 6 ,
113+ ),
114+ child : Column (
115+ crossAxisAlignment : CrossAxisAlignment .start ,
116+ children : [
117+ if (showAskingAI) SearchAskAiEntrance () ,
118+ buildTitle (context),
119+ buildViewList (
120+ state : state ,
121+ context: context ,
122+ hidePreview : hidePreview ,
123+ detectors : detectors ,
79124 ),
80- ),
125+ VSpace (16 ),
126+ ],
81127 ),
82128 ),
83- );
84- } ,
129+ ),
130+ ) ,
85131 ),
86132 ),
87133 );
@@ -107,11 +153,12 @@ class RecentViewsList extends StatelessWidget {
107153 );
108154 }
109155
110- Widget buildViewList (
111- RecentViewsState state,
112- BuildContext context,
113- bool hidePreview,
114- ) {
156+ Widget buildViewList ({
157+ required RecentViewsState state,
158+ required BuildContext context,
159+ required bool hidePreview,
160+ required AreaDetectors detectors,
161+ }) {
115162 final recentViews = state.views.map ((e) => e.item).toSet ().toList ();
116163
117164 if (recentViews.isEmpty) {
@@ -133,6 +180,7 @@ class RecentViewsList extends StatelessWidget {
133180 view: view,
134181 onSelected: onSelected,
135182 isNarrowWindow: hidePreview,
183+ detectors: detectors,
136184 );
137185 },
138186 );
0 commit comments