Skip to content

Commit 3ebe84e

Browse files
feat: move rqdata to HCaptchaVerifyParams and deprecate in HCaptchaConfig
1 parent 037c00e commit 3ebe84e

File tree

10 files changed

+149
-96
lines changed

10 files changed

+149
-96
lines changed

Example/HCaptcha_Tests/Core/HCaptchaVerifyParams__Tests.swift

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,52 +63,71 @@ class HCaptchaVerifyParams__Tests: XCTestCase {
6363
XCTAssertTrue(params.resetOnError)
6464
}
6565

66-
func test__init__withResetOnError() {
66+
func test__init__withRqdata() {
6767
// Given
68-
let phonePrefix = "44"
69-
let resetOnError = false
68+
let rqdata = "test-rqdata-string"
7069

7170
// When
72-
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, resetOnError: resetOnError)
71+
let params = HCaptchaVerifyParams(rqdata: rqdata)
7372

7473
// Then
75-
XCTAssertEqual(params.phonePrefix, phonePrefix)
74+
XCTAssertNil(params.phonePrefix)
7675
XCTAssertNil(params.phoneNumber)
77-
XCTAssertFalse(params.resetOnError)
76+
XCTAssertEqual(params.rqdata, rqdata)
77+
XCTAssertTrue(params.resetOnError)
7878
}
7979

8080
func test__init__withAllValues() {
8181
// Given
8282
let phonePrefix = "44"
8383
let phoneNumber = "1234567890"
84+
let rqdata = "test-rqdata-string"
8485
let resetOnError = false
8586

8687
// When
87-
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, resetOnError: resetOnError)
88+
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, rqdata: rqdata, resetOnError: resetOnError)
8889

8990
// Then
9091
XCTAssertEqual(params.phonePrefix, phonePrefix)
9192
XCTAssertEqual(params.phoneNumber, phoneNumber)
93+
XCTAssertEqual(params.rqdata, rqdata)
94+
XCTAssertFalse(params.resetOnError)
95+
}
96+
97+
func test__init__withResetOnError() {
98+
// Given
99+
let phonePrefix = "44"
100+
let resetOnError = false
101+
102+
// When
103+
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, resetOnError: resetOnError)
104+
105+
// Then
106+
XCTAssertEqual(params.phonePrefix, phonePrefix)
107+
XCTAssertNil(params.phoneNumber)
92108
XCTAssertFalse(params.resetOnError)
93109
}
94110

111+
95112
// MARK: - toDictionary Tests
96113

97114
func test__toDictionary__withAllValues() {
98115
// Given
99116
let phonePrefix = "44"
100117
let phoneNumber = "1234567890"
118+
let rqdata = "test-rqdata"
101119
let resetOnError = false
102-
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, resetOnError: resetOnError)
120+
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, rqdata: rqdata, resetOnError: resetOnError)
103121

104122
// When
105123
let dict = params.toDictionary()
106124

107125
// Then
108126
XCTAssertEqual(dict["phonePrefix"] as? String, phonePrefix)
109127
XCTAssertEqual(dict["phoneNumber"] as? String, phoneNumber)
128+
XCTAssertEqual(dict["rqdata"] as? String, rqdata)
110129
XCTAssertEqual(dict["resetOnError"] as? Bool, resetOnError)
111-
XCTAssertEqual(dict.count, 3)
130+
XCTAssertEqual(dict.count, 4)
112131
}
113132

114133
func test__toDictionary__withPartialValues() {
@@ -156,14 +175,32 @@ class HCaptchaVerifyParams__Tests: XCTestCase {
156175
XCTAssertEqual(dict.count, 2)
157176
}
158177

178+
func test__toDictionary__withOnlyRqdata() {
179+
// Given
180+
let rqdata = "test-rqdata-string"
181+
let resetOnError = false
182+
let params = HCaptchaVerifyParams(rqdata: rqdata, resetOnError: resetOnError)
183+
184+
// When
185+
let dict = params.toDictionary()
186+
187+
// Then
188+
XCTAssertNil(dict["phonePrefix"])
189+
XCTAssertNil(dict["phoneNumber"])
190+
XCTAssertEqual(dict["rqdata"] as? String, rqdata)
191+
XCTAssertEqual(dict["resetOnError"] as? Bool, resetOnError)
192+
XCTAssertEqual(dict.count, 2)
193+
}
194+
159195
// MARK: - toJSONString Tests
160196

161197
func test__toJSONString__validJSON() {
162198
// Given
163199
let phonePrefix = "44"
164200
let phoneNumber = "1234567890"
201+
let rqdata = "test-rqdata"
165202
let resetOnError = false
166-
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, resetOnError: resetOnError)
203+
let params = HCaptchaVerifyParams(phonePrefix: phonePrefix, phoneNumber: phoneNumber, rqdata: rqdata, resetOnError: resetOnError)
167204

168205
// When
169206
let jsonString = params.toJSONString()
@@ -176,6 +213,7 @@ class HCaptchaVerifyParams__Tests: XCTestCase {
176213
let json = try! JSONSerialization.jsonObject(with: data) as! [String: Any]
177214
XCTAssertEqual(json["phonePrefix"] as? String, phonePrefix)
178215
XCTAssertEqual(json["phoneNumber"] as? String, phoneNumber)
216+
XCTAssertEqual(json["rqdata"] as? String, rqdata)
179217
XCTAssertEqual(json["resetOnError"] as? Bool, resetOnError)
180218
}
181219

Example/HCaptcha_Tests/Core/HCaptchaWebViewManager__Tests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,22 @@ class HCaptchaWebViewManager__Tests: XCTestCase {
787787
XCTAssertTrue(rawValue.hasSuffix(");"))
788788
}
789789

790+
func test__JSCommand_execute__withRqdata() {
791+
// Given
792+
let rqdata = "test-rqdata-string"
793+
let verifyParams = HCaptchaVerifyParams(rqdata: rqdata, resetOnError: false)
794+
let command = HCaptchaWebViewManager.JSCommand.execute(verifyParams)
795+
796+
// When
797+
let rawValue = command.rawValue
798+
799+
// Then
800+
XCTAssertTrue(rawValue.contains("execute("))
801+
XCTAssertTrue(rawValue.contains("\"rqdata\":\"test-rqdata-string\""))
802+
XCTAssertTrue(rawValue.contains("\"resetOnError\":false"))
803+
XCTAssertTrue(rawValue.hasSuffix(");"))
804+
}
805+
790806
func test__JSCommand_reset() {
791807
// Given
792808
let command = HCaptchaWebViewManager.JSCommand.reset

Example/HCaptcha_Tests/Core/HCaptcha__Tests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,24 @@ class HCaptcha__Tests: XCTestCase {
214214
wait(for: [exp], timeout: TestTimeouts.standard)
215215
}
216216

217+
func test__validate__withVerifyParams__rqdata() {
218+
// Given
219+
let exp = expectation(description: "validate with rqdata")
220+
let rqdata = "test-rqdata-string"
221+
let verifyParams = HCaptchaVerifyParams(rqdata: rqdata)
222+
let hcaptcha = HCaptcha(manager: HCaptchaWebViewManager(messageBody: "{token: \"test_token\"}"))
223+
224+
// When
225+
let view = UIApplication.shared.windows.first?.rootViewController?.view
226+
hcaptcha.validate(on: view, verifyParams: verifyParams) { result in
227+
// Then
228+
XCTAssertEqual(result.token, "test_token")
229+
exp.fulfill()
230+
}
231+
232+
wait(for: [exp], timeout: TestTimeouts.standard)
233+
}
234+
217235
func test__validate__withVerifyParams__resetOnErrorFalse() {
218236
// Given
219237
let exp = expectation(description: "validate with resetOnError false")

Example/RxSwift-Example/ViewController.swift

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ import WebKit
1515
class ViewController: BaseViewController {
1616
var disposeBag = DisposeBag()
1717

18-
// Phone input UI elements - connected from storyboard
19-
@IBOutlet weak var phoneTextField: UITextField!
20-
@IBOutlet weak var phoneModeSwitch: UISwitch!
21-
@IBOutlet weak var phoneModeLabel: UILabel!
22-
2318
@IBAction private func didPressVerifyButton(button: UIButton) {
2419
disposeBag = DisposeBag()
2520

@@ -34,7 +29,7 @@ class ViewController: BaseViewController {
3429
let verifyParams: HCaptchaVerifyParams
3530
if phoneModeSwitch.isOn {
3631
// Phone number mode
37-
verifyParams = HCaptchaVerifyParams(phoneNumber: phoneText)
32+
verifyParams = HCaptchaVerifyParams(phoneNumber: phoneText, rqdata: "some_rq")
3833
} else {
3934
// Phone prefix mode
4035
verifyParams = HCaptchaVerifyParams(phonePrefix: phoneText)
@@ -94,29 +89,6 @@ class ViewController: BaseViewController {
9489
.disposed(by: disposeBag)
9590
}
9691

97-
override func viewDidLoad() {
98-
super.viewDidLoad()
99-
setupPhoneInputUI()
100-
}
101-
102-
private func setupPhoneInputUI() {
103-
// Configure initial state
104-
phoneModeLabel.text = "Prefix"
105-
phoneTextField.placeholder = "Enter phone prefix (e.g., 44)"
106-
phoneTextField.keyboardType = .numberPad
107-
}
108-
109-
@IBAction private func phoneModeChanged(_ sender: UISwitch) {
110-
if phoneModeSwitch.isOn {
111-
phoneModeLabel.text = "Phone"
112-
phoneTextField.placeholder = "Enter phone number (e.g., +1234567890)"
113-
phoneTextField.keyboardType = .phonePad
114-
} else {
115-
phoneModeLabel.text = "Prefix"
116-
phoneTextField.placeholder = "Enter phone prefix (e.g., 44)"
117-
phoneTextField.keyboardType = .numberPad
118-
}
119-
}
12092

12193
override func setupHCaptcha() {
12294
// swiftlint:disable:next force_try

Example/Shared/BaseViewController.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,52 @@ class BaseViewController: UIViewController {
2020
@IBOutlet weak var localeSegmentedControl: UISegmentedControl!
2121
@IBOutlet weak var validateButton: UIButton!
2222
@IBOutlet weak var resetButton: UIButton!
23+
24+
// Phone input UI elements - connected from storyboard
25+
@IBOutlet weak var phoneTextField: UITextField!
26+
@IBOutlet weak var phoneModeSwitch: UISwitch!
27+
@IBOutlet weak var phoneModeLabel: UILabel!
2328

2429
var hcaptcha: HCaptcha!
2530
var locale: Locale?
2631

2732
override func viewDidLoad() {
2833
super.viewDidLoad()
34+
setupPhoneInputUI()
35+
setupToolbar()
2936
if !Bundle.main.bundlePath.contains("Tests") {
3037
setupHCaptcha()
3138
}
3239
}
40+
41+
private func setupToolbar() {
42+
let toolbar = UIToolbar()
43+
toolbar.sizeToFit()
44+
let done = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneTapped))
45+
toolbar.items = [done]
46+
phoneTextField.inputAccessoryView = toolbar
47+
}
48+
49+
@objc private func doneTapped() {
50+
phoneTextField.resignFirstResponder()
51+
}
52+
53+
private func setupPhoneInputUI() {
54+
phoneModeSwitch.isOn = false
55+
phoneModeChanged(phoneModeSwitch)
56+
}
57+
58+
@IBAction func phoneModeChanged(_ sender: UISwitch) {
59+
if sender.isOn {
60+
phoneModeLabel.text = "Number"
61+
phoneTextField.placeholder = "Enter phone number (e.g., +1234567890)"
62+
phoneTextField.keyboardType = .phonePad
63+
} else {
64+
phoneModeLabel.text = "Prefix"
65+
phoneTextField.placeholder = "Enter prefix (e.g., 44)"
66+
phoneTextField.keyboardType = .numberPad
67+
}
68+
}
3369

3470
@IBAction func didPressLocaleSegmentedControl(_ sender: UISegmentedControl) {
3571
label.text = ""

Example/UIKit-Example/ViewController.swift

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@ import WebKit
1212
class ViewController: BaseViewController {
1313
private var challengeShown: Bool = false
1414

15-
// Phone input UI elements - connected from storyboard
16-
@IBOutlet weak var phoneTextField: UITextField!
17-
@IBOutlet weak var phoneModeSwitch: UISwitch!
18-
@IBOutlet weak var phoneModeLabel: UILabel!
19-
2015
@IBAction private func didPressVerifyButton(button: UIButton) {
2116
// Check if we should use verify params
2217
if let phoneText = phoneTextField.text, !phoneText.isEmpty {
@@ -53,29 +48,6 @@ class ViewController: BaseViewController {
5348
self.challengeShown = false
5449
}
5550

56-
override func viewDidLoad() {
57-
super.viewDidLoad()
58-
setupPhoneInputUI()
59-
}
60-
61-
private func setupPhoneInputUI() {
62-
// Configure initial state
63-
phoneModeLabel.text = "Prefix"
64-
phoneTextField.placeholder = "Enter prefix (e.g., 44)"
65-
phoneTextField.keyboardType = .numberPad
66-
}
67-
68-
@IBAction private func phoneModeChanged(_ sender: UISwitch) {
69-
if phoneModeSwitch.isOn {
70-
phoneModeLabel.text = "Phone"
71-
phoneTextField.placeholder = "Enter phone (e.g., +1234567890)"
72-
phoneTextField.keyboardType = .phonePad
73-
} else {
74-
phoneModeLabel.text = "Prefix"
75-
phoneTextField.placeholder = "Enter prefix (e.g., 44)"
76-
phoneTextField.keyboardType = .numberPad
77-
}
78-
}
7951

8052
override func setupHCaptcha() {
8153
// swiftlint:disable:next force_try

HCaptcha/Assets/hcaptcha.html

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,22 @@
4242
window.webkit.messageHandlers.hcaptcha.postMessage(value);
4343
};
4444

45-
var getExecuteOpts = function() {
46-
var opts;
47-
var rqdata = "${rqdata}";
48-
if (rqdata) {
49-
opts = {'rqdata': rqdata};
50-
}
51-
return opts;
52-
};
53-
5445
console.log = function(message) {
5546
post({ log: message });
5647
};
5748

5849
var setVerifyParams = function(params) {
50+
console.log("setting verify params:", params);
5951
try {
60-
console.log("setting verify params:", params);
61-
6252
var phone = params.phoneNumber || params.mfa_phone;
6353
var prefix = params.phonePrefix || params.mfa_phoneprefix;
54+
var rqdata = params.rqdata || "${rqdata}";
6455

65-
if (phone || prefix) {
56+
if (phone || prefix || rqdata) {
6657
var data = {};
6758
if (phone) data.mfa_phone = phone;
6859
if (prefix) data.mfa_phoneprefix = prefix;
60+
if (rqdata) data.rqdata = rqdata;
6961

7062
if (window.hCaptchaID) {
7163
hcaptcha.setData(window.hCaptchaID, data);
@@ -87,7 +79,7 @@
8779
}
8880

8981
if ("${size}" === 'invisible') {
90-
hcaptcha.execute(getExecuteOpts());
82+
hcaptcha.execute();
9183
} else {
9284
post({ action: "showHCaptcha" });
9385
}

HCaptcha/Classes/HCaptchaConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ struct HCaptchaConfig: CustomDebugStringConvertible {
101101
let jsSrc: URL
102102

103103
/// Custom supplied challenge data
104+
/// - warning: Deprecated. Use `rqdata` in `HCaptchaVerifyParams` instead.
105+
@available(*, deprecated, message: "Use rqdata in HCaptchaVerifyParams instead")
104106
let rqdata: String?
105107

106108
/// Enable / Disable sentry error reporting.

0 commit comments

Comments
 (0)