diff --git a/frontend/src/PingServicesManager.jsx b/frontend/src/PingServicesManager.jsx index 9285d0a..10961cd 100644 --- a/frontend/src/PingServicesManager.jsx +++ b/frontend/src/PingServicesManager.jsx @@ -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); }