blob: 3f91eacb4ab5fc18aea60e95b6e42b7613c93983 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import cx from 'clsx';
import * as React from 'react';
import s0 from './ProxyLatency.module.scss';
type ProxyLatencyProps = {
number?: number;
color: string;
isTesting?: boolean;
error?: string;
onClick?: () => void;
};
export function ProxyLatency({ number, color, isTesting, error, onClick }: ProxyLatencyProps) {
const hasNumber = typeof number === 'number';
const label = isTesting ? 'Testing...' : hasNumber ? `${number} ms` : error || '--';
const className = cx(s0.proxyLatency, {
[s0.clickable]: Boolean(onClick),
[s0.placeholder]: !hasNumber || Boolean(error),
[s0.testing]: isTesting,
});
const handleClick = React.useCallback(
(e: React.MouseEvent) => {
if (!onClick || isTesting) return;
e.preventDefault();
e.stopPropagation();
onClick();
},
[isTesting, onClick]
);
const handleKeyDown = React.useCallback(
(e: React.KeyboardEvent) => {
if (!onClick || isTesting) return;
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
e.stopPropagation();
onClick();
}
},
[isTesting, onClick]
);
return (
<span
className={className}
style={{ color: hasNumber ? color : undefined }}
role={onClick ? 'button' : undefined}
tabIndex={onClick ? 0 : undefined}
onClick={handleClick}
onKeyDown={handleKeyDown}
title={label}
>
<span>{label}</span>
</span>
);
}
|