@@ -23,6 +23,7 @@ public class TextField: SkyflowElement, Element, BaseElement {
2323 internal var stackView = UIStackView ( )
2424 internal var textFieldLabel = PaddingLabel ( frame: . zero)
2525 internal var hasBecomeResponder : Bool = false
26+ internal var copyIconImageView : UIImageView ?
2627
2728 internal var textFieldDelegate : UITextFieldDelegate ? = nil
2829
@@ -266,6 +267,12 @@ public class TextField: SkyflowElement, Element, BaseElement {
266267 containerView. addSubview ( imageView)
267268 textField. leftView = containerView
268269 }
270+ if self . options. enableCopy {
271+ textField. rightViewMode = UITextField . ViewMode. always
272+ textField. rightView = addCopyIcon ( )
273+ textField. rightView? . isHidden = true
274+ }
275+
269276
270277 if self . fieldType == . CARD_NUMBER {
271278 let t = self . textField. secureText!. replacingOccurrences ( of: " - " , with: " " ) . replacingOccurrences ( of: " " , with: " " )
@@ -277,6 +284,60 @@ public class TextField: SkyflowElement, Element, BaseElement {
277284
278285 }
279286
287+ private func addCopyIcon( ) -> UIView {
288+ copyIconImageView = UIImageView ( frame: CGRect ( x: 0 , y: 0 , width: 24 , height: 24 ) )
289+ #if SWIFT_PACKAGE
290+ let image = UIImage ( named: " Copy-Icon " , in: Bundle . module, compatibleWith: nil )
291+ #else
292+ let frameworkBundle = Bundle ( for: TextField . self)
293+ var bundleURL = frameworkBundle. resourceURL
294+ bundleURL!. appendPathComponent ( " Skyflow.bundle " )
295+ let resourceBundle = Bundle ( url: bundleURL!)
296+ var image = UIImage ( named: " Copy-Icon " , in: resourceBundle, compatibleWith: nil )
297+ #endif
298+ copyIconImageView? . image = image
299+ copyIconImageView? . contentMode = . scaleAspectFit
300+ let containerView = UIView ( frame: CGRect ( x: 0 , y: 0 , width: 24 , height: 24 ) )
301+ containerView. addSubview ( copyIconImageView!)
302+ let tapGesture = UITapGestureRecognizer ( target: self , action: #selector( copyIconTapped ( _: ) ) )
303+ containerView. isUserInteractionEnabled = true
304+ containerView. addGestureRecognizer ( tapGesture)
305+ return containerView
306+ }
307+ @objc private func copyIconTapped( _ sender: UITapGestureRecognizer ) {
308+ // Copy text when the copy icon is tapped
309+ copy ( sender)
310+ }
311+ @objc
312+ public override func copy( _ sender: Any ? ) {
313+ let pasteboard = UIPasteboard . general
314+ pasteboard. string = actualValue
315+ #if SWIFT_PACKAGE
316+ let image = UIImage ( named: " Success-Icon " , in: Bundle . module, compatibleWith: nil )
317+ #else
318+ let frameworkBundle = Bundle ( for: TextField . self)
319+ var bundleURL = frameworkBundle. resourceURL
320+ bundleURL!. appendPathComponent ( " Skyflow.bundle " )
321+ let resourceBundle = Bundle ( url: bundleURL!)
322+ var image = UIImage ( named: " Success-Icon " , in: resourceBundle, compatibleWith: nil )
323+ #endif
324+ copyIconImageView? . image = image
325+
326+ // Reset the copy icon after a delay
327+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 1.0 ) { [ weak self] in
328+ #if SWIFT_PACKAGE
329+ let copyImage = UIImage ( named: " Copy-Icon " , in: Bundle . module, compatibleWith: nil )
330+ #else
331+ let frameworkBundle = Bundle ( for: TextField . self)
332+ var bundleURL = frameworkBundle. resourceURL
333+ bundleURL!. appendPathComponent ( " Skyflow.bundle " )
334+ let resourceBundle = Bundle ( url: bundleURL!)
335+ var copyImage = UIImage ( named: " Copy-Icon " , in: resourceBundle, compatibleWith: nil )
336+ #endif
337+ self ? . copyIconImageView? . image = copyImage
338+ }
339+
340+ }
280341 internal func updateImage( name: String ) {
281342
282343 if self . options. enableCardIcon == false {
@@ -303,7 +364,6 @@ public class TextField: SkyflowElement, Element, BaseElement {
303364 imageView. layer. cornerRadius = self . collectInput!. iconStyles. base? . cornerRadius ?? 0
304365 textField. leftViewMode = . always
305366 textField. leftView = containerView
306-
307367 }
308368
309369 override func validate( ) -> SkyflowValidationError {
@@ -415,6 +475,15 @@ extension TextField {
415475 updateImage ( name: card. imageName)
416476 }
417477 setFormatPattern ( )
478+
479+ if self . options. enableCopy && ( self . state. getState ( ) [ " isValid " ] as! Bool && !self . actualValue. isEmpty) {
480+ self . textField. rightViewMode = . always
481+ self . textField. rightView? . isHidden = false
482+ } else if self . options. enableCopy {
483+ self . textField. rightViewMode = . always
484+ self . textField. rightView? . isHidden = true
485+ }
486+
418487 }
419488
420489 func updateActualValue( ) {
0 commit comments