Skip to content

Commit

Permalink
fix: widget rebuilds
Browse files Browse the repository at this point in the history
  • Loading branch information
richardshiue committed May 8, 2024
1 parent 0112aa6 commit 8f12181
Show file tree
Hide file tree
Showing 7 changed files with 445 additions and 368 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,19 +102,20 @@ class _BoardContentState extends State<_BoardContent> {
);

return BlocListener<BoardBloc, BoardState>(
listenWhen: (previous, current) => current.isOpenCard,
listener: (context, state) {
state.maybeWhen(
state.maybeMap(
orElse: () {},
openCard: (rowMeta) {
context.push(
MobileRowDetailPage.routeName,
extra: {
MobileRowDetailPage.argRowId: rowMeta.id,
MobileRowDetailPage.argDatabaseController:
context.read<BoardBloc>().databaseController,
},
);
ready: (value) {
if (context.mounted && value.createdRow != null) {
context.push(
MobileRowDetailPage.routeName,
extra: {
MobileRowDetailPage.argRowId: value.createdRow!.rowMeta.id,
MobileRowDetailPage.argDatabaseController:
context.read<BoardBloc>().databaseController,
},
);
}
},
);
},
Expand Down Expand Up @@ -241,15 +242,8 @@ class _BoardContentState extends State<_BoardContent> {
},
);
},
onStartEditing: () => boardBloc.add(
BoardEvent.startEditingRow(
GroupedRowId(
groupId: groupData.group.groupId,
rowId: groupItem.row.id,
),
),
),
onEndEditing: () => boardBloc.add(const BoardEvent.endEditingRow()),
onStartEditing: () {},
onEndEditing: () {},
styleConfiguration: RowCardStyleConfiguration(
cellStyleMap: mobileBoardCardCellStyleMap(context),
showAccessory: false,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import 'package:appflowy/plugins/database/application/database_controller.dart';
import 'package:appflowy/plugins/database/board/application/board_bloc.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'board_actions_bloc.freezed.dart';

class BoardActionsCubit extends Cubit<BoardActionsState> {
BoardActionsCubit({
required this.databaseController,
}) : super(const BoardActionsState.initial());

final DatabaseController databaseController;

void startEditingRow(GroupedRowId groupedRowId) {
emit(BoardActionsState.startEditingRow(groupedRowId: groupedRowId));
emit(const BoardActionsState.initial());
}

void endEditing(GroupedRowId groupedRowId) {
emit(const BoardActionsState.endEditingRow());
emit(BoardActionsState.setFocus(groupedRowIds: [groupedRowId]));
emit(const BoardActionsState.initial());
}

void openCard(RowMetaPB rowMeta) {
emit(BoardActionsState.openCard(rowMeta: rowMeta));
emit(const BoardActionsState.initial());
}

void openCardWithRowId(rowId) {
final rowMeta = databaseController.rowCache.getRow(rowId)!.rowMeta;
openCard(rowMeta);
}

void setFocus(List<GroupedRowId> groupedRowIds) {
emit(BoardActionsState.setFocus(groupedRowIds: groupedRowIds));
emit(const BoardActionsState.initial());
}

void startCreateBottomRow(String groupId) {
emit(BoardActionsState.startCreateBottomRow(groupId: groupId));
emit(const BoardActionsState.initial());
}

void createRow(
GroupedRowId? groupedRowId,
CreateBoardCardRelativePosition relativePosition,
) {
emit(
BoardActionsState.createRow(
groupedRowId: groupedRowId,
position: relativePosition,
),
);
emit(const BoardActionsState.initial());
}
}

@freezed
class BoardActionsState with _$BoardActionsState {
const factory BoardActionsState.initial() = _BoardActionsInitialState;

const factory BoardActionsState.openCard({
required RowMetaPB rowMeta,
}) = _BoardActionsOpenCardState;

const factory BoardActionsState.startEditingRow({
required GroupedRowId groupedRowId,
}) = _BoardActionsStartEditingRowState;

const factory BoardActionsState.endEditingRow() =
_BoardActionsEndEditingRowState;

const factory BoardActionsState.setFocus({
required List<GroupedRowId> groupedRowIds,
}) = _BoardActionsSetFocusState;

const factory BoardActionsState.startCreateBottomRow({
required String groupId,
}) = _BoardActionsStartCreateBottomRowState;

const factory BoardActionsState.createRow({
required GroupedRowId? groupedRowId,
required CreateBoardCardRelativePosition position,
}) = _BoardActionCreateRowState;
}

enum CreateBoardCardRelativePosition {
before,
after,
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,28 +108,31 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
);

final startEditing = position != OrderObjectPositionTypePB.End;
final action = PlatformExtension.isMobile
? DidCreateRowAction.openAsPage
: startEditing
? DidCreateRowAction.startEditing
: DidCreateRowAction.none;

result.fold(
(rowMeta) {
if (PlatformExtension.isMobile) {
final previousState = state;
state.maybeMap(
ready: (state) {
emit(BoardState.openCard(rowMeta: rowMeta));
emit(previousState);
},
orElse: () {},
);
} else if (startEditing) {
add(
BoardEvent.startEditingRow(
GroupedRowId(
groupId: groupId,
rowId: rowMeta.id,
),
),
);
}
state.maybeMap(
ready: (value) {
if (action != DidCreateRowAction.none) {
emit(
value.copyWith(
createdRow: DidCreateRowResult(
action: action,
rowMeta: rowMeta,
groupId: groupId,
),
),
);
emit(value);
}
},
orElse: () {},
);
},
(err) => Log.error(err),
);
Expand Down Expand Up @@ -194,30 +197,6 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
reorderGroup: (fromGroupId, toGroupId) async {
_reorderGroup(fromGroupId, toGroupId, emit);
},
startEditingRow: (groupedRowId) {
_setBoardIsDraggable(true);
final previousState = state;
emit(const BoardState.setFocus(groupedRowIds: []));
previousState.maybeMap(
ready: (state) => emit(state.copyWith(editingRow: groupedRowId)),
orElse: () {},
);
},
endEditingRow: () {
_setBoardIsDraggable(false);
final previousState = state;
final groupedRowId = state.maybeMap(
ready: (value) => value.editingRow,
orElse: () => null,
);
if (groupedRowId != null) {
emit(BoardState.setFocus(groupedRowIds: [groupedRowId]));
}
previousState.maybeMap(
ready: (state) => emit(state.copyWith(editingRow: null)),
orElse: () {},
);
},
startEditingHeader: (String groupId) {
state.maybeMap(
ready: (state) => emit(state.copyWith(editingHeaderId: groupId)),
Expand All @@ -239,17 +218,6 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
final rowIds = groupedRowIds.map((e) => e.rowId).toList();
await RowBackendService.deleteRows(viewId, rowIds);
},
openCard: (groupedRowId) {
final previousState = state;
emit(
BoardState.openCard(
rowMeta: databaseController.rowCache
.getRow(groupedRowId.rowId)!
.rowMeta,
),
);
emit(previousState);
},
moveGroupToAdjacentGroup: (groupedRowId, toPrevious) async {
final fromRow =
databaseController.rowCache.getRow(groupedRowId.rowId)?.rowMeta;
Expand Down Expand Up @@ -285,20 +253,11 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
);
}
},
startCreatingBottomRow: (groupId) {
final previousState = state;
emit(BoardState.createBottomRow(groupId: groupId));
emit(previousState);
},
);
},
);
}

void _setBoardIsDraggable(bool isEdit) {
boardController.enableGroupDragging(!isEdit);
}

Future<void> _setGroupVisibility(GroupPB group, bool isVisible) async {
if (group.isDefault) {
await state.maybeMap(
Expand Down Expand Up @@ -642,9 +601,6 @@ class BoardEvent with _$BoardEvent {
_StartEditingHeader;
const factory BoardEvent.endEditingHeader(String groupId, String? groupName) =
_EndEditingHeader;
const factory BoardEvent.startEditingRow(GroupedRowId groupedRowId) =
_StartEditRow;
const factory BoardEvent.endEditingRow() = _EndEditRow;
const factory BoardEvent.setGroupVisibility(
GroupPB group,
bool isVisible,
Expand All @@ -662,13 +618,10 @@ class BoardEvent with _$BoardEvent {
) = _DidUpdateLayoutSettings;
const factory BoardEvent.deleteCards(List<GroupedRowId> groupedRowIds) =
_DeleteCards;
const factory BoardEvent.openCard(GroupedRowId groupedRowId) = _OpenCard;
const factory BoardEvent.moveGroupToAdjacentGroup(
GroupedRowId groupedRowId,
bool toPrevious,
) = _MoveGroupToAdjacentGroup;
const factory BoardEvent.startCreatingBottomRow(String groupId) =
_StartCreatingBottomRow;
}

@freezed
Expand All @@ -689,21 +642,13 @@ class BoardState with _$BoardState {
required BoardLayoutSettingPB? layoutSettings,
required List<GroupPB> hiddenGroups,
String? editingHeaderId,
GroupedRowId? editingRow,
DidCreateRowResult? createdRow,
}) = _BoardReadyState;

const factory BoardState.openCard({
required RowMetaPB rowMeta,
}) = _BoardOpenCardState;

const factory BoardState.setFocus({
required List<GroupedRowId> groupedRowIds,
}) = _BoardSetFocusState;

const factory BoardState.createBottomRow({
required String groupId,
}) = _BoardCreateBottomRowState;

factory BoardState.initial(String viewId) => BoardState.ready(
viewId: viewId,
groupIds: [],
Expand All @@ -716,10 +661,7 @@ class BoardState with _$BoardState {
bool get isLoading => maybeMap(loading: (_) => true, orElse: () => false);
bool get isError => maybeMap(error: (_) => true, orElse: () => false);
bool get isReady => maybeMap(ready: (_) => true, orElse: () => false);
bool get isOpenCard => maybeMap(openCard: (_) => true, orElse: () => false);
bool get isSetFocus => maybeMap(setFocus: (_) => true, orElse: () => false);
bool get isCreateBottomRow =>
maybeMap(createBottomRow: (_) => true, orElse: () => false);
}

List<GroupPB> _filterHiddenGroups(bool hideUngrouped, List<GroupPB> groups) {
Expand Down Expand Up @@ -860,3 +802,21 @@ class CheckboxGroup {
// pub const CHECK: &str = "Yes";
bool get isCheck => group.groupId == "Yes";
}

enum DidCreateRowAction {
none,
openAsPage,
startEditing,
}

class DidCreateRowResult {
DidCreateRowResult({
required this.action,
required this.rowMeta,
required this.groupId,
});

final DidCreateRowAction action;
final RowMetaPB rowMeta;
final String groupId;
}
Loading

0 comments on commit 8f12181

Please sign in to comment.