From fc35950885c591cf7e77c026f71c39dd2abc300b Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 20 Jun 2023 18:04:31 +0800 Subject: [PATCH] Add PinCodeTextField autocomplete support --- Xcodes/Frontend/SignIn/PinCodeTextView.swift | 17 +++++++++++++---- Xcodes/Frontend/SignIn/SignIn2FAView.swift | 4 +++- Xcodes/Frontend/SignIn/SignInSMSView.swift | 4 +++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Xcodes/Frontend/SignIn/PinCodeTextView.swift b/Xcodes/Frontend/SignIn/PinCodeTextView.swift index 45465f3e..f0b1c2a0 100644 --- a/Xcodes/Frontend/SignIn/PinCodeTextView.swift +++ b/Xcodes/Frontend/SignIn/PinCodeTextView.swift @@ -6,10 +6,12 @@ struct PinCodeTextField: NSViewRepresentable { @Binding var code: String let numberOfDigits: Int + let complete: (String) -> Void func makeNSView(context: Context) -> NSViewType { let view = PinCodeTextView(numberOfDigits: numberOfDigits, itemSpacing: 10) - view.codeDidChange = { c in code = c } + view.codeDidChange = { c in code = c } + view.codeDidComplete = { complete($0) } return view } @@ -29,8 +31,9 @@ struct PinCodeTextField_Previews: PreviewProvider { struct PreviewContainer: View { @State private var code = "1234567890" var body: some View { - PinCodeTextField(code: $code, numberOfDigits: 11) - .padding() + PinCodeTextField(code: $code, numberOfDigits: 11) { + print("Input is complete \($0)") + }.padding() } } @@ -52,10 +55,16 @@ class PinCodeTextView: NSControl, NSTextFieldDelegate { handler(String(code.compactMap { $0 })) } updateText() + + if code.compactMap({ $0 }).count == numberOfDigits, + let handler = codeDidComplete { + handler(String(code.compactMap { $0 })) + } } } var codeDidChange: ((String) -> Void)? = nil - + var codeDidComplete: ((String) -> Void)? = nil + private let numberOfDigits: Int private let stackView: NSStackView = .init(frame: .zero) private var characterViews: [PinCodeCharacterTextField] = [] diff --git a/Xcodes/Frontend/SignIn/SignIn2FAView.swift b/Xcodes/Frontend/SignIn/SignIn2FAView.swift index 2e336e4d..10950331 100644 --- a/Xcodes/Frontend/SignIn/SignIn2FAView.swift +++ b/Xcodes/Frontend/SignIn/SignIn2FAView.swift @@ -15,7 +15,9 @@ struct SignIn2FAView: View { HStack { Spacer() - PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) + PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) { + appState.submitSecurityCode(.device(code: $0), sessionData: sessionData) + } Spacer() } .padding() diff --git a/Xcodes/Frontend/SignIn/SignInSMSView.swift b/Xcodes/Frontend/SignIn/SignInSMSView.swift index 74d7af08..c8a04dba 100644 --- a/Xcodes/Frontend/SignIn/SignInSMSView.swift +++ b/Xcodes/Frontend/SignIn/SignInSMSView.swift @@ -15,7 +15,9 @@ struct SignInSMSView: View { HStack { Spacer() - PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) + PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) { + appState.submitSecurityCode(.sms(code: $0, phoneNumberId: trustedPhoneNumber.id), sessionData: sessionData) + } Spacer() } .padding()