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(String groupId, String rowId);
|
|
|
|
void insertRow(String groupId, RowPB row, int? index);
|
|
|
|
void updateRow(String groupId, RowPB row);
|
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
2022-08-17 20:15:10 +08:00
|
|
|
}) : _listener = GroupListener(group);
|
2022-08-17 19:29:14 +08:00
|
|
|
|
2022-08-17 20:15:10 +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
|
|
|
|
2022-08-17 20:15:10 +08:00
|
|
|
void startListening() {
|
2022-08-16 17:13:56 +08:00
|
|
|
_listener.start(onGroupChanged: (result) {
|
|
|
|
result.fold(
|
|
|
|
(GroupRowsChangesetPB changeset) {
|
|
|
|
for (final insertedRow in changeset.insertedRows) {
|
|
|
|
final index = insertedRow.hasIndex() ? insertedRow.index : null;
|
|
|
|
delegate.insertRow(
|
|
|
|
group.groupId,
|
|
|
|
insertedRow.row,
|
|
|
|
index,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (final deletedRow in changeset.deletedRows) {
|
|
|
|
delegate.removeRow(group.groupId, deletedRow);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (final updatedRow in changeset.updatedRows) {
|
|
|
|
delegate.updateRow(group.groupId, updatedRow);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
(err) => Log.error(err),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> dispose() async {
|
|
|
|
_listener.stop();
|
|
|
|
}
|
|
|
|
}
|