From 82f40d780fd6828850996c3c1bae3fe2c729fad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20B=C3=B6ttger?= Date: Sun, 15 Mar 2026 15:57:56 +0100 Subject: [PATCH] PIN check for pairing --- QuickDrop/Localizable.xcstrings | 542 +++++++++++++++++++++++-- QuickDrop/ViewModel/ReceiveModel.swift | 20 +- 2 files changed, 512 insertions(+), 50 deletions(-) diff --git a/QuickDrop/Localizable.xcstrings b/QuickDrop/Localizable.xcstrings index 334c942..1f1b53a 100644 --- a/QuickDrop/Localizable.xcstrings +++ b/QuickDrop/Localizable.xcstrings @@ -234,6 +234,472 @@ } } }, + "No" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ne" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nej" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nein" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Όχι" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ei" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "नहीं" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ne" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidak" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "いいえ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아니요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidak" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nei" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nee" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нет" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nej" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ไม่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hayır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ні" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "否" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "否" + } + } + } + }, + "Yes" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نعم" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sí" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ano" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ja" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ja" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ναι" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yes" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sí" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sí" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kyllä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oui" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oui" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כן" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "हाँ" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Da" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Igen" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ya" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sì" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "はい" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "예" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ya" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ja" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ja" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tak" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sim" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sim" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Da" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Да" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ja" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ใช่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Так" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Có" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "是" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "是" + } + } + } + }, "AcceptOnce" : { "extractionState" : "manual", "localizations" : { @@ -22595,229 +23061,229 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "أدخل %@ على هاتفك." + "value" : "اضغط على قبول إذا تطابق رمز PIN." } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Introdueix %@ al teu telèfon." + "value" : "Fes clic a Accepta si el PIN coincideix." } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Zadej %@ do telefonu." + "value" : "Klikněte na Přijmout, pokud se PIN shoduje." } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast %@ på din telefon." + "value" : "Klik på Acceptér, hvis PIN-koden matcher." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Gib %@ auf deinem Handy ein." + "value" : "Klicke auf Annehmen, wenn die PIN übereinstimmt." } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Εισαγάγετε %@ στο τηλέφωνό σας." + "value" : "Πατήστε Αποδοχή αν το PIN ταιριάζει." } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Enter %@ on your phone." + "value" : "Click Accept if the PIN matches." } }, "en-AU" : { "stringUnit" : { "state" : "translated", - "value" : "Enter %@ on your phone." + "value" : "Click Accept if the PIN matches." } }, "en-CA" : { "stringUnit" : { "state" : "translated", - "value" : "Enter %@ on your phone." + "value" : "Click Accept if the PIN matches." } }, "en-GB" : { "stringUnit" : { "state" : "translated", - "value" : "Enter %@ on your phone." + "value" : "Click Accept if the PIN matches." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Introduce %@ en tu teléfono." + "value" : "Haz clic en Aceptar si el PIN coincide." } }, "es-419" : { "stringUnit" : { "state" : "translated", - "value" : "Ingresa %@ en tu teléfono." + "value" : "Toca Aceptar si el PIN coincide." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Syötä %@ puhelimeesi." + "value" : "Klikkaa Hyväksy, jos PIN täsmää." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez %@ sur votre téléphone." + "value" : "Cliquez sur Accepter si le PIN correspond." } }, "fr-CA" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez %@ sur votre téléphone." + "value" : "Cliquez sur Accepter si le PIN correspond." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הזן %@ בטלפון שלך." + "value" : "לחץ על קבל אם ה-PIN תואם." } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "अपने फ़ोन में %@ दर्ज करें।" + "value" : "यदि PIN मेल खाता है तो स्वीकार करें पर क्लिक करें।" } }, "hr" : { "stringUnit" : { "state" : "translated", - "value" : "Unesi %@ na telefon." + "value" : "Kliknite Prihvati ako se PIN podudara." } }, "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Add meg %@-et a telefonodon." + "value" : "Kattintson az Elfogadás gombra, ha a PIN egyezik." } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "Masukkan %@ di ponsel Anda." + "value" : "Klik Terima jika PIN cocok." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserisci %@ sul telefono." + "value" : "Fai clic su Accetta se il PIN corrisponde." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "電話に%@を入力してください。" + "value" : "PINが一致する場合は「許可」をクリックしてください。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "휴대전화에 %@ 입력." + "value" : "PIN이 일치하면 허용을 클릭하세요." } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "Masukkan %@ pada telefon anda." + "value" : "Klik Terima jika PIN sepadan." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Skriv inn %@ på telefonen." + "value" : "Klikk Godta hvis PIN-koden stemmer." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voer %@ in op je telefoon." + "value" : "Klik op Accepteren als de PIN overeenkomt." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wpisz %@ na telefonie." + "value" : "Kliknij Akceptuj, jeśli PIN się zgadza." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Digite %@ no seu telefone." + "value" : "Clique em Aceitar se o PIN corresponder." } }, "pt-PT" : { "stringUnit" : { "state" : "translated", - "value" : "Introduz %@ no teu telemóvel." + "value" : "Clique em Aceitar se o PIN corresponder." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți %@ pe telefon." + "value" : "Faceți clic pe Acceptă dacă PIN-ul se potrivește." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введите %@ на телефоне." + "value" : "Нажмите «Принять», если PIN совпадает." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Skriv in %@ på din telefon." + "value" : "Klicka på Acceptera om PIN-koden stämmer." } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "กรอก %@ บนโทรศัพท์ของคุณ" + "value" : "แตะ ยอมรับ หาก PIN ตรงกัน" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Telefona %@ girin." + "value" : "PIN eşleşiyorsa Kabul'e tıklayın." } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Введіть %@ на телефоні." + "value" : "Натисніть «Прийняти», якщо PIN збігається." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nhập %@ trên điện thoại." + "value" : "Nhấn Chấp nhận nếu PIN khớp." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在手机上输入%@。" + "value" : "如果 PIN 匹配,请点击接受。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "在手機上輸入%@。" + "value" : "如果 PIN 符合,請點選接受。" } } } diff --git a/QuickDrop/ViewModel/ReceiveModel.swift b/QuickDrop/ViewModel/ReceiveModel.swift index 57188a5..ba8f70e 100644 --- a/QuickDrop/ViewModel/ReceiveModel.swift +++ b/QuickDrop/ViewModel/ReceiveModel.swift @@ -94,25 +94,21 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { self.activeDeviceName = resolvedSenderName let pinCode = transfer.pinCode ?? "----" + let pinHeader = "PinCode".localized(with: pinCode) + let compareMessage = "NotificationSyncToastPinSubtitle".localized() self.consentState = ConsentToastState( transferID: transferID, - pinCodeMessage: resolvedSenderName, - message: "NotificationSyncToastEnableSubtitle".localized(), + pinCodeMessage: pinHeader, + message: compareMessage, notificationSyncStage: .consent, allowsTrust: false, acceptAction: { [weak self] _ in guard let self else { return } + withAnimation { + self.consentState = nil + } primaryButtonAction(false) - self.consentState = ConsentToastState( - transferID: transferID, - pinCodeMessage: resolvedSenderName, - message: "NotificationSyncToastPinSubtitle".localized(with: pinCode), - notificationSyncStage: .pin, - allowsTrust: false, - acceptAction: { _ in }, - declineAction: {} - ) - self.showQuickDropToast(for: transferID) + self.hideQuickDropToast(style: .fade) }, declineAction: { [weak self] in guard let self else { return }