1
- <script setup lang="ts">
2
- import {ref , Ref } from " vue" ;
1
+ <script setup lang="tsx">
2
+ import {h , ref , Ref } from " vue" ;
3
+ import {parseISO , differenceInHours } from " date-fns" ;
3
4
import {formatISODate } from " ../../utils/formatting" ;
4
5
import {CollectorConfig , BenchmarkJobStatus } from " ./data" ;
5
6
@@ -40,6 +41,37 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
40
41
return " Unknown" ;
41
42
}
42
43
}
44
+
45
+ function ActiveStatus({collector }: {collector: CollectorConfig }) {
46
+ const now = new Date ();
47
+ const maxInactivityHours = 1 ;
48
+ const lastHeartBeatAt = parseISO (collector .lastHeartbeatAt );
49
+ const hourDiff = differenceInHours (now , lastHeartBeatAt );
50
+ let statusText = " Active" ;
51
+ let statusClass = " active" ;
52
+
53
+ switch (collector .isActive ) {
54
+ case true :
55
+ if (hourDiff >= maxInactivityHours ) {
56
+ statusText = " Offline" ;
57
+ statusClass = " inactive" ;
58
+ } else {
59
+ statusText = " Active" ;
60
+ statusClass = " active" ;
61
+ }
62
+ break ;
63
+ case false :
64
+ statusText = " Inactive" ;
65
+ statusClass = " inactive" ;
66
+ break ;
67
+ }
68
+
69
+ return (
70
+ <span class = { ` collector-sm-padding-left-right status ${statusClass } ` } >
71
+ { statusText }
72
+ </span >
73
+ );
74
+ }
43
75
</script >
44
76
45
77
<template >
@@ -54,12 +86,7 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
54
86
class =" collector-sm-padding-left-right collector-left-divider"
55
87
>{{ collector.target }}</span
56
88
>
57
- <span
58
- class =" collector-sm-padding-left-right status"
59
- :class =" statusClass(collector)"
60
- >
61
- {{ collector.isActive ? "Active" : "Inactive" }}
62
- </span >
89
+ <ActiveStatus :collector =" collector" />
63
90
</span >
64
91
</div >
65
92
</div >
0 commit comments