| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2022-08-26 16:07:51 +08:00
										 |  |  |   void removeRow(GroupPB group, String rowId); | 
					
						
							|  |  |  |   void insertRow(GroupPB group, RowPB row, int? index); | 
					
						
							|  |  |  |   void updateRow(GroupPB group, RowPB row); | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |   void addNewRow(GroupPB group, RowPB row, int? index); | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											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-31 14:56:03 +08:00
										 |  |  |   RowPB? lastRow() { | 
					
						
							|  |  |  |     if (group.rows.isEmpty) return null; | 
					
						
							|  |  |  |     return group.rows.last; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-17 20:15:10 +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); | 
					
						
							| 
									
										
										
										
											2022-08-26 16:07:51 +08:00
										 |  |  |             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-29 16:32:20 +08:00
										 |  |  |             if (insertedRow.isNew) { | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |               delegate.addNewRow(group, insertedRow.row, index); | 
					
						
							| 
									
										
										
										
											2022-08-29 16:32:20 +08:00
										 |  |  |             } else { | 
					
						
							|  |  |  |               delegate.insertRow(group, insertedRow.row, index); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-08-16 17:13:56 +08:00
										 |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           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; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 16:07:51 +08:00
										 |  |  |             delegate.updateRow(group, updatedRow); | 
					
						
							| 
									
										
										
										
											2022-08-16 17:13:56 +08:00
										 |  |  |           } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         (err) => Log.error(err), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-27 21:22:26 +08:00
										 |  |  |   // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
 | 
					
						
							|  |  |  |   //   final insertedRows = changeset.insertedRows
 | 
					
						
							|  |  |  |   //       .where(
 | 
					
						
							|  |  |  |   //         (delete) => !changeset.deletedRows.contains(delete.row.id),
 | 
					
						
							|  |  |  |   //       )
 | 
					
						
							|  |  |  |   //       .toList();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //   final deletedRows = changeset.deletedRows
 | 
					
						
							|  |  |  |   //       .where((deletedRowId) =>
 | 
					
						
							|  |  |  |   //           changeset.insertedRows
 | 
					
						
							|  |  |  |   //               .indexWhere((insert) => insert.row.id == deletedRowId) ==
 | 
					
						
							|  |  |  |   //           -1)
 | 
					
						
							|  |  |  |   //       .toList();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //   return changeset.rebuild((rebuildChangeset) {
 | 
					
						
							|  |  |  |   //     rebuildChangeset.insertedRows.clear();
 | 
					
						
							|  |  |  |   //     rebuildChangeset.insertedRows.addAll(insertedRows);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //     rebuildChangeset.deletedRows.clear();
 | 
					
						
							|  |  |  |   //     rebuildChangeset.deletedRows.addAll(deletedRows);
 | 
					
						
							|  |  |  |   //   });
 | 
					
						
							|  |  |  |   // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 17:13:56 +08:00
										 |  |  |   Future<void> dispose() async { | 
					
						
							|  |  |  |     _listener.stop(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |