|
|
@@ -30,6 +30,8 @@
|
|
|
// Confirmação de delete
|
|
|
let showDeleteConfirm = false;
|
|
|
let rowToDelete = null;
|
|
|
+ let deleteLoading = false;
|
|
|
+ let deleteError = '';
|
|
|
|
|
|
let selectedUser = null;
|
|
|
let showDetails = false;
|
|
|
@@ -177,6 +179,8 @@
|
|
|
const { row } = e?.detail || {};
|
|
|
if (!row) return;
|
|
|
rowToDelete = row;
|
|
|
+ deleteError = '';
|
|
|
+ deleteLoading = false;
|
|
|
showDeleteConfirm = true;
|
|
|
}
|
|
|
|
|
|
@@ -229,31 +233,43 @@
|
|
|
}
|
|
|
|
|
|
async function confirmDelete() {
|
|
|
- if (!rowToDelete) { showDeleteConfirm = false; return; }
|
|
|
- const userId =
|
|
|
- rowToDelete?.__raw?.user_id ??
|
|
|
- rowToDelete?.__raw?.userId ??
|
|
|
- rowToDelete?.__raw?.id ??
|
|
|
- rowToDelete?.user_id ??
|
|
|
- rowToDelete?.userId ??
|
|
|
- rowToDelete?.id;
|
|
|
- if (userId == null) {
|
|
|
- console.error('ID do usuário não encontrado para exclusão.');
|
|
|
+ if (deleteLoading) return;
|
|
|
+ if (!rowToDelete) {
|
|
|
showDeleteConfirm = false;
|
|
|
- rowToDelete = null;
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ deleteError = '';
|
|
|
+ const userIdRaw = getUserIdFromRow(rowToDelete);
|
|
|
+ const userId = Number(userIdRaw);
|
|
|
+
|
|
|
+ if (!Number.isInteger(userId) || userId <= 0) {
|
|
|
+ deleteError = 'user_id inválido para exclusão.';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!$authToken) {
|
|
|
+ deleteError = 'Token de autenticação não encontrado.';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ deleteLoading = true;
|
|
|
+ let deleted = false;
|
|
|
+
|
|
|
try {
|
|
|
const res = await fetch(`${apiUrl}/user/delete`, {
|
|
|
method: 'POST',
|
|
|
headers: {
|
|
|
'content-type': 'application/json',
|
|
|
- ...( $authToken ? { Authorization: `Bearer ${$authToken}` } : {} )
|
|
|
+ Authorization: `Bearer ${$authToken}`
|
|
|
},
|
|
|
body: JSON.stringify({ user_id: userId })
|
|
|
});
|
|
|
+
|
|
|
+ if (res.status === 204) {
|
|
|
+ throw new Error('Usuário não encontrado.');
|
|
|
+ }
|
|
|
+
|
|
|
const raw = await res.text();
|
|
|
- //console.log('delete user raw body:', raw);
|
|
|
let body = null;
|
|
|
if (raw) {
|
|
|
try {
|
|
|
@@ -263,23 +279,34 @@
|
|
|
throw new Error('Resposta inválida do servidor.');
|
|
|
}
|
|
|
}
|
|
|
- const isSuccess = body?.status === 'success' || body?.status === 'ok' || body?.code === 'S_DELETED';
|
|
|
- if (!res.ok || !isSuccess) {
|
|
|
- throw new Error(body?.message ?? body?.msg ?? 'Falha ao excluir usuário.');
|
|
|
+
|
|
|
+ const isSuccess =
|
|
|
+ res.ok && body?.status === 'ok' && body?.code === 'S_OK' && body?.data?.deleted === true;
|
|
|
+
|
|
|
+ if (!isSuccess) {
|
|
|
+ throw new Error(body?.msg ?? body?.message ?? `Falha ao excluir usuário (HTTP ${res.status}).`);
|
|
|
}
|
|
|
- successMessage = body?.message ?? body?.msg ?? 'Usuário excluído com sucesso!';
|
|
|
+
|
|
|
+ deleted = true;
|
|
|
+ successMessage = body?.msg ?? body?.message ?? 'Usuário excluído com sucesso!';
|
|
|
await loadUsers();
|
|
|
} catch (e) {
|
|
|
console.error('Erro ao excluir usuário:', e);
|
|
|
+ deleteError = e?.message ?? 'Falha ao excluir usuário.';
|
|
|
} finally {
|
|
|
- showDeleteConfirm = false;
|
|
|
- rowToDelete = null;
|
|
|
+ deleteLoading = false;
|
|
|
+ if (deleted) {
|
|
|
+ showDeleteConfirm = false;
|
|
|
+ rowToDelete = null;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function cancelDelete() {
|
|
|
showDeleteConfirm = false;
|
|
|
rowToDelete = null;
|
|
|
+ deleteError = '';
|
|
|
+ deleteLoading = false;
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
@@ -310,12 +337,17 @@
|
|
|
<ConfirmModal
|
|
|
visible={showDeleteConfirm}
|
|
|
title="Confirmar exclusão"
|
|
|
- confirmText="Excluir"
|
|
|
+ confirmText={deleteLoading ? 'Excluindo...' : 'Excluir'}
|
|
|
cancelText="Cancelar"
|
|
|
+ disableBackdropClose={deleteLoading}
|
|
|
+ confirmDisabled={deleteLoading}
|
|
|
on:confirm={confirmDelete}
|
|
|
on:cancel={cancelDelete}
|
|
|
>
|
|
|
<p>Tem certeza que deseja excluir o usuário "{rowToDelete?.name}"?</p>
|
|
|
+ {#if deleteError}
|
|
|
+ <p class="mt-3 text-sm text-red-600 dark:text-red-400">{deleteError}</p>
|
|
|
+ {/if}
|
|
|
</ConfirmModal>
|
|
|
|
|
|
{#if showDetails}
|