Skip to content

Commit 29e7e01

Browse files
committed
chore: hide edit button when start editing
1 parent 951206d commit 29e7e01

File tree

5 files changed

+69
-30
lines changed

5 files changed

+69
-30
lines changed

frontend/app_flowy/lib/plugins/board/application/card/card_bloc.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
77
import 'package:flutter_bloc/flutter_bloc.dart';
88
import 'package:freezed_annotation/freezed_annotation.dart';
99
import 'dart:async';
10-
1110
import 'card_data_controller.dart';
1211

1312
part 'card_bloc.freezed.dart';
@@ -21,6 +20,7 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
2120
required this.groupFieldId,
2221
required String gridId,
2322
required CardDataController dataController,
23+
required bool isEditing,
2424
}) : _rowService = RowFFIService(
2525
gridId: gridId,
2626
blockId: dataController.rowPB.blockId,
@@ -30,6 +30,7 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
3030
BoardCardState.initial(
3131
dataController.rowPB,
3232
_makeCells(groupFieldId, dataController.loadData()),
33+
isEditing,
3334
),
3435
) {
3536
on<BoardCardEvent>(
@@ -44,6 +45,9 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
4445
changeReason: reason,
4546
));
4647
},
48+
setIsEditing: (bool isEditing) {
49+
emit(state.copyWith(isEditing: isEditing));
50+
},
4751
);
4852
},
4953
);
@@ -92,6 +96,7 @@ List<BoardCellEquatable> _makeCells(
9296
@freezed
9397
class BoardCardEvent with _$BoardCardEvent {
9498
const factory BoardCardEvent.initial() = _InitialRow;
99+
const factory BoardCardEvent.setIsEditing(bool isEditing) = _IsEditing;
95100
const factory BoardCardEvent.didReceiveCells(
96101
List<BoardCellEquatable> cells,
97102
RowsChangedReason reason,
@@ -103,13 +108,19 @@ class BoardCardState with _$BoardCardState {
103108
const factory BoardCardState({
104109
required RowPB rowPB,
105110
required List<BoardCellEquatable> cells,
111+
required bool isEditing,
106112
RowsChangedReason? changeReason,
107113
}) = _BoardCardState;
108114

109-
factory BoardCardState.initial(RowPB rowPB, List<BoardCellEquatable> cells) =>
115+
factory BoardCardState.initial(
116+
RowPB rowPB,
117+
List<BoardCellEquatable> cells,
118+
bool isEditing,
119+
) =>
110120
BoardCardState(
111121
rowPB: rowPB,
112122
cells: cells,
123+
isEditing: isEditing,
113124
);
114125
}
115126

frontend/app_flowy/lib/plugins/board/presentation/card/board_cell.dart

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,62 @@
11
import 'package:app_flowy/plugins/grid/application/prelude.dart';
2-
import 'package:flowy_infra/notifier.dart';
32
import 'package:flutter/material.dart';
43

54
abstract class FocusableBoardCell {
65
set becomeFocus(bool isFocus);
76
}
87

98
class EditableCellNotifier {
10-
final Notifier becomeFirstResponder = Notifier();
11-
12-
final Notifier resignFirstResponder = Notifier();
13-
149
final ValueNotifier<bool> isCellEditing;
1510

1611
EditableCellNotifier({bool isEditing = false})
1712
: isCellEditing = ValueNotifier(isEditing);
1813

1914
void dispose() {
20-
becomeFirstResponder.dispose();
21-
resignFirstResponder.dispose();
2215
isCellEditing.dispose();
2316
}
2417
}
2518

2619
class EditableRowNotifier {
2720
final Map<EditableCellId, EditableCellNotifier> _cells = {};
21+
final ValueNotifier<bool> isEditing;
22+
23+
EditableRowNotifier({required bool isEditing})
24+
: isEditing = ValueNotifier(isEditing);
2825

2926
void insertCell(
3027
GridCellIdentifier cellIdentifier,
3128
EditableCellNotifier notifier,
3229
) {
30+
assert(
31+
_cells.values.isEmpty,
32+
'Only one cell can receive the notification',
33+
);
3334
final id = EditableCellId.from(cellIdentifier);
3435
_cells[id]?.dispose();
3536

36-
notifier.isCellEditing.addListener(() {});
37+
notifier.isCellEditing.addListener(() {
38+
isEditing.value = notifier.isCellEditing.value;
39+
});
3740

3841
_cells[EditableCellId.from(cellIdentifier)] = notifier;
3942
}
4043

4144
void becomeFirstResponder() {
42-
for (final notifier in _cells.values) {
43-
notifier.becomeFirstResponder.notify();
44-
}
45+
if (_cells.values.isEmpty) return;
46+
assert(
47+
_cells.values.length == 1,
48+
'Only one cell can receive the notification',
49+
);
50+
_cells.values.first.isCellEditing.value = true;
4551
}
4652

4753
void resignFirstResponder() {
48-
for (final notifier in _cells.values) {
49-
notifier.resignFirstResponder.notify();
50-
}
54+
if (_cells.values.isEmpty) return;
55+
assert(
56+
_cells.values.length == 1,
57+
'Only one cell can receive the notification',
58+
);
59+
_cells.values.first.isCellEditing.value = false;
5160
}
5261

5362
void clear() {
@@ -59,7 +68,7 @@ class EditableRowNotifier {
5968

6069
void dispose() {
6170
for (final notifier in _cells.values) {
62-
notifier.resignFirstResponder.notify();
71+
notifier.dispose();
6372
}
6473

6574
_cells.clear();

frontend/app_flowy/lib/plugins/board/presentation/card/board_text_cell.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,16 @@ class _BoardTextCellState extends State<BoardTextCell> {
5454
}
5555

5656
void _bindEditableNotifier() {
57-
widget.editableNotifier?.becomeFirstResponder.addListener(() {
57+
widget.editableNotifier?.isCellEditing.addListener(() {
5858
if (!mounted) return;
59-
WidgetsBinding.instance.addPostFrameCallback((_) {
60-
focusNode.requestFocus();
61-
});
62-
_cellBloc.add(const BoardTextCellEvent.enableEdit(true));
63-
});
6459

65-
widget.editableNotifier?.resignFirstResponder.addListener(() {
66-
if (!mounted) return;
67-
_cellBloc.add(const BoardTextCellEvent.enableEdit(false));
60+
final isEditing = widget.editableNotifier?.isCellEditing.value ?? false;
61+
if (isEditing) {
62+
WidgetsBinding.instance.addPostFrameCallback((_) {
63+
focusNode.requestFocus();
64+
});
65+
}
66+
_cellBloc.add(BoardTextCellEvent.enableEdit(isEditing));
6867
});
6968
}
7069

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,19 @@ class _BoardCardState extends State<BoardCard> {
4242

4343
@override
4444
void initState() {
45-
rowNotifier = EditableRowNotifier();
45+
rowNotifier = EditableRowNotifier(isEditing: widget.isEditing);
4646
_cardBloc = BoardCardBloc(
4747
gridId: widget.gridId,
4848
groupFieldId: widget.fieldId,
4949
dataController: widget.dataController,
50+
isEditing: widget.isEditing,
5051
)..add(const BoardCardEvent.initial());
52+
53+
rowNotifier.isEditing.addListener(() {
54+
if (!mounted) return;
55+
_cardBloc.add(BoardCardEvent.setIsEditing(rowNotifier.isEditing.value));
56+
});
57+
5158
super.initState();
5259
}
5360

@@ -57,13 +64,15 @@ class _BoardCardState extends State<BoardCard> {
5764
value: _cardBloc,
5865
child: BlocBuilder<BoardCardBloc, BoardCardState>(
5966
buildWhen: (previous, current) {
60-
if (previous.cells.length != current.cells.length) {
67+
if (previous.cells.length != current.cells.length ||
68+
previous.isEditing != current.isEditing) {
6169
return true;
6270
}
6371
return !listEquals(previous.cells, current.cells);
6472
},
6573
builder: (context, state) {
6674
return BoardCardContainer(
75+
buildAccessoryWhen: () => state.isEditing == false,
6776
accessoryBuilder: (context) {
6877
return [
6978
_CardEditOption(
@@ -98,7 +107,11 @@ class _BoardCardState extends State<BoardCard> {
98107
(int index, GridCellIdentifier cellId) {
99108
EditableCellNotifier cellNotifier;
100109
if (index == 0) {
101-
cellNotifier = EditableCellNotifier(isEditing: widget.isEditing);
110+
// Only use the first cell to receive user's input when click the edit
111+
// button
112+
cellNotifier = EditableCellNotifier(
113+
isEditing: rowNotifier.isEditing.value,
114+
);
102115
rowNotifier.insertCell(cellId, cellNotifier);
103116
} else {
104117
cellNotifier = EditableCellNotifier();

frontend/app_flowy/lib/plugins/board/presentation/card/card_container.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import 'package:styled_widget/styled_widget.dart';
77
class BoardCardContainer extends StatelessWidget {
88
final Widget child;
99
final CardAccessoryBuilder? accessoryBuilder;
10+
final bool Function()? buildAccessoryWhen;
1011
final void Function(BuildContext) onTap;
1112
const BoardCardContainer({
1213
required this.child,
1314
required this.onTap,
1415
this.accessoryBuilder,
16+
this.buildAccessoryWhen,
1517
Key? key,
1618
}) : super(key: key);
1719

@@ -22,7 +24,12 @@ class BoardCardContainer extends StatelessWidget {
2224
child: Consumer<_CardContainerNotifier>(
2325
builder: (context, notifier, _) {
2426
Widget container = Center(child: child);
25-
if (accessoryBuilder != null) {
27+
bool shouldBuildAccessory = true;
28+
if (buildAccessoryWhen != null) {
29+
shouldBuildAccessory = buildAccessoryWhen!.call();
30+
}
31+
32+
if (accessoryBuilder != null && shouldBuildAccessory) {
2633
final accessories = accessoryBuilder!(context);
2734
if (accessories.isNotEmpty) {
2835
container = _CardEnterRegion(

0 commit comments

Comments
 (0)