advancedParametersHubFamily top-level property
final
Implementation
final advancedParametersHubFamily =
StreamProvider.autoDispose.family((ref, SubDeviceId id) async* {
final api = await ref.watch(energyManagementV3ApiProvider.future);
final parameters =
await api.kemApiV3DevicesIdGeneratorsGensetIdParametersAdvancedGet(
id: id.deviceId,
gensetId: id.subDeviceId,
);
var state = parameters.isSuccessful
? parameters.body?.items
?.map(
(dto) => dtoToParameterValue(debugParameterDefinitions, dto),
)
.whereNotNull()
.toList() ??
<AdvancedParameterValue>[]
: <AdvancedParameterValue>[];
final dataController = StreamController<List<AdvancedParameterValue>>()
..add(List.of(state));
final path = 'kem/api/v3/devices/${id.deviceId}/generators/'
'${id.subDeviceId}/parameters/advanced';
final hub =
await ref.watch(energyManagementV3SignalRHubProvider(path).future);
await hub.start();
ref.onDispose(() {
dataController.close();
hub.stop();
});
void registerUpdateHandler() {
hub.on('update', (data) {
final newData = data
?.expand(
(e) => dataToParameterValues(debugParameterDefinitions, e),
)
.whereNotNull()
.toList() ??
[];
final newState = <AdvancedParameterValue>[];
for (final stateItem in state) {
final dataItem = newData.firstWhereOrNull((i) => i.id == stateItem.id);
newState.add(dataItem ?? stateItem);
}
newState.addAll(newData.where((d) => state.every((s) => s.id != d.id)));
state = newState;
dataController.add(List.of(state));
});
}
hub.onreconnected(
({connectionId}) => registerUpdateHandler(),
);
registerUpdateHandler();
yield* dataController.stream;
});