]> git.proxmox.com Git - flutter/pve_flutter_frontend.git/blame - lib/bloc/pve_node_overview_bloc.dart
node overview: don't throw permission errors on every update
[flutter/pve_flutter_frontend.git] / lib / bloc / pve_node_overview_bloc.dart
CommitLineData
694d7a8f
TM
1import 'dart:async';
2
694d7a8f
TM
3import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart';
4import 'package:pve_flutter_frontend/bloc/proxmox_base_bloc.dart';
5import 'package:pve_flutter_frontend/states/pve_node_overview_state.dart';
6
7class PveNodeOverviewBloc
8 extends ProxmoxBaseBloc<PveNodeOverviewEvent, PveNodeOverviewState> {
9 final ProxmoxApiClient apiClient;
10 final String nodeID;
11 final PveNodeOverviewState init;
12 @override
13 PveNodeOverviewState get initialState => init;
14
15 PveNodeOverviewBloc(
598a93b4 16 {required this.apiClient, required this.nodeID, required this.init});
694d7a8f 17
598a93b4 18 Timer? sTimer;
694d7a8f
TM
19 @override
20 void doOnListen() {
21 sTimer = Timer.periodic(
5d2e7931 22 const Duration(seconds: 4), (timer) => events.add(UpdateNodeStatus()));
694d7a8f
TM
23 }
24
25 @override
26 void doOnCancel() {
27 if (!hasListener) {
28 sTimer?.cancel();
29 }
30 }
31
32 @override
33 Stream<PveNodeOverviewState> processEvents(
34 PveNodeOverviewEvent event) async* {
35 if (event is UpdateNodeStatus) {
36 final status = await apiClient.getNodeStatus(nodeID);
37 yield latestState.rebuild((b) => b..status.replace(status));
38 final rrdData =
39 await apiClient.getNodeRRDdata(nodeID, PveRRDTimeframeType.hour);
40 yield latestState.rebuild((b) => b..rrdData.replace(rrdData));
41 final services = await apiClient.getNodeServices(nodeID);
42 yield latestState.rebuild((b) => b..services.replace(services));
bfa1fc69
DC
43 try {
44 final updates = await apiClient.getNodeAptUpdate(nodeID);
45 yield latestState.rebuild((b) => b..updates.replace(updates));
46 } on ProxmoxApiException catch (e) {
47 // only throw on non permission related errors
48 if (e.statusCode != 403) {
49 rethrow;
50 }
51 }
694d7a8f
TM
52 final disks = await apiClient.getNodeDisksList(nodeID);
53 yield latestState.rebuild((b) => b..disks.replace(disks));
54 }
55 }
56}
57
58abstract class PveNodeOverviewEvent {}
59
60class UpdateNodeStatus extends PveNodeOverviewEvent {}