diff --git a/src/locales/en.json b/src/locales/en.json index dbb137c..f50417f 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -468,6 +468,11 @@ "confirmDeleteAllDevices": "Delete all devices?", "deviceDeleted": "Device deleted", "allDevicesDeleted": "All devices deleted", + "renameDevice": "Rename", + "renameDeviceSave": "Save", + "renameDeviceCancel": "Cancel", + "renameDevicePlaceholder": "Device name", + "deviceRenamed": "Device name updated", "platform": "Platform", "model": "Model", "connectedAt": "Connected", @@ -3176,7 +3181,10 @@ "none": "No connected devices", "resetAll": "Reset all", "deleted": "Device removed", - "allDeleted": "All devices reset" + "allDeleted": "All devices reset", + "rename": "Rename", + "renameSave": "Save", + "renamed": "Device name updated" }, "referral": { "title": "Referral program", diff --git a/src/pages/AdminUserDetail.tsx b/src/pages/AdminUserDetail.tsx index 59d8e33..19fd343 100644 --- a/src/pages/AdminUserDetail.tsx +++ b/src/pages/AdminUserDetail.tsx @@ -774,15 +774,19 @@ export default function AdminUserDetail() { const handleRenameDevice = async (hwid: string) => { if (!userId) return; setRenameSaving(true); + // Snapshot inputs BEFORE the await so a fast click on another device + // mid-flight doesn't smuggle a different alias into this hwid's request. + const snapshotName = editingDeviceName.trim(); try { - const trimmed = editingDeviceName.trim(); - await adminUsersApi.renameUserDevice(userId, hwid, trimmed || null); + await adminUsersApi.renameUserDevice(userId, hwid, snapshotName || null); notify.success(t('admin.users.detail.devices.renamed', 'Имя устройства обновлено')); - setEditingDeviceHwid(null); - setEditingDeviceName(''); + // Reset edit state only if user is still on the saved row. + setEditingDeviceHwid((current) => (current === hwid ? null : current)); await loadDevices(); - } catch { - notify.error(t('admin.users.userActions.error'), t('common.error')); + } catch (err) { + const apiMessage = (err as { response?: { data?: { detail?: string } } })?.response?.data + ?.detail; + notify.error(apiMessage || t('admin.users.userActions.error'), t('common.error')); } finally { setRenameSaving(false); } @@ -2527,7 +2531,7 @@ export default function AdminUserDetail() { ), )} > - \u2713 + {'\u2713'} ) : ( @@ -2559,7 +2563,7 @@ export default function AdminUserDetail() { '\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C', )} > - \u270F\uFE0F + {'\u270F\uFE0F'}