فهرست منبع

chore: update row state using provider

appflowy 3 سال پیش
والد
کامیت
6ac2617113

+ 0 - 10
frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart

@@ -41,12 +41,6 @@ class RowBloc extends Bloc<RowEvent, RowState> {
           createRow: (_CreateRow value) {
             rowService.createRow();
           },
-          activeRow: (_ActiveRow value) {
-            emit(state.copyWith(active: true));
-          },
-          disactiveRow: (_DisactiveRow value) {
-            emit(state.copyWith(active: false));
-          },
           didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
             emit(state.copyWith(fields: value.fields));
             add(const RowEvent.didUpdateCell());
@@ -133,8 +127,6 @@ class RowBloc extends Bloc<RowEvent, RowState> {
 class RowEvent with _$RowEvent {
   const factory RowEvent.initial() = _InitialRow;
   const factory RowEvent.createRow() = _CreateRow;
-  const factory RowEvent.activeRow() = _ActiveRow;
-  const factory RowEvent.disactiveRow() = _DisactiveRow;
   const factory RowEvent.didReceiveFieldUpdate(List<Field> fields) = _DidReceiveFieldUpdate;
   const factory RowEvent.didUpdateCell() = _DidUpdateCell;
 }
@@ -143,7 +135,6 @@ class RowEvent with _$RowEvent {
 class RowState with _$RowState {
   const factory RowState({
     required String rowId,
-    required bool active,
     required double rowHeight,
     required List<Field> fields,
     required Future<Option<Row>> row,
@@ -152,7 +143,6 @@ class RowState with _$RowState {
 
   factory RowState.initial(GridRowData data) => RowState(
         rowId: data.rowId,
-        active: false,
         rowHeight: data.height,
         fields: data.fields,
         row: Future(() => none()),

+ 42 - 23
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart

@@ -6,6 +6,7 @@ import 'package:flowy_infra/theme.dart';
 import 'package:flowy_infra_ui/style_widget/icon_button.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:provider/provider.dart';
 import 'cell_builder.dart';
 import 'cell_container.dart';
 
@@ -19,10 +20,12 @@ class GridRowWidget extends StatefulWidget {
 
 class _GridRowWidgetState extends State<GridRowWidget> {
   late RowBloc _rowBloc;
+  late RowRegionStateNotifier _rowStateNotifier;
 
   @override
   void initState() {
     _rowBloc = getIt<RowBloc>(param1: widget.data)..add(const RowEvent.initial());
+    _rowStateNotifier = RowRegionStateNotifier();
     super.initState();
   }
 
@@ -30,25 +33,28 @@ class _GridRowWidgetState extends State<GridRowWidget> {
   Widget build(BuildContext context) {
     return BlocProvider.value(
       value: _rowBloc,
-      child: MouseRegion(
-        cursor: SystemMouseCursors.click,
-        onEnter: (p) => _rowBloc.add(const RowEvent.activeRow()),
-        onExit: (p) => _rowBloc.add(const RowEvent.disactiveRow()),
-        child: BlocBuilder<RowBloc, RowState>(
-          buildWhen: (p, c) => p.rowHeight != c.rowHeight,
-          builder: (context, state) {
-            return SizedBox(
-              height: _rowBloc.state.rowHeight,
-              child: Row(
-                crossAxisAlignment: CrossAxisAlignment.stretch,
-                children: const [
-                  _RowLeading(),
-                  _RowCells(),
-                  _RowTrailing(),
-                ],
-              ),
-            );
-          },
+      child: ChangeNotifierProvider.value(
+        value: _rowStateNotifier,
+        child: MouseRegion(
+          cursor: SystemMouseCursors.click,
+          onEnter: (p) => _rowStateNotifier.onEnter = true,
+          onExit: (p) => _rowStateNotifier.onEnter = false,
+          child: BlocBuilder<RowBloc, RowState>(
+            buildWhen: (p, c) => p.rowHeight != c.rowHeight,
+            builder: (context, state) {
+              return SizedBox(
+                height: _rowBloc.state.rowHeight,
+                child: Row(
+                  crossAxisAlignment: CrossAxisAlignment.stretch,
+                  children: const [
+                    _RowLeading(),
+                    _RowCells(),
+                    _RowTrailing(),
+                  ],
+                ),
+              );
+            },
+          ),
         ),
       ),
     );
@@ -57,6 +63,7 @@ class _GridRowWidgetState extends State<GridRowWidget> {
   @override
   Future<void> dispose() async {
     _rowBloc.close();
+    _rowStateNotifier.dispose();
     super.dispose();
   }
 }
@@ -66,10 +73,9 @@ class _RowLeading extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return BlocSelector<RowBloc, RowState, bool>(
-      selector: (state) => state.active,
-      builder: (context, isActive) {
-        return SizedBox(width: GridSize.leadingHeaderPadding, child: isActive ? _activeWidget() : null);
+    return Consumer<RowRegionStateNotifier>(
+      builder: (context, state, _) {
+        return SizedBox(width: GridSize.leadingHeaderPadding, child: state.onEnter ? _activeWidget() : null);
       },
     );
   }
@@ -133,3 +139,16 @@ class _RowCells extends StatelessWidget {
     );
   }
 }
+
+class RowRegionStateNotifier extends ChangeNotifier {
+  bool _onEnter = false;
+
+  set onEnter(bool value) {
+    if (_onEnter != value) {
+      _onEnter = value;
+      notifyListeners();
+    }
+  }
+
+  bool get onEnter => _onEnter;
+}

+ 5 - 3
frontend/rust-lib/flowy-grid/src/services/grid_editor.rs

@@ -233,7 +233,7 @@ impl ClientGridEditor {
         }
     }
 
-    pub async fn update_cell(&self, changeset: CellMetaChangeset) -> FlowyResult<()> {
+    pub async fn update_cell(&self, mut changeset: CellMetaChangeset) -> FlowyResult<()> {
         if let Some(cell_data) = changeset.data.as_ref() {
             match self.pad.read().await.get_field(&changeset.field_id) {
                 None => {
@@ -241,7 +241,8 @@ impl ClientGridEditor {
                         .context(format!("Can not find the field with id: {}", &changeset.field_id)));
                 }
                 Some(field_meta) => {
-                    let _ = serialize_cell_data(cell_data, field_meta)?;
+                    let cell_data = serialize_cell_data(cell_data, field_meta)?;
+                    changeset.data = Some(cell_data);
                 }
             }
         }
@@ -300,7 +301,8 @@ impl ClientGridEditor {
 
     pub async fn grid_block_snapshots(&self, block_ids: Option<Vec<String>>) -> FlowyResult<Vec<GridBlockSnapshot>> {
         let block_ids = match block_ids {
-            None =>  self.pad
+            None => self
+                .pad
                 .read()
                 .await
                 .get_block_metas()

+ 1 - 2
shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs

@@ -24,8 +24,7 @@ pub struct GridBlockMetaPad {
 impl GridBlockMetaPad {
     pub fn from_delta(delta: GridBlockMetaDelta) -> CollaborateResult<Self> {
         let s = delta.to_str()?;
-        tracing::info!("delta: {}", delta);
-        tracing::info!("{}", s);
+        tracing::trace!("{}", s);
         let meta_data: GridBlockMetaData = serde_json::from_str(&s).map_err(|e| {
             let msg = format!("Deserialize delta to block meta failed: {}", e);
             CollaborateError::internal().context(msg)