1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | import UIKit
|
9 | import CYBAVOWallet
|
10 |
|
11 | @objc(NumericPinCodeInputView)
|
12 | class NumericPinCodeInputView: UIView {
|
13 | public static let styleAttr: StyleAttr = StyleAttr(
|
14 | fixedOrder: false,
|
15 | disabled: true,
|
16 | buttonWidth: 70,
|
17 | buttonHeight: 70,
|
18 | horizontalSpacing: 5,
|
19 | verticalSpacing: 7,
|
20 | buttonTextColor: UIColor.darkGray,
|
21 | buttonTextColorPressed: UIColor.lightGray,
|
22 | buttonTextColorDisabled: UIColor.red,
|
23 | buttonBackgroundColor: UIColor.lightGray,
|
24 | buttonBackgroundColorPressed: UIColor.darkGray,
|
25 | buttonBackgroundColorDisabled: UIColor.yellow,
|
26 | buttonBorderRadius: 33,
|
27 | buttonBorderWidth: 0,
|
28 | buttonBorderColor: UIColor.green,
|
29 | buttonBorderColorPressed: UIColor.blue,
|
30 | buttonBorderColorDisabled: UIColor.orange,
|
31 | backspaceButtonWidth: 70,
|
32 | backspaceButtonHeight: 70,
|
33 | backspaceButtonTextColor: UIColor.darkGray,
|
34 | backspaceButtonTextColorPressed: UIColor.lightGray,
|
35 | backspaceButtonTextColorDisabled: UIColor.yellow,
|
36 | backspaceButtonBackgroundColor: UIColor.lightGray,
|
37 | backspaceButtonBackgroundColorPressed: UIColor.darkGray,
|
38 | backspaceButtonBackgroundColorDisabled: UIColor.red,
|
39 | backspaceButtonBorderRadius: 33,
|
40 | backspaceButtonBorderWidth: 0,
|
41 | backspaceButtonBorderColor: UIColor.blue,
|
42 | backspaceButtonBorderColorPressed: UIColor.red,
|
43 | backspaceButtonBorderColorDisabled: UIColor.black)
|
44 |
|
45 | @objc var bridge: RCTBridge!
|
46 | @objc var disabled: Bool = false {
|
47 | didSet {
|
48 | NumericPinCodeInputView.styleAttr.disabled = disabled
|
49 | pinInputView.setDiabled(disabled: disabled)
|
50 | }
|
51 | }
|
52 | @objc var backspaceButtonText: String = "⌫" {
|
53 | didSet {
|
54 | NumericPinCodeInputView.styleAttr.backspaceButtonText = backspaceButtonText
|
55 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
56 | }
|
57 | }
|
58 | @objc var keepKey: Bool = false {
|
59 | didSet {
|
60 | pinInputView.setKeepKey(isKeep: keepKey)
|
61 | }
|
62 | }
|
63 | @objc var maxLength: NSInteger = 0 {
|
64 | didSet {
|
65 | pinInputView.setMaxLength(length: maxLength)
|
66 | }
|
67 | }
|
68 | @objc var fixedOrder: Bool = false {
|
69 | didSet {
|
70 | NumericPinCodeInputView.styleAttr.fixedOrder = fixedOrder
|
71 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
72 |
|
73 | }
|
74 | }
|
75 | @objc var hapticFeedback: Bool = false {
|
76 | didSet {
|
77 | pinInputView.setHapticFeedback(hapicFeedback: hapticFeedback)
|
78 | }
|
79 | }
|
80 | @objc var horizontalSpacing: NSInteger = 0 {
|
81 | didSet {
|
82 | NumericPinCodeInputView.styleAttr.horizontalSpacing = Int(horizontalSpacing)
|
83 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
84 | updateSize()
|
85 | }
|
86 | }
|
87 | @objc var verticalSpacing: NSInteger = 0 {
|
88 | didSet {
|
89 | NumericPinCodeInputView.styleAttr.verticalSpacing = Int(verticalSpacing)
|
90 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
91 | updateSize()
|
92 | }
|
93 | }
|
94 | @objc var buttonWidth: NSInteger = 70 {
|
95 | didSet {
|
96 | NumericPinCodeInputView.styleAttr.buttonWidth = buttonWidth
|
97 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
98 | updateSize()
|
99 | }
|
100 | }
|
101 | @objc var buttonHeight: NSInteger = 70 {
|
102 | didSet {
|
103 | NumericPinCodeInputView.styleAttr.buttonHeight = buttonHeight
|
104 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
105 | updateSize()
|
106 | }
|
107 | }
|
108 | @objc var buttonTextSize: CGFloat = 0 {
|
109 | didSet {
|
110 | NumericPinCodeInputView.styleAttr.buttonTextFont = UIFont.systemFont(ofSize: buttonTextSize * 35 / 12, weight: UIFont.Weight.thin)
|
111 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
112 | }
|
113 | }
|
114 | @objc var buttonTextColor: UIColor = UIColor.red {
|
115 | didSet {
|
116 | NumericPinCodeInputView.styleAttr.buttonTextColor = buttonTextColor
|
117 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
118 | }
|
119 | }
|
120 | @objc var buttonTextColorPressed: UIColor = UIColor.red {
|
121 | didSet {
|
122 | NumericPinCodeInputView.styleAttr.buttonTextColorPressed = buttonTextColorPressed
|
123 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
124 | }
|
125 | }
|
126 | @objc var buttonTextColorDisabled: UIColor = UIColor.red {
|
127 | didSet {
|
128 | NumericPinCodeInputView.styleAttr.buttonTextColorDisabled = buttonTextColorDisabled
|
129 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
130 | }
|
131 | }
|
132 | @objc var buttonBackgroundColor: UIColor = UIColor.red {
|
133 | didSet {
|
134 | NumericPinCodeInputView.styleAttr.buttonBackgroundColor = buttonBackgroundColor
|
135 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
136 | }
|
137 | }
|
138 | @objc var buttonBackgroundColorPressed: UIColor = UIColor.red {
|
139 | didSet {
|
140 | NumericPinCodeInputView.styleAttr.buttonBackgroundColorPressed = buttonBackgroundColorPressed
|
141 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
142 | }
|
143 | }
|
144 | @objc var buttonBackgroundColorDisabled: UIColor = UIColor.red {
|
145 | didSet {
|
146 | NumericPinCodeInputView.styleAttr.buttonBackgroundColorDisabled = buttonBackgroundColorDisabled
|
147 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
148 | }
|
149 | }
|
150 | @objc var buttonBorderRadius: CGFloat = 0 {
|
151 | didSet {
|
152 | NumericPinCodeInputView.styleAttr.buttonBorderRadius = buttonBorderRadius
|
153 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
154 | }
|
155 | }
|
156 | @objc var buttonBorderWidth: CGFloat = 0 {
|
157 | didSet {
|
158 | NumericPinCodeInputView.styleAttr.buttonBorderWidth = buttonBorderWidth
|
159 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
160 | }
|
161 | }
|
162 |
|
163 | @objc var buttonBorderColor: UIColor = UIColor.red {
|
164 | didSet {
|
165 | NumericPinCodeInputView.styleAttr.buttonBorderColor = buttonBorderColor
|
166 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr}
|
167 | }
|
168 | @objc var buttonBorderColorPressed: UIColor = UIColor.red {
|
169 | didSet {
|
170 | NumericPinCodeInputView.styleAttr.buttonBorderColorPressed = buttonBorderColorPressed
|
171 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
172 | }
|
173 | }
|
174 | @objc var buttonBorderColorDisabled: UIColor = UIColor.red {
|
175 | didSet {
|
176 | NumericPinCodeInputView.styleAttr.buttonBorderColorDisabled = buttonBorderColorDisabled
|
177 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
178 | }
|
179 | }
|
180 | @objc var androidButtonRippleColor: UIColor = UIColor.red {
|
181 | didSet {}
|
182 | }
|
183 |
|
184 | @objc var backspaceButtonWidth: NSInteger = 0 {
|
185 | didSet {
|
186 | NumericPinCodeInputView.styleAttr.backspaceButtonWidth = backspaceButtonWidth
|
187 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
188 | }
|
189 | }
|
190 | @objc var backspaceButtonHeight: NSInteger = 0 {
|
191 | didSet {
|
192 | NumericPinCodeInputView.styleAttr.backspaceButtonHeight = backspaceButtonHeight
|
193 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
194 | }
|
195 | }
|
196 | @objc var backspaceButtonTextSize: CGFloat = 0 {
|
197 | didSet {
|
198 | NumericPinCodeInputView.styleAttr.backspaceButtonTextFont = UIFont.systemFont(ofSize: backspaceButtonTextSize * 35 / 12, weight: UIFont.Weight.regular)
|
199 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
200 | }
|
201 | }
|
202 |
|
203 | @objc var backspaceButtonTextColor: UIColor = UIColor.red {
|
204 | didSet {
|
205 | NumericPinCodeInputView.styleAttr.backspaceButtonTextColor = backspaceButtonTextColor
|
206 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
207 | }
|
208 | }
|
209 | @objc var backspaceButtonTextColorPressed: UIColor = UIColor.red {
|
210 | didSet {
|
211 | NumericPinCodeInputView.styleAttr.backspaceButtonTextColorPressed = backspaceButtonTextColorPressed
|
212 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
213 | }
|
214 | }
|
215 | @objc var backspaceButtonTextColorDisabled: UIColor = UIColor.red {
|
216 | didSet {
|
217 | NumericPinCodeInputView.styleAttr.backspaceButtonTextColorDisabled = backspaceButtonTextColorDisabled
|
218 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr}
|
219 | }
|
220 | @objc var backspaceButtonBackgroundColor: UIColor = UIColor.red {
|
221 | didSet {
|
222 | NumericPinCodeInputView.styleAttr.backspaceButtonBackgroundColor = backspaceButtonBackgroundColor
|
223 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
224 | }
|
225 | }
|
226 |
|
227 | @objc var backspaceButtonBackgroundColorPressed: UIColor = UIColor.red {
|
228 | didSet {
|
229 | NumericPinCodeInputView.styleAttr.backspaceButtonBackgroundColorPressed = backspaceButtonBackgroundColorPressed
|
230 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
231 | }
|
232 | }
|
233 | @objc var backspaceButtonBackgroundColorDisabled: UIColor = UIColor.red {
|
234 | didSet {
|
235 | NumericPinCodeInputView.styleAttr.backspaceButtonBackgroundColorDisabled = backspaceButtonBackgroundColorDisabled
|
236 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr}
|
237 | }
|
238 | @objc var backspaceButtonBorderRadius: CGFloat = 0 {
|
239 | didSet {
|
240 | NumericPinCodeInputView.styleAttr.backspaceButtonBorderRadius = backspaceButtonBorderRadius
|
241 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
242 | }
|
243 | }
|
244 | @objc var backspaceButtonBorderWidth: CGFloat = 0 {
|
245 | didSet {
|
246 | NumericPinCodeInputView.styleAttr.backspaceButtonBorderWidth = backspaceButtonBorderWidth
|
247 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
248 | }
|
249 | }
|
250 | @objc var backspaceButtonBorderColor: UIColor = UIColor.red {
|
251 | didSet {
|
252 | NumericPinCodeInputView.styleAttr.backspaceButtonBorderColor = backspaceButtonBorderColor
|
253 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
254 | }
|
255 | }
|
256 | @objc var backspaceButtonBorderColorPressed: UIColor = UIColor.red {
|
257 | didSet {
|
258 | NumericPinCodeInputView.styleAttr.backspaceButtonBorderColorPressed = backspaceButtonBorderColorPressed
|
259 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
|
260 | }
|
261 | }
|
262 | @objc var backspaceButtonBorderColorDisabled: UIColor = UIColor.red {
|
263 | didSet {
|
264 | NumericPinCodeInputView.styleAttr.backspaceButtonBorderColorDisabled = backspaceButtonBorderColorDisabled
|
265 | pinInputView.styleAttr = NumericPinCodeInputView.styleAttr}
|
266 | }
|
267 | @objc var androidBackspaceButtonRippleColor: UIColor = UIColor.red {
|
268 | didSet {}
|
269 | }
|
270 | @objc var onChanged: RCTDirectEventBlock?
|
271 | @objc var onSubmit: RCTDirectEventBlock?
|
272 | @objc var onSubmitPlain: RCTDirectEventBlock?
|
273 | @objc var onStrengthLevel: RCTDirectEventBlock?
|
274 | @objc var onSamePin: RCTDirectEventBlock?
|
275 |
|
276 | public func clear(){
|
277 | pinInputView.clear()
|
278 | }
|
279 | public func submitPlain(requestId: Int){
|
280 | let text = self.pinInputView.submitPlain()
|
281 | if let callback = self.onSubmitPlain{
|
282 | let dict:[String:Any] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.PLAIN_TEXT: text]
|
283 | callback(dict)
|
284 | }
|
285 | }
|
286 | public func submitForMultiple(requestId: Int){
|
287 | let pinSecret = self.pinInputView.submitForMultiple()
|
288 | if let callback = self.onSubmit{
|
289 | let key = PinSecretBridge.put(pinSecret: pinSecret)
|
290 | let dict:[String:Int] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.PIN_SECRET_KEY: key]
|
291 | callback(dict)
|
292 | }
|
293 | }
|
294 | public func submit(requestId: Int){
|
295 | let pinSecret = self.pinInputView.submit()
|
296 | if let callback = self.onSubmit{
|
297 | let key = PinSecretBridge.put(pinSecret: pinSecret)
|
298 | let dict:[String:Int] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.PIN_SECRET_KEY: key]
|
299 | callback(dict)
|
300 | }
|
301 | }
|
302 | public func getStrengthLevel(requestId: Int, checkLength: Int){
|
303 | let level = self.pinInputView.getStrengthLevel(checkLength: checkLength)
|
304 | if let callback = self.onStrengthLevel{
|
305 | let dict: [String: Any] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.LEVEL: level]
|
306 | callback(dict)
|
307 | }
|
308 | }
|
309 | public func isSamePin(requestId: Int, pinSecret1: NSDictionary, pinSecret2: NSDictionary){
|
310 | guard let pinSecretD1 = PinSecretBridge.fromDictionary(dict: pinSecret1) else{
|
311 | if let callback = self.onSamePin{
|
312 | let dict:[String:Any] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.IS_SAME: false]
|
313 | callback(dict)
|
314 | }
|
315 | return
|
316 | }
|
317 | guard let pinSecretD2 = PinSecretBridge.fromDictionary(dict: pinSecret2) else{
|
318 | if let callback = self.onSamePin{
|
319 | let dict:[String:Any] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.IS_SAME: false]
|
320 | callback(dict)
|
321 | }
|
322 | return
|
323 | }
|
324 | let isSame = self.pinInputView.isSamePin(pinSecret1: pinSecretD1, pinSecret2: pinSecretD2)
|
325 | if let callback = self.onSamePin{
|
326 | let dict:[String:Any] = [PinSecretBridge.REQUEST_ID: requestId, PinSecretBridge.IS_SAME: isSame]
|
327 | callback(dict)
|
328 | }
|
329 | }
|
330 | public var pinInputView: CYBAVOWallet.NumericPinCodeInputView = {
|
331 | let pinInputView = CYBAVOWallet.NumericPinCodeInputView()
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 |
|
341 |
|
342 | return pinInputView
|
343 | }()
|
344 | override init(frame: CGRect) {
|
345 | super.init(frame: frame)
|
346 | self.frame=frame
|
347 | pinInputView.setOnPinInputListener(delegate: self)
|
348 | addSubview(pinInputView)
|
349 |
|
350 | }
|
351 | required init?(coder aDecoder: NSCoder) {
|
352 | super.init(coder: aDecoder)
|
353 | }
|
354 | public override func layoutSubviews() {
|
355 | updateSize()
|
356 | }
|
357 | private func updateSize() {
|
358 | let width = NumericPinCodeInputView.styleAttr.buttonWidth * 3 + NumericPinCodeInputView.styleAttr.horizontalSpacing * 2
|
359 | let height = NumericPinCodeInputView.styleAttr.buttonHeight * 4 + NumericPinCodeInputView.styleAttr.verticalSpacing * 4
|
360 | pinInputView.frame = CGRect(x: 0,
|
361 | y: 0,
|
362 | width: width,
|
363 | height: height)
|
364 | bounds = pinInputView.bounds
|
365 | bridge.uiManager.setSize(CGSize(width: width, height: height), for: self)
|
366 | }
|
367 | }
|
368 |
|
369 | extension NumericPinCodeInputView: OnPinInputListener {
|
370 | func onChanged(length: Int) {
|
371 | if let callback = onChanged{
|
372 | let dict:[String:Int] = ["length": length]
|
373 | callback(dict)
|
374 | }
|
375 | }
|
376 | }
|