From 16557830aea7140ff63cf425626d6f20ab779612 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Thu, 2 Apr 2026 11:24:11 +0200 Subject: [PATCH] fix: mailbox deletion error handling --- components/settings/folder-settings.tsx | 14 ++++++++++++-- lib/jmap/client.ts | 5 ++++- locales/de/common.json | 2 ++ locales/en/common.json | 2 ++ locales/es/common.json | 2 ++ locales/fr/common.json | 2 ++ locales/it/common.json | 2 ++ locales/ja/common.json | 2 ++ locales/nl/common.json | 2 ++ locales/pt/common.json | 2 ++ locales/ru/common.json | 2 ++ 11 files changed, 34 insertions(+), 3 deletions(-) diff --git a/components/settings/folder-settings.tsx b/components/settings/folder-settings.tsx index dcb1ccbc..afc7878d 100644 --- a/components/settings/folder-settings.tsx +++ b/components/settings/folder-settings.tsx @@ -200,8 +200,18 @@ export function FolderSettings() { await deleteMailbox(client, mailboxId); setDeletingId(null); toast.success(t('folder_deleted')); - } catch { - toast.error(t('error_delete')); + } catch (err: unknown) { + const jmapType = (err as Error & { jmapType?: string })?.jmapType; + switch (jmapType) { + case 'mailboxHasChild': + toast.error(t('error_delete_has_children')); + break; + case 'mailboxHasEmail': + toast.error(t('error_delete_has_email')); + break; + default: + toast.error(t('error_delete')); + } } finally { setIsLoading(false); } diff --git a/lib/jmap/client.ts b/lib/jmap/client.ts index 3fde1a3a..dbc99053 100644 --- a/lib/jmap/client.ts +++ b/lib/jmap/client.ts @@ -1320,7 +1320,10 @@ export class JMAPClient implements IJMAPClient { const result = response.methodResponses?.[0]?.[1]; if (result?.notDestroyed?.[mailboxId]) { - throw new Error(`Failed to delete mailbox: ${result.notDestroyed[mailboxId].type || 'unknown error'}`); + const err = result.notDestroyed[mailboxId]; + const error = new Error(err.description || `Failed to delete mailbox: ${err.type || 'unknown error'}`); + (error as Error & { jmapType?: string }).jmapType = err.type; + throw error; } } diff --git a/locales/de/common.json b/locales/de/common.json index 0a9efb50..ed35b646 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -1155,6 +1155,8 @@ "error_create": "Ordner konnte nicht erstellt werden", "error_rename": "Ordner konnte nicht umbenannt werden", "error_delete": "Ordner konnte nicht gelöscht werden", + "error_delete_has_children": "Ordner kann nicht gelöscht werden: Er enthält noch Unterordner. Löschen oder verschieben Sie diese zuerst.", + "error_delete_has_email": "Ordner kann nicht gelöscht werden: Er enthält noch E-Mails. Verschieben oder löschen Sie diese zuerst.", "error_role": "Ordnerrolle konnte nicht aktualisiert werden" }, "advanced": { diff --git a/locales/en/common.json b/locales/en/common.json index 82403163..1a731fb2 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -1155,6 +1155,8 @@ "error_create": "Failed to create folder", "error_rename": "Failed to rename folder", "error_delete": "Failed to delete folder", + "error_delete_has_children": "Cannot delete folder: it still contains subfolders. Delete or move them first.", + "error_delete_has_email": "Cannot delete folder: it still contains emails. Move or delete them first.", "error_role": "Failed to update folder role" }, "advanced": { diff --git a/locales/es/common.json b/locales/es/common.json index 69bf8b84..d1bc26b3 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -1155,6 +1155,8 @@ "error_create": "Error al crear la carpeta", "error_rename": "Error al renombrar la carpeta", "error_delete": "Error al eliminar la carpeta", + "error_delete_has_children": "No se puede eliminar la carpeta: aún contiene subcarpetas. Elimínelas o muévalas primero.", + "error_delete_has_email": "No se puede eliminar la carpeta: aún contiene correos. Muévalos o elimínelos primero.", "error_role": "Error al actualizar el rol de la carpeta" }, "advanced": { diff --git a/locales/fr/common.json b/locales/fr/common.json index ff09ceb8..f03c2440 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -1155,6 +1155,8 @@ "error_create": "Échec de la création du dossier", "error_rename": "Échec du renommage du dossier", "error_delete": "Échec de la suppression du dossier", + "error_delete_has_children": "Impossible de supprimer le dossier : il contient encore des sous-dossiers. Supprimez-les ou déplacez-les d'abord.", + "error_delete_has_email": "Impossible de supprimer le dossier : il contient encore des e-mails. Déplacez-les ou supprimez-les d'abord.", "error_role": "Échec de la mise à jour du rôle du dossier" }, "advanced": { diff --git a/locales/it/common.json b/locales/it/common.json index 7be71f2f..7b64bf7c 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -1155,6 +1155,8 @@ "error_create": "Impossibile creare la cartella", "error_rename": "Impossibile rinominare la cartella", "error_delete": "Impossibile eliminare la cartella", + "error_delete_has_children": "Impossibile eliminare la cartella: contiene ancora sottocartelle. Eliminale o spostale prima.", + "error_delete_has_email": "Impossibile eliminare la cartella: contiene ancora email. Spostale o eliminale prima.", "error_role": "Impossibile aggiornare il ruolo della cartella" }, "advanced": { diff --git a/locales/ja/common.json b/locales/ja/common.json index 2d2c2f7d..9f5a485f 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -1155,6 +1155,8 @@ "error_create": "フォルダーの作成に失敗しました", "error_rename": "フォルダー名の変更に失敗しました", "error_delete": "フォルダーの削除に失敗しました", + "error_delete_has_children": "フォルダーを削除できません:サブフォルダーが含まれています。先にサブフォルダーを削除または移動してください。", + "error_delete_has_email": "フォルダーを削除できません:メールが含まれています。先にメールを移動または削除してください。", "error_role": "フォルダーの役割の更新に失敗しました" }, "advanced": { diff --git a/locales/nl/common.json b/locales/nl/common.json index 3cff5f61..f77217f9 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -1155,6 +1155,8 @@ "error_create": "Map maken mislukt", "error_rename": "Map hernoemen mislukt", "error_delete": "Map verwijderen mislukt", + "error_delete_has_children": "Map kan niet worden verwijderd: deze bevat nog submappen. Verwijder of verplaats deze eerst.", + "error_delete_has_email": "Map kan niet worden verwijderd: deze bevat nog e-mails. Verplaats of verwijder deze eerst.", "error_role": "Maprol bijwerken mislukt" }, "advanced": { diff --git a/locales/pt/common.json b/locales/pt/common.json index a03611f9..98c3508b 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -1155,6 +1155,8 @@ "error_create": "Falha ao criar a pasta", "error_rename": "Falha ao renomear a pasta", "error_delete": "Falha ao excluir a pasta", + "error_delete_has_children": "Não é possível excluir a pasta: ela ainda contém subpastas. Exclua ou mova-as primeiro.", + "error_delete_has_email": "Não é possível excluir a pasta: ela ainda contém e-mails. Mova ou exclua-os primeiro.", "error_role": "Falha ao atualizar a função da pasta" }, "advanced": { diff --git a/locales/ru/common.json b/locales/ru/common.json index 60a03bad..af54cf81 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -1155,6 +1155,8 @@ "error_create": "Не удалось создать папку", "error_rename": "Не удалось переименовать папку", "error_delete": "Не удалось удалить папку", + "error_delete_has_children": "Невозможно удалить папку: она содержит подпапки. Сначала удалите или переместите их.", + "error_delete_has_email": "Невозможно удалить папку: она содержит письма. Сначала переместите или удалите их.", "error_role": "Не удалось обновить роль папки" }, "advanced": {