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
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m59s
This commit is contained in:
@@ -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,25 +91,42 @@ export default function PingServicesManager() {
|
|||||||
setSaving(true);
|
setSaving(true);
|
||||||
setError('');
|
setError('');
|
||||||
setSuccess('');
|
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 {
|
try {
|
||||||
const payload = {
|
let currentEtag = etag;
|
||||||
...rawSettings,
|
let res = await api.post('/ui-settings', { settings: payloadToSave, etag: currentEtag });
|
||||||
pingServicesList: items.map((s) => ({
|
setRawSettings(payloadToSave);
|
||||||
id: s.id,
|
setEtag(String(res?.data?.etag || currentEtag));
|
||||||
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));
|
|
||||||
setSuccess('Список сервисов сохранён');
|
setSuccess('Список сервисов сохранён');
|
||||||
setTimeout(() => setSuccess(''), 3000);
|
setTimeout(() => setSuccess(''), 3000);
|
||||||
} catch (e) {
|
} 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 {
|
} finally {
|
||||||
setSaving(false);
|
setSaving(false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user