]> git.proxmox.com Git - flutter/pve_flutter_frontend.git/blob - 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
1 import 'dart:async';
2
3 import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart';
4 import 'package:pve_flutter_frontend/bloc/proxmox_base_bloc.dart';
5 import 'package:pve_flutter_frontend/states/pve_node_overview_state.dart';
6
7 class 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(
16 {required this.apiClient, required this.nodeID, required this.init});
17
18 Timer? sTimer;
19 @override
20 void doOnListen() {
21 sTimer = Timer.periodic(
22 const Duration(seconds: 4), (timer) => events.add(UpdateNodeStatus()));
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));
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 }
52 final disks = await apiClient.getNodeDisksList(nodeID);
53 yield latestState.rebuild((b) => b..disks.replace(disks));
54 }
55 }
56 }
57
58 abstract class PveNodeOverviewEvent {}
59
60 class UpdateNodeStatus extends PveNodeOverviewEvent {}