Skip to content

Commit e3a1384

Browse files
committed
fix: open latest after deleting current view
1 parent 81ecbd8 commit e3a1384

File tree

11 files changed

+82
-37
lines changed

11 files changed

+82
-37
lines changed

frontend/app_flowy/lib/plugins/board/board.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@ class GridPluginDisplay extends PluginDisplay {
6868
@override
6969
Widget buildWidget(PluginContext context) {
7070
notifier.isDeleted.addListener(() {
71-
if (notifier.isDeleted.value) {
72-
context.onDeleted(view);
73-
}
71+
notifier.isDeleted.value.fold(() => null, (deletedView) {
72+
if (deletedView.hasIndex()) {
73+
context.onDeleted(view, deletedView.index);
74+
}
75+
});
7476
});
7577

7678
return BoardPage(key: ValueKey(view.id), view: view);

frontend/app_flowy/lib/plugins/doc/document.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,26 @@ class DocumentPlugin extends Plugin<int> {
7474
class DocumentPluginDisplay extends PluginDisplay with NavigationItem {
7575
final ViewPluginNotifier notifier;
7676
ViewPB get view => notifier.view;
77+
int? deletedViewIndex;
7778

7879
DocumentPluginDisplay({required this.notifier, Key? key});
7980

8081
@override
81-
Widget buildWidget(PluginContext context) => DocumentPage(
82-
view: view,
83-
onDeleted: () => context.onDeleted(view),
84-
key: ValueKey(view.id),
85-
);
82+
Widget buildWidget(PluginContext context) {
83+
notifier.isDeleted.addListener(() {
84+
notifier.isDeleted.value.fold(() => null, (deletedView) {
85+
if (deletedView.hasIndex()) {
86+
deletedViewIndex = deletedView.index;
87+
}
88+
});
89+
});
90+
91+
return DocumentPage(
92+
view: view,
93+
onDeleted: () => context.onDeleted(view, deletedViewIndex),
94+
key: ValueKey(view.id),
95+
);
96+
}
8697

8798
@override
8899
Widget get leftBarItem => ViewLeftBarItem(view: view);

frontend/app_flowy/lib/plugins/grid/grid.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,11 @@ class GridPluginDisplay extends PluginDisplay {
7070
@override
7171
Widget buildWidget(PluginContext context) {
7272
notifier.isDeleted.addListener(() {
73-
if (notifier.isDeleted.value) {
74-
context.onDeleted(view);
75-
}
73+
notifier.isDeleted.value.fold(() => null, (deletedView) {
74+
if (deletedView.hasIndex()) {
75+
context.onDeleted(view, deletedView.index);
76+
}
77+
});
7678
});
7779

7880
return GridPage(key: ValueKey(view.id), view: view);

frontend/app_flowy/lib/plugins/util.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import 'package:app_flowy/startup/plugin/plugin.dart';
22
import 'package:app_flowy/workspace/application/view/view_listener.dart';
3+
import 'package:dartz/dartz.dart';
34
import 'package:flowy_sdk/log.dart';
45
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
56
import 'package:flutter/material.dart';
67

7-
class ViewPluginNotifier extends PluginNotifier {
8+
class ViewPluginNotifier extends PluginNotifier<Option<DeletedViewPB>> {
89
final ViewListener? _viewListener;
910
ViewPB view;
1011

1112
@override
12-
final ValueNotifier<bool> isDeleted = ValueNotifier(false);
13+
final ValueNotifier<Option<DeletedViewPB>> isDeleted = ValueNotifier(none());
1314

1415
@override
1516
final ValueNotifier<int> isDisplayChanged = ValueNotifier(0);
@@ -27,9 +28,7 @@ class ViewPluginNotifier extends PluginNotifier {
2728
);
2829
}, onViewMoveToTrash: (result) {
2930
result.fold(
30-
(deletedView) {
31-
isDeleted.value = true;
32-
},
31+
(deletedView) => isDeleted.value = some(deletedView),
3332
(err) => Log.error(err),
3433
);
3534
});

frontend/app_flowy/lib/startup/plugin/plugin.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ abstract class Plugin<T> {
3232
}
3333
}
3434

35-
abstract class PluginNotifier {
35+
abstract class PluginNotifier<T> {
3636
/// Notify if the plugin get deleted
37-
ValueNotifier<bool> get isDeleted;
37+
ValueNotifier<T> get isDeleted;
3838

3939
/// Notify if the [PluginDisplay]'s content was changed
4040
ValueNotifier<int> get isDisplayChanged;
@@ -67,7 +67,7 @@ abstract class PluginDisplay with NavigationItem {
6767

6868
class PluginContext {
6969
// calls when widget of the plugin get deleted
70-
final Function(ViewPB) onDeleted;
70+
final Function(ViewPB, int?) onDeleted;
7171

7272
PluginContext({required this.onDeleted});
7373
}

frontend/app_flowy/lib/workspace/application/view/view_listener.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ typedef UpdateViewNotifiedValue = Either<ViewPB, FlowyError>;
1616
// Restore the view from trash
1717
typedef RestoreViewNotifiedValue = Either<ViewPB, FlowyError>;
1818
// Move the view to trash
19-
typedef MoveToTrashNotifiedValue = Either<ViewIdPB, FlowyError>;
19+
typedef MoveToTrashNotifiedValue = Either<DeletedViewPB, FlowyError>;
2020

2121
class ViewListener {
2222
StreamSubscription<SubscribeObject>? _subscription;
@@ -98,8 +98,8 @@ class ViewListener {
9898
break;
9999
case FolderNotification.ViewMoveToTrash:
100100
result.fold(
101-
(payload) =>
102-
_moveToTrashNotifier.value = left(ViewIdPB.fromBuffer(payload)),
101+
(payload) => _moveToTrashNotifier.value =
102+
left(DeletedViewPB.fromBuffer(payload)),
103103
(error) => _moveToTrashNotifier.value = right(error),
104104
);
105105
break;

frontend/app_flowy/lib/workspace/presentation/home/home_screen.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,14 +251,18 @@ class HomeScreenStackAdaptor extends HomeStackDelegate {
251251
});
252252

253253
@override
254-
void didDeleteStackWidget(ViewPB view) {
254+
void didDeleteStackWidget(ViewPB view, int? index) {
255255
final homeService = HomeService();
256256
homeService.readApp(appId: view.appId).then((result) {
257257
result.fold(
258258
(appPB) {
259259
final List<ViewPB> views = appPB.belongings.items;
260260
if (views.isNotEmpty) {
261-
final lastView = views.last;
261+
var lastView = views.last;
262+
if (index != null && index != 0 && views.length > index - 1) {
263+
lastView = views[index - 1];
264+
}
265+
262266
final plugin = makePlugin(
263267
pluginType: lastView.pluginType,
264268
data: lastView,

frontend/app_flowy/lib/workspace/presentation/home/home_stack.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import 'home_layout.dart';
1818
typedef NavigationCallback = void Function(String id);
1919

2020
abstract class HomeStackDelegate {
21-
void didDeleteStackWidget(ViewPB view);
21+
void didDeleteStackWidget(ViewPB view, int? index);
2222
}
2323

2424
class HomeStack extends StatelessWidget {
@@ -41,9 +41,11 @@ class HomeStack extends StatelessWidget {
4141
child: Container(
4242
color: theme.surface,
4343
child: FocusTraversalGroup(
44-
child: getIt<HomeStackManager>().stackWidget(onDeleted: (view) {
45-
delegate.didDeleteStackWidget(view);
46-
}),
44+
child: getIt<HomeStackManager>().stackWidget(
45+
onDeleted: (view, index) {
46+
delegate.didDeleteStackWidget(view, index);
47+
},
48+
),
4749
),
4850
),
4951
),
@@ -168,7 +170,7 @@ class HomeStackManager {
168170
);
169171
}
170172

171-
Widget stackWidget({required Function(ViewPB) onDeleted}) {
173+
Widget stackWidget({required Function(ViewPB, int?) onDeleted}) {
172174
return MultiProvider(
173175
providers: [ChangeNotifierProvider.value(value: _notifier)],
174176
child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {

frontend/rust-lib/flowy-folder/src/entities/view.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,15 @@ impl std::convert::From<&str> for ViewIdPB {
206206
}
207207
}
208208

209+
#[derive(Default, ProtoBuf, Clone, Debug)]
210+
pub struct DeletedViewPB {
211+
#[pb(index = 1)]
212+
pub view_id: String,
213+
214+
#[pb(index = 2, one_of)]
215+
pub index: Option<i32>,
216+
}
217+
209218
impl std::ops::Deref for ViewIdPB {
210219
type Target = str;
211220

frontend/rust-lib/flowy-folder/src/services/view/controller.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pub use crate::entities::view::ViewDataTypePB;
2-
use crate::entities::{ViewInfoPB, ViewLayoutTypePB};
2+
use crate::entities::{DeletedViewPB, ViewInfoPB, ViewLayoutTypePB};
33
use crate::manager::{ViewDataProcessor, ViewDataProcessorMap};
44
use crate::{
55
dart_notification::{send_dart_notification, FolderNotification},
@@ -122,20 +122,19 @@ impl ViewController {
122122
.await
123123
}
124124

125-
#[tracing::instrument(level = "debug", skip(self, view_id), fields(view_id = %view_id.value), err)]
126-
pub(crate) async fn read_view(&self, view_id: ViewIdPB) -> Result<ViewRevision, FlowyError> {
125+
#[tracing::instrument(level = "debug", skip(self, view_id), err)]
126+
pub(crate) async fn read_view(&self, view_id: &str) -> Result<ViewRevision, FlowyError> {
127127
let view_rev = self
128128
.persistence
129129
.begin_transaction(|transaction| {
130-
let view = transaction.read_view(&view_id.value)?;
130+
let view = transaction.read_view(view_id)?;
131131
let trash_ids = self.trash_controller.read_trash_ids(&transaction)?;
132132
if trash_ids.contains(&view.id) {
133133
return Err(FlowyError::record_not_found());
134134
}
135135
Ok(view)
136136
})
137137
.await?;
138-
let _ = self.read_view_on_server(view_id);
139138
Ok(view_rev)
140139
}
141140

@@ -201,9 +200,26 @@ impl ViewController {
201200
let _ = KV::remove(LATEST_VIEW_ID);
202201
}
203202
}
204-
let view_id_pb = ViewIdPB::from(view_id.as_str());
203+
204+
let deleted_view = self
205+
.persistence
206+
.begin_transaction(|transaction| {
207+
let view = transaction.read_view(&view_id)?;
208+
let views = read_belonging_views_on_local(&view.app_id, self.trash_controller.clone(), &transaction)?;
209+
210+
let index = views
211+
.iter()
212+
.position(|view| view.id == view_id)
213+
.and_then(|index| Some(index as i32));
214+
Ok(DeletedViewPB {
215+
view_id: view_id.clone(),
216+
index,
217+
})
218+
})
219+
.await?;
220+
205221
send_dart_notification(&view_id, FolderNotification::ViewMoveToTrash)
206-
.payload(view_id_pb)
222+
.payload(deleted_view)
207223
.send();
208224

209225
let processor = self.get_data_processor_from_view_id(&view_id).await?;

0 commit comments

Comments
 (0)