From 7e0ab8f9a974e38323ec12d9f93b2657162bbcd6 Mon Sep 17 00:00:00 2001 From: Tim Marx Date: Fri, 6 Dec 2019 17:32:19 +0100 Subject: [PATCH] add base bloc class Signed-off-by: Tim Marx --- lib/bloc/proxmox_base_bloc.dart | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 lib/bloc/proxmox_base_bloc.dart diff --git a/lib/bloc/proxmox_base_bloc.dart b/lib/bloc/proxmox_base_bloc.dart new file mode 100644 index 0000000..20b1627 --- /dev/null +++ b/lib/bloc/proxmox_base_bloc.dart @@ -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 { + final PublishSubject _eventSubject = PublishSubject(); + + BehaviorSubject _stateSubject; + + StreamSink get events => _eventSubject.sink; + + ValueObservable get state => _stateSubject.stream; + + S get latestState => _stateSubject.stream.value; + + S get initialState; + ProxmoxBaseBloc() { + _stateSubject = BehaviorSubject.seeded(initialState); + _initEventPipe(); + } + + Stream processEvents(E event); + + Stream eventPipe( + PublishSubject events, + Stream 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(); + } +} -- 2.39.5