From fd6978cc90e70ccb0c87b9a97ff386b0875faa9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20B=C3=B6ttger?= Date: Tue, 9 Sep 2025 13:58:36 +0200 Subject: [PATCH] Add alert when selecting invalid folder for storing files --- .../xcshareddata/swiftpm/Package.resolved | 2 +- QuickDrop/Localizable.xcstrings | 466 ++++++++++++++++++ QuickDrop/Util/SendToExtension.swift | 16 +- QuickDrop/View/SettingsView.swift | 18 + 4 files changed, 495 insertions(+), 7 deletions(-) diff --git a/QuickDrop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/QuickDrop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 5b6d793..9cc001d 100644 --- a/QuickDrop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/QuickDrop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -43,7 +43,7 @@ "location" : "https://github.com/leonboe1/LUI.git", "state" : { "branch" : "main", - "revision" : "5b2fe7161069c2314c5be17810ec7471b9decc8a" + "revision" : "23696658386572725bc8a8e38ad3675829185921" } }, { diff --git a/QuickDrop/Localizable.xcstrings b/QuickDrop/Localizable.xcstrings index 9c874b6..d052a13 100644 --- a/QuickDrop/Localizable.xcstrings +++ b/QuickDrop/Localizable.xcstrings @@ -10481,6 +10481,472 @@ } } }, + "FolderSelectionFailedMessage" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا يمكن استخدام هذا المجلد لتخزين الملفات الواردة. يرجى استخدام مجلد مختلف." + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aquesta carpeta no es pot utilitzar per emmagatzemar fitxers entrants. Si us plau, utilitzeu una carpeta diferent." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tuto složku nelze použít k ukládání příchozích souborů. Použijte prosím jinou složku." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denne mappe kan ikke bruges til at gemme indkommende filer. Brug venligst en anden mappe." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieser Ordner kann nicht zum Speichern eingehender Dateien verwendet werden. Bitte benutze einen anderen Ordner." + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αυτός ο φάκελος δεν μπορεί να χρησιμοποιηθεί για την αποθήκευση εισερχόμενων αρχείων. Παρακαλώ χρησιμοποιήστε έναν διαφορετικό φάκελο." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This folder cannot be used for storing incoming files. Please use a different folder." + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "This folder can't be used for storing incoming files. Please pick a different folder." + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "This folder can't be used for storing incoming files. Please choose another folder." + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "This folder cannot be used for storing incoming files. Please choose a different folder." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esta carpeta no se puede usar para almacenar archivos entrantes. Por favor, utiliza una carpeta diferente." + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esta carpeta no se puede usar para almacenar archivos entrantes. Por favor, usa una carpeta diferente." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tätä kansiota ei voi käyttää saapuvien tiedostojen tallentamiseen. Käytä toista kansiota." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ce dossier ne peut pas être utilisé pour stocker les fichiers entrants. Veuillez utiliser un autre dossier." + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ce dossier ne peut pas être utilisé pour stocker les fichiers entrants. Veuillez utiliser un autre dossier." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן להשתמש בתיקייה זו לאחסון קבצים נכנסים. אנא השתמשו בתיקייה אחרת." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "इस फ़ोल्डर का उपयोग आने वाली फ़ाइलों को संग्रहीत करने के लिए नहीं किया जा सकता। कृपया किसी अन्य फ़ोल्डर का उपयोग करें।" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ova mapa ne može se koristiti za pohranu dolaznih datoteka. Molimo koristite drugu mapu." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ez a mappa nem használható beérkező fájlok tárolására. Kérjük, használjon másik mappát." + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder ini tidak dapat digunakan untuk menyimpan file masuk. Silakan gunakan folder lain." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Questa cartella non può essere utilizzata per archiviare file in arrivo. Per favore, usa una cartella diversa." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このフォルダは受信ファイルの保存に使用できません。別のフォルダを使用してください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 폴더는 들어오는 파일을 저장하는 데 사용할 수 없습니다. 다른 폴더를 사용하세요." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder ini tidak boleh digunakan untuk menyimpan fail yang diterima. Sila gunakan folder lain." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denne mappen kan ikke brukes til lagring av innkommende filer. Vennligst bruk en annen mappe." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deze map kan niet worden gebruikt voor het opslaan van binnenkomende bestanden. Gebruik een andere map." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ten folder nie może być używany do przechowywania otrzymywanych plików. Proszę użyć innego folderu." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esta pasta não pode ser usada para armazenar arquivos recebidos. Por favor, use uma pasta diferente." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esta pasta não pode ser usada para armazenar ficheiros recebidos. Por favor, utilize uma pasta diferente." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acest folder nu poate fi utilizat pentru stocarea fișierelor primite. Vă rugăm să folosiți un alt folder." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Эту папку нельзя использовать для хранения входящих файлов. Пожалуйста, выберите другую папку." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Den här mappen kan inte användas för att lagra inkommande filer. Använd en annan mapp." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ไม่สามารถใช้โฟลเดอร์นี้ในการจัดเก็บไฟล์ที่เข้ามาได้ กรุณาใช้โฟลเดอร์อื่น" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu klasör gelen dosyaların depolanması için kullanılamaz. Lütfen başka bir klasör kullanın." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Цю папку не можна використовувати для збереження вхідних файлів. Будь ласка, використовуйте іншу папку." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thư mục này không thể được sử dụng để lưu trữ tập tin nhận. Vui lòng sử dụng một thư mục khác." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此文件夹无法用于存储接收的文件。请使用其他文件夹。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "此文件夾無法用於存儲接收的檔案。請使用其他文件夾。" + } + } + } + }, + "FolderSelectionFailedTitle" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المجلد غير مدعوم" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carpeta no compatible" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Složka není podporována" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappen understøttes ikke" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordner wird nicht unterstützt" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Μη υποστηριζόμενος φάκελος" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder Unsupported" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder Not Supported" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unsupported Folder" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder Not Supported" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carpeta no compatible" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carpeta no compatible" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kansio ei tuettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dossier non pris en charge" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dossier non pris en charge" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תיקייה לא נתמכת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "फ़ोल्डर असमर्थित" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mapa nije podržana" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappa nem támogatott" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder Tidak Didukung" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cartella non supportata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "フォルダがサポートされていません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "폴더 지원되지 않음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder Tidak Disokong" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappe ikke støttet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Map niet ondersteund" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder nieobsługiwany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pasta não suportada" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pasta não suportada" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folder nesuportat" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Папка не поддерживается" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mapp stöds inte" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "โฟลเดอร์ไม่รองรับ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasör Desteklenmiyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Папка не підтримується" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thư mục không được hỗ trợ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件夹不支持" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件夾不支援" + } + } + } + }, "GetSupport" : { "extractionState" : "manual", "localizations" : { diff --git a/QuickDrop/Util/SendToExtension.swift b/QuickDrop/Util/SendToExtension.swift index 80c6014..ce4a921 100644 --- a/QuickDrop/Util/SendToExtension.swift +++ b/QuickDrop/Util/SendToExtension.swift @@ -13,11 +13,15 @@ func sendToSharingService(items: [Any]) { sharingService.perform(withItems: items) } else { - // show alert - let alert = NSAlert() - alert.alertStyle = .critical - alert.messageText = "ShareExtensionDisabledTitle".localized() - alert.informativeText = "ShareExtensionDisabledDescription".localized() - alert.runModal() + DispatchQueue.main.async { + // show alert + AudioManager.playErrorSound() + let alert = NSAlert() + alert.alertStyle = .critical + alert.messageText = "ShareExtensionDisabledTitle".localized() + alert.informativeText = "ShareExtensionDisabledDescription".localized() + alert.addButton(withTitle: "CloseAlert".localized()) + alert.runModal() + } } } diff --git a/QuickDrop/View/SettingsView.swift b/QuickDrop/View/SettingsView.swift index f69c556..6500413 100644 --- a/QuickDrop/View/SettingsView.swift +++ b/QuickDrop/View/SettingsView.swift @@ -94,11 +94,29 @@ struct SettingsView: View { do { log("Selected folder: \(url)") + if url.description == "file:///" { + throw NSError(domain: "InvalidSelection", code: 0, userInfo: [NSLocalizedDescriptionKey: "Cannot select root directory. Please choose a specific folder."]) + } + let bookmarkData = try url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil) Settings.shared.saveFolderBookmark = bookmarkData } catch { log("Failed to save security-scoped bookmark: \(error)") + + DispatchQueue.main.asyncAfter(deadline: .now()) { + + AudioManager.playErrorSound() + + // show alert + let alert = NSAlert() + alert.alertStyle = .critical + alert.messageText = "FolderSelectionFailedTitle".localized() + alert.informativeText = "FolderSelectionFailedMessage".localized() + alert.addButton(withTitle: "CloseAlert".localized()) + + alert.runModal() + } } } }