cake_wallet/lib/utils/mobx.dart

90 lines
2.5 KiB
Dart
Raw Normal View History

2020-09-07 15:13:39 +00:00
import 'dart:async';
import 'package:hive/hive.dart';
2020-08-27 16:54:34 +00:00
import 'package:mobx/mobx.dart';
2020-09-07 15:13:39 +00:00
mixin Keyable {
dynamic keyIndex;
}
void connectDifferent<T extends Keyable, Y extends Keyable>(
2020-08-31 08:44:58 +00:00
ObservableList<T> source, ObservableList<Y> dest, Y Function(T) transform,
{bool Function(T) filter}) {
source.observe((ListChange<T> change) {
2020-09-07 15:13:39 +00:00
change.elementChanges.forEach((change) {
switch (change.type) {
case OperationType.add:
if (filter?.call(change.newValue as T) ?? true) {
dest.add(transform(change.newValue as T));
}
break;
case OperationType.remove:
// Hive could has equal index and key
dest.removeWhere(
(elem) => elem.keyIndex == (change.oldValue.key ?? change.index));
break;
case OperationType.update:
for (var i = 0; i < dest.length; i++) {
final item = dest[i];
if (item.keyIndex == change.newValue.key) {
dest[i] = transform(change.newValue as T);
}
}
break;
}
});
2020-08-27 16:54:34 +00:00
});
}
2020-09-07 15:13:39 +00:00
void connect<T extends Keyable>(
ObservableList<T> source, ObservableList<T> dest) {
2020-08-31 08:44:58 +00:00
source.observe((ListChange<T> change) {
2020-09-07 15:13:39 +00:00
source.observe((ListChange<T> change) {
change.elementChanges.forEach((change) {
switch (change.type) {
case OperationType.add:
// if (filter?.call(change.newValue as T) ?? true) {
dest.add(change.newValue as T);
// }
break;
case OperationType.remove:
// Hive could has equal index and key
dest.removeWhere((elem) =>
elem.keyIndex == (change.oldValue.key ?? change.index));
break;
case OperationType.update:
for (var i = 0; i < dest.length; i++) {
final item = dest[i];
if (item.keyIndex == change.newValue.key) {
dest[i] = change.newValue as T;
}
}
break;
}
});
});
});
}
StreamSubscription<BoxEvent> bindBox<T extends Keyable>(
Box<T> source, ObservableList<T> dest) {
return source.watch().listen((event) {
if (event.deleted) {
dest.removeWhere((el) => el.keyIndex == event.key);
}
final dynamic value = event.value;
if (value is T) {
final elIndex = dest.indexWhere((el) => el.keyIndex == value.keyIndex);
if (elIndex > -1) {
dest[elIndex] = value;
} else {
dest.add(value);
}
}
2020-08-27 16:54:34 +00:00
});
}