From 246e1a272b57ba2feaaf01bbc0748937d3e2d3e1 Mon Sep 17 00:00:00 2001 From: Daniel Arantes Loverde Date: Fri, 17 Apr 2026 14:44:27 -0300 Subject: [PATCH] refactor(android): centralize clipboard handling --- .../PediFoods/Support/PlatformCompat.swift | 29 +++++++++++++++++++ .../PediFoods/Views/Auth/OtpView.swift | 15 ++-------- .../PediFoods/Views/Main/CheckoutView.swift | 7 +---- skip_for_android_plan.md | 4 +++ 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/pedi-foods/Sources/PediFoods/Support/PlatformCompat.swift b/pedi-foods/Sources/PediFoods/Support/PlatformCompat.swift index 092b0b3..996b658 100644 --- a/pedi-foods/Sources/PediFoods/Support/PlatformCompat.swift +++ b/pedi-foods/Sources/PediFoods/Support/PlatformCompat.swift @@ -11,6 +11,10 @@ import CoreGraphics import UIKit #endif +#if canImport(AppKit) +import AppKit +#endif + #if !canImport(UIKit) struct UIDevice { static let topNotch = 0.0 @@ -32,6 +36,31 @@ func printError(title: String, msg: String) { } #endif +func appReadClipboardText() -> String? { +#if canImport(UIKit) + return UIPasteboard.general.string +#elseif canImport(AppKit) + return NSPasteboard.general.string(forType: .string) +#elseif os(Android) + return UIPasteboard.general.string +#else + return nil +#endif +} + +func appWriteClipboardText(_ value: String) { +#if canImport(UIKit) + UIPasteboard.general.string = value +#elseif canImport(AppKit) + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(value, forType: .string) +#elseif os(Android) + UIPasteboard.general.string = value +#else + _ = value +#endif +} + extension View { @ViewBuilder func appInlineNavigationTitle() -> some View { diff --git a/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift b/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift index 25c8e6c..c53498d 100644 --- a/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift @@ -181,31 +181,20 @@ struct OtpView: View { } private func pasteOtpFromClipboard() { -#if canImport(UIKit) - let raw = UIPasteboard.general.string ?? "" + let raw = appReadClipboardText() ?? "" let digits = raw.filter(\.isNumber) let trimmed = String(digits.prefix(8)) if trimmed.isEmpty == false { otp = trimmed } -#elseif canImport(AppKit) - let raw = NSPasteboard.general.string(forType: .string) ?? "" - let digits = raw.filter(\.isNumber) - let trimmed = String(digits.prefix(8)) - if trimmed.isEmpty == false { - otp = trimmed - } -#endif } private func autoFillOtpFromClipboardIfAvailable() { -#if canImport(UIKit) guard otp.isEmpty else { return } - let raw = UIPasteboard.general.string ?? "" + let raw = appReadClipboardText() ?? "" let digits = raw.filter(\.isNumber) guard digits.count >= 8 else { return } otp = String(digits.prefix(8)) -#endif } private var otpDeliveryMessage: String { diff --git a/pedi-foods/Sources/PediFoods/Views/Main/CheckoutView.swift b/pedi-foods/Sources/PediFoods/Views/Main/CheckoutView.swift index a7ddc49..2399d09 100644 --- a/pedi-foods/Sources/PediFoods/Views/Main/CheckoutView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Main/CheckoutView.swift @@ -692,12 +692,7 @@ struct PaymentPixView: View { } private func copyToClipboard(_ value: String) { -#if canImport(UIKit) - UIPasteboard.general.string = value -#elseif canImport(AppKit) - NSPasteboard.general.clearContents() - NSPasteboard.general.setString(value, forType: .string) -#endif + appWriteClipboardText(value) } private var parsedExpirationDate: Date? { diff --git a/skip_for_android_plan.md b/skip_for_android_plan.md index eae36db..e20e414 100644 --- a/skip_for_android_plan.md +++ b/skip_for_android_plan.md @@ -327,3 +327,7 @@ Legenda: - `UserProfileView+Android` agora mostra preview de avatar quando `profilePicture` está preenchido. - Campo de edição de foto por URL/Base64 adicionado apenas no Android. - `swift build` validado com sucesso após o ajuste. +8. Padronização de clipboard cross-platform concluída para fluxos OTP/PIX. + - Helper de clipboard centralizado em `PlatformCompat`. + - `OtpView` e `CheckoutView` passaram a usar o helper compartilhado. + - `swift build` validado com sucesso após o ajuste.