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" ;
34import {formatISODate } from " ../../utils/formatting" ;
45import {CollectorConfig , BenchmarkJobStatus } from " ./data" ;
56
@@ -40,6 +41,37 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
4041 return " Unknown" ;
4142 }
4243}
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+ }
4375 </script >
4476
4577<template >
@@ -54,12 +86,7 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
5486 class =" collector-sm-padding-left-right collector-left-divider"
5587 >{{ collector.target }}</span
5688 >
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" />
6390 </span >
6491 </div >
6592 </div >
0 commit comments