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
+23 -6
View File
@@ -65,7 +65,7 @@ export default function PingServicesManager() {
const res = await api.get('/ui-settings'); const res = await api.get('/ui-settings');
const data = res?.data || {}; const data = res?.data || {};
setRawSettings(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 : []; const list = Array.isArray(data.pingServicesList) ? data.pingServicesList : [];
setItems(list.map((s) => ({ setItems(list.map((s) => ({
id: String(s?.id ?? '').trim() || slugId(s?.name), id: String(s?.id ?? '').trim() || slugId(s?.name),
@@ -91,8 +91,7 @@ export default function PingServicesManager() {
setSaving(true); setSaving(true);
setError(''); setError('');
setSuccess(''); setSuccess('');
try { const payloadToSave = {
const payload = {
...rawSettings, ...rawSettings,
pingServicesList: items.map((s) => ({ pingServicesList: items.map((s) => ({
id: s.id, id: s.id,
@@ -103,13 +102,31 @@ export default function PingServicesManager() {
color: s.color, color: s.color,
})), })),
}; };
const res = await api.post('/ui-settings', { settings: payload, etag }); try {
setRawSettings(payload); let currentEtag = etag;
setEtag(String(res?.data?.etag || etag)); let res = await api.post('/ui-settings', { settings: payloadToSave, etag: currentEtag });
setRawSettings(payloadToSave);
setEtag(String(res?.data?.etag || currentEtag));
setSuccess('Список сервисов сохранён'); setSuccess('Список сервисов сохранён');
setTimeout(() => setSuccess(''), 3000); setTimeout(() => setSuccess(''), 3000);
} catch (e) { } catch (e) {
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 || 'Не удалось сохранить'); setError(e?.response?.data?.message || 'Не удалось сохранить');
}
} finally { } finally {
setSaving(false); setSaving(false);
} }