advancedParametersHubFamily top-level property

AutoDisposeStreamProviderFamily<List<AdvancedParameterValue>, SubDeviceId> advancedParametersHubFamily
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;
});