UNPKG

15.7 kBPlain TextView Raw
1//
2// NumericPinCodeView.swift
3// Pods
4//
5// Created by evahsu on 2019/10/17.
6//
7
8import UIKit
9import CYBAVOWallet
10
11@objc(NumericPinCodeInputView)
12class 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// let lightGray = UIColor(red: 227.0/255.0, green: 227.0/255.0, blue: 227.0/255.0, alpha: 1.0)
334// let darkGray = UIColor(red: 59.0/255.0, green: 59.0/255.0, blue: 58.0/255.0, alpha: 1.0)
335// NumericPinCodeInputView.styleAttr.circleBackgroundColor = lightGray
336// NumericPinCodeInputView.styleAttr.tappedTextColor = lightGray
337// NumericPinCodeInputView.styleAttr.indicatorFillColor = lightGray
338// NumericPinCodeInputView.styleAttr.textColor = darkGray
339// NumericPinCodeInputView.styleAttr.tappedColor = darkGray
340// NumericPinCodeInputView.styleAttr.indicatorStrokeColor = darkGray
341// pinInputView.styleAttr = NumericPinCodeInputView.styleAttr
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
369extension 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}