]> git.proxmox.com Git - flutter/pve_flutter_frontend.git/commitdiff
add base bloc class
authorTim Marx <t.marx@proxmox.com>
Fri, 6 Dec 2019 16:32:19 +0000 (17:32 +0100)
committerTim Marx <t.marx@proxmox.com>
Fri, 6 Dec 2019 16:32:19 +0000 (17:32 +0100)
Signed-off-by: Tim Marx <t.marx@proxmox.com>
lib/bloc/proxmox_base_bloc.dart [new file with mode: 0644]

diff --git a/lib/bloc/proxmox_base_bloc.dart b/lib/bloc/proxmox_base_bloc.dart
new file mode 100644 (file)
index 0000000..20b1627
--- /dev/null
@@ -0,0 +1,53 @@
+import 'dart:async';
+
+import 'package:meta/meta.dart';
+import 'package:pve_flutter_frontend/bloc/proxmox_global_error_bloc.dart';
+import 'package:rxdart/rxdart.dart';
+
+abstract class ProxmoxBaseBloc<E, S> {
+  final PublishSubject<E> _eventSubject = PublishSubject<E>();
+
+  BehaviorSubject<S> _stateSubject;
+
+  StreamSink<E> get events => _eventSubject.sink;
+
+  ValueObservable<S> get state => _stateSubject.stream;
+
+  S get latestState => _stateSubject.stream.value;
+
+  S get initialState;
+  ProxmoxBaseBloc() {
+    _stateSubject = BehaviorSubject<S>.seeded(initialState);
+    _initEventPipe();
+  }
+
+  Stream<S> processEvents(E event);
+
+  Stream<S> eventPipe(
+    PublishSubject<E> events,
+    Stream<S> pipeInto(E event),
+  ) {
+    return events.asyncExpand(pipeInto);
+  }
+
+  void _initEventPipe() {
+    eventPipe(_eventSubject,
+            (event) => processEvents(event).handleError(_errorHandler))
+        .forEach((S state) {
+      if (_stateSubject.isClosed) return;
+      _stateSubject.add(state);
+    });
+  }
+
+  void _errorHandler(Object error, [StackTrace stacktrace]) {
+    ProxmoxGlobalErrorBloc().addError(error);
+    print(error);
+    print(stacktrace);
+  }
+
+  @mustCallSuper
+  void dispose() {
+    _eventSubject?.close();
+    _stateSubject?.close();
+  }
+}