Improve server picker health state handling and bump Harbor versions
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
export const HARBOR_VERSIONS = Object.freeze({
|
export const HARBOR_VERSIONS = Object.freeze({
|
||||||
macClient: '0.7.19',
|
macClient: '0.7.20',
|
||||||
gatewayClient: '0.7.19',
|
gatewayClient: '0.7.20',
|
||||||
gatewayBackend: '0.7.1',
|
gatewayBackend: '0.7.1',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -36,11 +36,15 @@ function readAuto() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function serverHealthText(ping) {
|
||||||
|
if (ping?.checking) return 'Проверяем TCP…';
|
||||||
|
if (ping?.error) return 'Проверка недоступна';
|
||||||
|
if (ping?.ok) return `TCP ${ping.latency} мс`;
|
||||||
|
return ping ? 'TCP недоступен' : 'Не проверен';
|
||||||
|
}
|
||||||
|
|
||||||
function ServerRow({ server, selected, favorite, ping, disabled, index, onSelect, onFavorite }) {
|
function ServerRow({ server, selected, favorite, ping, disabled, index, onSelect, onFavorite }) {
|
||||||
const health = ping?.checking
|
const health = serverHealthText(ping);
|
||||||
? 'Проверяем TCP…'
|
|
||||||
: ping?.error ? 'Проверка недоступна'
|
|
||||||
: ping?.ok ? `TCP ${ping.latency} мс` : ping ? 'TCP недоступен' : 'Не проверен';
|
|
||||||
|
|
||||||
return <div className={`client-server-row${selected ? ' is-selected' : ''}${onFavorite ? ' has-favorite' : ''}`}>
|
return <div className={`client-server-row${selected ? ' is-selected' : ''}${onFavorite ? ' has-favorite' : ''}`}>
|
||||||
<button
|
<button
|
||||||
@@ -212,6 +216,7 @@ export function ServerPicker({
|
|||||||
key={server.id}
|
key={server.id}
|
||||||
server={server}
|
server={server}
|
||||||
selected={server.id === selectedServerId}
|
selected={server.id === selectedServerId}
|
||||||
|
ping={pings[server.id]}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
index={index}
|
index={index}
|
||||||
onSelect={select}
|
onSelect={select}
|
||||||
@@ -250,7 +255,7 @@ export function ServerPicker({
|
|||||||
key={id}
|
key={id}
|
||||||
onClick={() => setView(id)}
|
onClick={() => setView(id)}
|
||||||
>{label}</button>)}
|
>{label}</button>)}
|
||||||
<button type="button" disabled={checking || !visible.length} onClick={checkVisible}>
|
<button type="button" disabled={checking || (!selectedServerId && !visible.length)} onClick={checkVisible}>
|
||||||
{checking ? 'Проверяем…' : 'Проверить TCP'}
|
{checking ? 'Проверяем…' : 'Проверить TCP'}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -265,7 +270,9 @@ export function ServerPicker({
|
|||||||
onClick={() => select(autoServer(servers)?.id, true)}
|
onClick={() => select(autoServer(servers)?.id, true)}
|
||||||
>
|
>
|
||||||
<strong>Auto</strong>
|
<strong>Auto</strong>
|
||||||
<small>Первый стабильный сервер</small>
|
<small title={pings[selectedServerId]?.checkedAt || undefined}>
|
||||||
|
{autoActive ? serverHealthText(pings[selectedServerId]) : 'Первый стабильный сервер'}
|
||||||
|
</small>
|
||||||
</button>
|
</button>
|
||||||
{selected && !autoActive && <ServerRow
|
{selected && !autoActive && <ServerRow
|
||||||
server={selected}
|
server={selected}
|
||||||
|
|||||||
@@ -48,6 +48,12 @@ test('server picker keeps health manual and the rendered result window bounded',
|
|||||||
assert.match(picker, /aria-expanded={!isCollapsed}/);
|
assert.match(picker, /aria-expanded={!isCollapsed}/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('manual health remains visible for Auto and simple rows', () => {
|
||||||
|
assert.match(picker, /autoActive \? serverHealthText\(pings\[selectedServerId\]\)/);
|
||||||
|
assert.match(picker, /disabled={checking \|\| \(!selectedServerId && !visible\.length\)}/);
|
||||||
|
assert.match(picker, /simpleServers\.map[\s\S]*?ping={pings\[server\.id\]}/);
|
||||||
|
});
|
||||||
|
|
||||||
test('server picker starts simple and reveals advanced controls on demand', () => {
|
test('server picker starts simple and reveals advanced controls on demand', () => {
|
||||||
assert.match(picker, /const \[advanced, setAdvanced\] = useState\(false\)/);
|
assert.match(picker, /const \[advanced, setAdvanced\] = useState\(false\)/);
|
||||||
assert.match(picker, /aria-expanded={advanced}/);
|
assert.match(picker, /aria-expanded={advanced}/);
|
||||||
|
|||||||
Reference in New Issue
Block a user