81 lines
2.1 KiB
Dart
Raw Normal View History

2022-08-16 17:13:56 +08:00
import 'package:flowy_sdk/log.dart';
2022-08-17 19:29:14 +08:00
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
2022-08-16 17:13:56 +08:00
import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
import 'group_listener.dart';
2022-08-17 19:29:14 +08:00
typedef OnGroupError = void Function(FlowyError);
2022-08-16 17:13:56 +08:00
abstract class GroupControllerDelegate {
void removeRow(GroupPB group, String rowId);
void insertRow(GroupPB group, RowPB row, int? index);
void updateRow(GroupPB group, RowPB row);
2022-08-16 17:13:56 +08:00
}
class GroupController {
final GroupPB group;
final GroupListener _listener;
final GroupControllerDelegate delegate;
2022-08-17 19:29:14 +08:00
GroupController({
required String gridId,
required this.group,
required this.delegate,
}) : _listener = GroupListener(group);
2022-08-17 19:29:14 +08:00
RowPB? rowAtIndex(int index) {
if (index < group.rows.length) {
return group.rows[index];
} else {
return null;
2022-08-17 19:29:14 +08:00
}
}
2022-08-16 17:13:56 +08:00
void startListening() {
2022-08-16 17:13:56 +08:00
_listener.start(onGroupChanged: (result) {
result.fold(
2022-08-24 16:57:53 +08:00
(GroupChangesetPB changeset) {
for (final deletedRow in changeset.deletedRows) {
group.rows.removeWhere((rowPB) => rowPB.id == deletedRow);
delegate.removeRow(group, deletedRow);
2022-08-24 16:57:53 +08:00
}
2022-08-16 17:13:56 +08:00
for (final insertedRow in changeset.insertedRows) {
final index = insertedRow.hasIndex() ? insertedRow.index : null;
2022-08-22 16:16:15 +08:00
if (insertedRow.hasIndex() &&
group.rows.length > insertedRow.index) {
group.rows.insert(insertedRow.index, insertedRow.row);
} else {
group.rows.add(insertedRow.row);
}
2022-08-16 17:13:56 +08:00
delegate.insertRow(
group,
2022-08-16 17:13:56 +08:00
insertedRow.row,
index,
);
}
for (final updatedRow in changeset.updatedRows) {
2022-08-22 16:16:15 +08:00
final index = group.rows.indexWhere(
(rowPB) => rowPB.id == updatedRow.id,
);
if (index != -1) {
group.rows[index] = updatedRow;
}
delegate.updateRow(group, updatedRow);
2022-08-16 17:13:56 +08:00
}
},
(err) => Log.error(err),
);
});
}
Future<void> dispose() async {
_listener.stop();
}
}