From 974204bd912ec23c24de3d5b697e521a48d1ab2d Mon Sep 17 00:00:00 2001 From: stopflock Date: Sat, 25 Jul 2026 17:11:39 -0500 Subject: [PATCH] prevent deletes without being logged in --- assets/changelog.json | 3 ++- lib/localizations/de.json | 3 ++- lib/localizations/en.json | 3 ++- lib/localizations/es.json | 3 ++- lib/localizations/fr.json | 3 ++- lib/localizations/it.json | 3 ++- lib/localizations/nl.json | 3 ++- lib/localizations/pl.json | 3 ++- lib/localizations/pt.json | 3 ++- lib/localizations/tr.json | 3 ++- lib/localizations/uk.json | 3 ++- lib/localizations/zh.json | 3 ++- lib/widgets/node_tag_sheet.dart | 25 +++++++++++++++++++++++++ 13 files changed, 49 insertions(+), 12 deletions(-) diff --git a/assets/changelog.json b/assets/changelog.json index 9f62ce7..fbe8a20 100644 --- a/assets/changelog.json +++ b/assets/changelog.json @@ -1,7 +1,8 @@ { "2.10.4": { "content": [ - "• Catch and correct a couple rare map bounds issues" + "• Catch and correct a couple rare map bounds issues", + "• Prevent queueing a deletion without being logged in" ] }, "2.10.3": { diff --git a/lib/localizations/de.json b/lib/localizations/de.json index 580496d..885fea3 100644 --- a/lib/localizations/de.json +++ b/lib/localizations/de.json @@ -102,7 +102,8 @@ "confirmDeleteTitle": "Knoten löschen", "confirmDeleteMessage": "Sind Sie sicher, dass Sie Knoten #{} löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "deleteReasonLabel": "Grund für Löschung (Optional)", - "deleteReasonHint": "z.B. Gerät entfernt, falsche Position, Duplikat..." + "deleteReasonHint": "z.B. Gerät entfernt, falsche Position, Duplikat...", + "mustBeLoggedInToDelete": "Sie müssen mit einem OpenStreetMap-Konto angemeldet sein, um Kartendaten beizutragen." }, "addNode": { "profile": "Profil", diff --git a/lib/localizations/en.json b/lib/localizations/en.json index 423a52c..3ca642f 100644 --- a/lib/localizations/en.json +++ b/lib/localizations/en.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Delete Node", "confirmDeleteMessage": "Are you sure you want to delete node #{}? This action cannot be undone.", "deleteReasonLabel": "Reason for Deletion (Optional)", - "deleteReasonHint": "e.g., device removed, incorrect location, duplicate..." + "deleteReasonHint": "e.g., device removed, incorrect location, duplicate...", + "mustBeLoggedInToDelete": "You must be logged in with an OpenStreetMap account to contribute map data." }, "addNode": { "profile": "Profile", diff --git a/lib/localizations/es.json b/lib/localizations/es.json index eb8e035..d9bbada 100644 --- a/lib/localizations/es.json +++ b/lib/localizations/es.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Eliminar Nodo", "confirmDeleteMessage": "¿Estás seguro de que quieres eliminar el nodo #{}? Esta acción no se puede deshacer.", "deleteReasonLabel": "Razón para Eliminación (Opcional)", - "deleteReasonHint": "ej. dispositivo removido, ubicación incorrecta, duplicado..." + "deleteReasonHint": "ej. dispositivo removido, ubicación incorrecta, duplicado...", + "mustBeLoggedInToDelete": "Debes iniciar sesión con una cuenta de OpenStreetMap para contribuir con datos del mapa." }, "addNode": { "profile": "Perfil", diff --git a/lib/localizations/fr.json b/lib/localizations/fr.json index c68f1f4..336d5c6 100644 --- a/lib/localizations/fr.json +++ b/lib/localizations/fr.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Supprimer le Nœud", "confirmDeleteMessage": "Êtes-vous sûr de vouloir supprimer le nœud #{} ? Cette action ne peut pas être annulée.", "deleteReasonLabel": "Raison de Suppression (Optionnel)", - "deleteReasonHint": "ex. appareil retiré, emplacement incorrect, doublon..." + "deleteReasonHint": "ex. appareil retiré, emplacement incorrect, doublon...", + "mustBeLoggedInToDelete": "Vous devez être connecté avec un compte OpenStreetMap pour contribuer aux données cartographiques." }, "addNode": { "profile": "Profil", diff --git a/lib/localizations/it.json b/lib/localizations/it.json index 51888bf..87f92e0 100644 --- a/lib/localizations/it.json +++ b/lib/localizations/it.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Elimina Nodo", "confirmDeleteMessage": "Sei sicuro di voler eliminare il nodo #{}? Questa azione non può essere annullata.", "deleteReasonLabel": "Motivo per Eliminazione (Opzionale)", - "deleteReasonHint": "es. dispositivo rimosso, posizione errata, duplicato..." + "deleteReasonHint": "es. dispositivo rimosso, posizione errata, duplicato...", + "mustBeLoggedInToDelete": "Devi aver effettuato l'accesso con un account OpenStreetMap per contribuire ai dati della mappa." }, "addNode": { "profile": "Profilo", diff --git a/lib/localizations/nl.json b/lib/localizations/nl.json index 54f88e5..5012e77 100644 --- a/lib/localizations/nl.json +++ b/lib/localizations/nl.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Verwijder Node", "confirmDeleteMessage": "Weet u zeker dat u node #{} wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "deleteReasonLabel": "Reden voor Verwijdering (Optioneel)", - "deleteReasonHint": "bijv. apparaat verwijderd, onjuiste locatie, duplicaat..." + "deleteReasonHint": "bijv. apparaat verwijderd, onjuiste locatie, duplicaat...", + "mustBeLoggedInToDelete": "U moet ingelogd zijn met een OpenStreetMap-account om kaartgegevens bij te dragen." }, "addNode": { "profile": "Profiel", diff --git a/lib/localizations/pl.json b/lib/localizations/pl.json index 1c62056..3f4692a 100644 --- a/lib/localizations/pl.json +++ b/lib/localizations/pl.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Usuń Węzeł", "confirmDeleteMessage": "Czy na pewno chcesz usunąć węzeł #{}? Tej akcji nie można cofnąć.", "deleteReasonLabel": "Powód Usunięcia (Opcjonalny)", - "deleteReasonHint": "np. urządzenie usunięte, nieprawidłowa lokalizacja, duplikat..." + "deleteReasonHint": "np. urządzenie usunięte, nieprawidłowa lokalizacja, duplikat...", + "mustBeLoggedInToDelete": "Musisz być zalogowany na konto OpenStreetMap, aby dodawać dane do mapy." }, "addNode": { "profile": "Profil", diff --git a/lib/localizations/pt.json b/lib/localizations/pt.json index 9f83132..2f09eba 100644 --- a/lib/localizations/pt.json +++ b/lib/localizations/pt.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Excluir Nó", "confirmDeleteMessage": "Tem certeza de que deseja excluir o nó #{}? Esta ação não pode ser desfeita.", "deleteReasonLabel": "Motivo para Exclusão (Opcional)", - "deleteReasonHint": "ex. dispositivo removido, localização incorreta, duplicado..." + "deleteReasonHint": "ex. dispositivo removido, localização incorreta, duplicado...", + "mustBeLoggedInToDelete": "Você precisa estar conectado com uma conta do OpenStreetMap para contribuir com dados do mapa." }, "addNode": { "profile": "Perfil", diff --git a/lib/localizations/tr.json b/lib/localizations/tr.json index 74a1d52..73ef038 100644 --- a/lib/localizations/tr.json +++ b/lib/localizations/tr.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Düğümü Sil", "confirmDeleteMessage": "#{} düğümünü silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "deleteReasonLabel": "Silme Nedeni (İsteğe Bağlı)", - "deleteReasonHint": "örn. cihaz kaldırıldı, yanlış konum, duplikat..." + "deleteReasonHint": "örn. cihaz kaldırıldı, yanlış konum, duplikat...", + "mustBeLoggedInToDelete": "Harita verilerine katkıda bulunmak için bir OpenStreetMap hesabıyla oturum açmış olmanız gerekir." }, "addNode": { "profile": "Profil", diff --git a/lib/localizations/uk.json b/lib/localizations/uk.json index c588cd5..257945b 100644 --- a/lib/localizations/uk.json +++ b/lib/localizations/uk.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "Видалити Вузол", "confirmDeleteMessage": "Ви впевнені, що хочете видалити вузол #{}? Цю дію не можна скасувати.", "deleteReasonLabel": "Причина Видалення (Опціонально)", - "deleteReasonHint": "наприклад пристрій видалено, неправильне розташування, дублікат..." + "deleteReasonHint": "наприклад пристрій видалено, неправильне розташування, дублікат...", + "mustBeLoggedInToDelete": "Ви повинні увійти в обліковий запис OpenStreetMap, щоб надавати дані карти." }, "addNode": { "profile": "Профіль", diff --git a/lib/localizations/zh.json b/lib/localizations/zh.json index d73750d..9266fc7 100644 --- a/lib/localizations/zh.json +++ b/lib/localizations/zh.json @@ -139,7 +139,8 @@ "confirmDeleteTitle": "删除节点", "confirmDeleteMessage": "您确定要删除节点 #{} 吗?此操作无法撤销。", "deleteReasonLabel": "删除原因(可选)", - "deleteReasonHint": "例如:设备已移除、位置错误、重复..." + "deleteReasonHint": "例如:设备已移除、位置错误、重复...", + "mustBeLoggedInToDelete": "您必须使用 OpenStreetMap 账户登录才能贡献地图数据。" }, "addNode": { "profile": "配置文件", diff --git a/lib/widgets/node_tag_sheet.dart b/lib/widgets/node_tag_sheet.dart index 1af4814..a16a536 100644 --- a/lib/widgets/node_tag_sheet.dart +++ b/lib/widgets/node_tag_sheet.dart @@ -65,6 +65,31 @@ class NodeTagSheet extends StatelessWidget { } void deleteNode() async { + if (!appState.isLoggedIn) { + final shouldLogIn = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: Text(locService.t('node.confirmDeleteTitle')), + content: Text(locService.t('node.mustBeLoggedInToDelete')), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text(locService.cancel), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: Text(locService.t('actions.logIn')), + ), + ], + ), + ); + + if ((shouldLogIn ?? false) && context.mounted) { + Navigator.pushNamed(context, '/settings/osm-account'); + } + return; + } + final result = await showDialog<({bool confirmed, String comment})>( context: context, builder: (BuildContext context) => _DeleteNodeDialog(