fix(PingServicesManager): improve error handling during save operation and streamline etag management for UI settings
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m59s

This commit is contained in:
2026-02-17 00:27:58 +07:00
parent 4c05913694
commit 29fcee8ab1
+33 -16
View File
@@ -65,7 +65,7 @@ export default function PingServicesManager() {
const res = await api.get('/ui-settings');
const data = res?.data || {};
setRawSettings(data);
setEtag(String(res?.headers?.etag || res?.headers?.ETag || '').replace(/"/g, ''));
setEtag(String(res?.headers?.etag || res?.headers?.ETag || ''));
const list = Array.isArray(data.pingServicesList) ? data.pingServicesList : [];
setItems(list.map((s) => ({
id: String(s?.id ?? '').trim() || slugId(s?.name),
@@ -91,25 +91,42 @@ export default function PingServicesManager() {
setSaving(true);
setError('');
setSuccess('');
const payloadToSave = {
...rawSettings,
pingServicesList: items.map((s) => ({
id: s.id,
name: s.name,
host: s.host,
port: s.port,
icon: s.icon,
color: s.color,
})),
};
try {
const payload = {
...rawSettings,
pingServicesList: items.map((s) => ({
id: s.id,
name: s.name,
host: s.host,
port: s.port,
icon: s.icon,
color: s.color,
})),
};
const res = await api.post('/ui-settings', { settings: payload, etag });
setRawSettings(payload);
setEtag(String(res?.data?.etag || etag));
let currentEtag = etag;
let res = await api.post('/ui-settings', { settings: payloadToSave, etag: currentEtag });
setRawSettings(payloadToSave);
setEtag(String(res?.data?.etag || currentEtag));
setSuccess('Список сервисов сохранён');
setTimeout(() => setSuccess(''), 3000);
} catch (e) {
setError(e?.response?.data?.message || 'Не удалось сохранить');
if (e?.response?.status === 412) {
try {
const fresh = await api.get('/ui-settings');
const freshData = fresh?.data || {};
const freshEtag = String(fresh?.headers?.etag || fresh?.headers?.ETag || '');
const retryPayload = { ...freshData, pingServicesList: payloadToSave.pingServicesList };
const retryRes = await api.post('/ui-settings', { settings: retryPayload, etag: freshEtag });
setRawSettings(retryPayload);
setEtag(String(retryRes?.data?.etag || freshEtag));
setSuccess('Список сервисов сохранён (настройки были обновлены)');
setTimeout(() => setSuccess(''), 3000);
} catch (retryErr) {
setError(retryErr?.response?.data?.message || 'Настройки изменились. Обновите страницу и сохраните снова.');
}
} else {
setError(e?.response?.data?.message || 'Не удалось сохранить');
}
} finally {
setSaving(false);
}